天天看點

PYQT 實作TabWidget 輕按兩下關閉功能 (附源碼)

轉載請标明出處:http://blog.csdn.net/u010136741/article/details/42915201 , 本文出自:【木木--MAIKA】

tabwidget輕按兩下關閉功能,類似360浏覽器。由于工作需要,顯示到網上搜尋了相關文章,提示重寫doubleclick事件,然後發送tabCloseRequested(int) 信号

是以,馬上自定義Qtabwidget類,重寫mouseDoubleClickEvent方法,發現點選上面的tab沒反應,點選下面的視窗反而有反應,嘗試失敗。

看會PYQT4手冊,發現Qtabwidget有一個setTabBar方法,是以想,應該是重寫tabbar的mouseDoubleClickEvent方法,測試成功。

上代碼,再解釋

#coding:utf-8

import sys

from PyQt4.QtGui import *
from PyQt4.QtCore import *

class KUnit:
    #調試類
    @staticmethod
    def run(name,C):
    
        if name == "__main__":
            import sys
            app = QApplication(sys.argv)
            
            obj = C()
            obj.show()
            sys.exit(app.exec_())
            
class KTabBar(QTabBar):
    
    #自定義tabbar,實作輕按兩下關閉
    def __init__(self,parent = None):
        QTabBar.__init__(self,parent)
        
    def mouseDoubleClickEvent(self, event):
        
        #擷取點選的tab
        tabId = self.tabAt(event.pos())
        #發送關閉信号和tabid
        self.emit(SIGNAL("tabCloseRequested(int)"),self.tabAt(event.pos()))
        
        QTabBar.mouseDoubleClickEvent(self, event)

class MyDialog(QDialog):
    
    def __init__(self,parent = None):
        QDialog.__init__(self,parent)
        
        layout = QVBoxLayout(self)
        self.setFixedSize(QSize(500,500))
        self.tabwidget = QTabWidget()
        layout.addWidget(self.tabwidget)
        
        
        #設定tabwidget的bar
        self.tabwidget.setTabBar(KTabBar())
        #允許tab點選關閉
        self.tabwidget.setTabsClosable(True)
        
        self.tabwidget.addTab(QDialog(),"tab1")
        self.tabwidget.addTab(QDialog(),"tab2")
        self.tabwidget.addTab(QDialog(),"tab3")
        self.tabwidget.addTab(QDialog(),"tab4")
        self.tabwidget.addTab(QDialog(),"tab5")
        #連接配接信号槽
        self.connect(self.tabwidget, SIGNAL("tabCloseRequested(int)"),self.closeTab)
        
        
    def closeTab(self,tabId):
        #關閉置頂信号槽
        self.tabwidget.removeTab(tabId)
        
KUnit.run(__name__,MyDialog)


           

上面的代碼有3個類:

KUnit,調試用的

KTabBar,重寫QTabBar控件

MyDialog,測試視窗

KUnit 不需要多解釋了,

KTabBar 主要是重寫 mouseDoubleClickEvent方法,重點是(擷取到輕按兩下的tab)和(發送關閉信号)。通過tabAt(event.pos())擷取輕按兩下的tab 的索引,tabAt方法也是查詢手冊發現的。然後就發送關閉信号。

MyDialog 類先布局,然後設定tabwidget的tabbar(setTabBar),然後開啟點選關閉的功能(setTabsClosable),添加測試視窗,最後綁定信号槽,然後用自定義的closeTab方法接受傳過來的tabId,最後調用 removeTab 方法關閉tab!

PYQT 實作TabWidget 輕按兩下關閉功能 (附源碼)

最後,自己還有個疑問,我是在tabbar發送的 tabCloseRequested(int) 信号,但是這個信号應該是tabwidget的,為啥沒報錯呢!求路過的大牛解答!

附件位址:http://download.csdn.net/detail/u010136741/8378829