现在的位置: 首页 > 综合 > 正文

PYQT 实现TabWidget 双击关闭功能 (附源码)

2018年06月09日 ⁄ 综合 ⁄ 共 1974字 ⁄ 字号 评论关闭

转载请标明出处: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

望看官多多发言!!!


抱歉!评论已关闭.