PyQt4 WindowFlags不关闭程序

时间:2013-12-26 15:13:01

标签: python pyqt pyqt4 taskbar trayicon

我正在制作一个应用程序,在最小化时转到托盘图标,任务栏图标将被隐藏。

搜索我发现我可以隐藏图标,将windowflag更改为“ToolTip”。

然后当我重新打开程序时,我再次设置了“Window”标志。这是有效的,但是当我按下“X”关闭程序时它不会关闭,但它最小化到托盘。

可能是什么问题?

部分代码:

主窗口代码:

def changeEvent(self, e): 
    print e.type()
    if e.type() == e.WindowStateChange:
        if self.restore:
            print "Normalized"
            if platform.system() == "Windows":
                self.setWindowFlags(QtCore.Qt.Window)
            self.showNormal()
            self.activateWindow()
            restore = 0
            e.accept()
        elif self.windowState() & QtCore.Qt.WindowMinimized:
                print "Minimized"
                self.hide()
                    if platform.system() == "Windows":
                         self.setWindowFlags(QtCore.Qt.ToolTip)
                    event.accept()
        else:
                print "NONE"
def showW(self):
    self.restore = 1
    e = QtCore.QEvent(QtCore.QEvent.WindowStateChange)
    QtGui.QApplication.sendEvent(self,e)
    print e.isAccepted()

def closeEvent(self, event):
    reply = QtGui.QMessageBox.question(self, 'Message', "Are you sure to quit?", QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, QtGui.QMessageBox.No)
    if reply == QtGui.QMessageBox.Yes:
        print "ByeBye"
        event.accept()
    else:
        event.ignore()

托盘代码图标:

def onTrayIconActivated(self, reason):
    if reason == QtGui.QSystemTrayIcon.DoubleClick:
        self.parent.showW()

如果我从不最小化窗口,所有看起来都可行,但在最小化后我无法关闭它。

我有closerequest屏幕,但是当我点击Yes时程序转到trayicon而不是关闭。

编辑:如果WindowFlag的注释全部有效,那么问题是还原窗口标志? 我正在使用Python 2.7和PyQt4。

1 个答案:

答案 0 :(得分:0)

似乎有待解决!

我已添加:

QtGui.QApplication.quit()

到closeEvent(),就像这样:

def closeEvent(self, event):
    reply = QtGui.QMessageBox.question(self, 'Message', "Are you sure to quit?", QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, QtGui.QMessageBox.No)
    if reply == QtGui.QMessageBox.Yes:
        print "ByeBye"
        QtGui.QApplication.quit()
        event.accept()
    else:
        event.ignore()