转载请标明出处: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!
最后,自己还有个疑问,我是在tabbar发送的 tabCloseRequested(int) 信号,但是这个信号应该是tabwidget的,为啥没报错呢!求路过的大牛解答!
附件地址:http://download.csdn.net/detail/u010136741/8378829