PYQT 实现TabWidget 双击关闭功能

转载:http://blog.csdn.net/u010136741/article/details/42915201 , 本文出自:【木木--MAIKA】

 

 

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值