轉載請标明出處: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!
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiclRnblN0LclHdpZXYyd2LcBzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX90TUNBzYq5keFRUT4FEVkZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DMwgDOwADNxEDMyEDM1EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
最後,自己還有個疑問,我是在tabbar發送的 tabCloseRequested(int) 信号,但是這個信号應該是tabwidget的,為啥沒報錯呢!求路過的大牛解答!
附件位址:http://download.csdn.net/detail/u010136741/8378829