转载请标明出处:http://blog.youkuaiyun.com/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.youkuaiyun.com/detail/u010136741/8378829