如何在这个程序中捕获关闭、最小化等事件(pyqt)?

2 投票
2 回答
6550 浏览
提问于 2025-04-15 16:54

嗨,朋友们,

这里的问题是,我想要捕捉QTabWidget的最小化和关闭事件(这个控件默认没有叫做关闭或最小化的功能),以便隐藏这个控件。所以用户退出应用程序的唯一方法就是点击托盘图标菜单中的退出选项。

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 个回答

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)
2

我不太明白你想要实现什么。

你是想用这个类的某个公共方法来隐藏标签页控件吗?如果是这样,你可以直接调用 close() 方法。

如果你的需求是希望在应用程序运行时不关闭标签页控件,那么可以参考以下内容——

你提到过:

“这里的问题是我想捕捉 QTabWidget 的最小化和关闭事件(默认情况下,这个控件没有名为 close 或 minimize 的槽函数)来隐藏这个控件……”

QTabWidget 是从 QWidget 继承来的,而 QWidget 实现了 'close()' 方法。

所以,在一个继承自 QTabWidget 的类中,你可以重新实现 "closeEvent()" 方法来捕捉关闭事件。

在你的代码中,你可以试试这个:

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' 按钮不会关闭或隐藏这个控件)。

撰写回答