如何在这个程序(pyqt)中捕获关闭,最小化和其他事件?

时间:2009-12-11 11:08:22

标签: python pyqt

海友,

这里的问题是我想捕捉QTabWidget的最小化和关闭事件(默认情况下这个小部件没有任何名为close或minimize的插槽)来隐藏小部件..所以用户退出应用程序的唯一方法是单击托盘图标菜单中的退出..

from PyQt4 import QtCore, QtGui
import sys

class Ui_TabWidget(object):
    def setupUi(self, TabWidget):
        TabWidget.setObjectName("TabWidget")
        TabWidget.resize(400, 300)
        self.tab = QtGui.QWidget()
        self.tab.setObjectName("tab")
        TabWidget.addTab(self.tab, "")
        self.tab1 = QtGui.QWidget()
        self.tab1.setObjectName("tab1")
        TabWidget.addTab(self.tab1, "")

        self.retranslateUi(TabWidget)
        QtCore.QMetaObject.connectSlotsByName(TabWidget)

    def retranslateUi(self, TabWidget):
        TabWidget.setWindowTitle(QtGui.QApplication.translate("TabWidget", "TabWidget", None, QtGui.QApplication.UnicodeUTF8))
        TabWidget.setTabText(TabWidget.indexOf(self.tab), QtGui.QApplication.translate("TabWidget", "Tab 1", None, QtGui.QApplication.UnicodeUTF8))
        TabWidget.setTabText(TabWidget.indexOf(self.tab1), QtGui.QApplication.translate("TabWidget", "Tab 2", None, QtGui.QApplication.UnicodeUTF8))

class Trayicon(QtGui.QSystemTrayIcon):
    def __init__(self,parent=None):
        QtGui.QSystemTrayIcon.__init__(self,parent)
        self.setIcon(QtGui.QIcon("icons/blockattack32.xpm"))
        self.show()

        self.menu=QtGui.QMenu()

        preference=self.menu.addAction("Preferences")
        exit=self.menu.addAction("Exit")

        self.setContextMenu(self.menu)

        self.TabWidget = QtGui.QTabWidget()
        ui = Ui_TabWidget()
        ui.setupUi(self.TabWidget)

        self.connect(exit,QtCore.SIGNAL('triggered()'),self.menuExit)

        self.connect(preference,QtCore.SIGNAL('triggered()'),self.showWidget)


    def menuExit(self):
        app.exit()

    def showWidget(self):
        self.TabWidget.show()

app = QtGui.QApplication(sys.argv)
cd=Trayicon()
cd.show()
sys.exit(app.exec_())

非常感谢您的帮助!!!!!如果可能的话,你能告诉我任何在Qt中教我二级编程的教程吗?

2 个答案:

答案 0 :(得分:2)

我不确定你想要达到什么目标。

是否要使用该类的某些公共方法隐藏选项卡小部件?如果是这样,你可以简单地调用close()方法。

如果您的要求是您不希望在应用程序运行时关闭选项卡小部件,则以下内容适用---

你写道: “这里的问题是我想捕捉QTabWidget的最小化和关闭事件(默认情况下,这个小部件没有任何名为close或minimize的插槽)来隐藏小部件 .. “

QTabWidget继承QWidget,QWidget实现'close()'。

因此,在继承QTabWidget的类中,您可以重新实现方法“closeEvent()”来捕获close事件

在您的代码中,您可以尝试:

class MyTabWidget(QtGui.QtabWidget):
    def closeEvent(self):
        # Let the Exit button handle tab closing
        print "close event captured. Do nothing."

        # Alternatively, if you want to EXIT the application when the close event  
        #occurs,  you can implement that code  here!


# In the TrayIcon class

self.TabWidget = MyTabWidget() 

上面的代码将确保仅在单击系统托盘中的退出按钮时关闭窗口小部件(并且选项卡窗口小部件的“X”按钮不会关闭/隐藏该窗口小部件。)

答案 1 :(得分:1)

您可以实施自己的事件过滤器。

class custom(QWidget):
    def __init__(self):
        super(custom, self).__init__()
        self.installEventFilter(self)

    def eventFilter(self, qobject, qevent):
        qtype = qevent.type()
        if qtype == QEvent.Close or qtype == QEvent.WindowStateChange:
            .. hide logic
            return True
        # parents event handler for all other events
        return super(custom,self).eventFilter(qobject, qevent)