我正在使用Python 2.7和PyQT4。PyQT4:爲什麼QDialog從exec_()返回setVisible(false)
我想隱藏一個模態QDialog實例,稍後再顯示它。但是,當調用dialog.setVisible(false)(例如,使用QTimer)時,dialog.exec_()調用返回(帶有QDialog.Rejected返回值)。
但是,根據http://pyqt.sourceforge.net/Docs/PyQt4/qdialog.html#exec,_exec()調用應該阻塞,直到用戶關閉對話框。
有沒有辦法隱藏對話框沒有_exec()返回?
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import os
from PyQt4 import QtGui, QtCore
class MyDialog(QtGui.QDialog):
def __init__(self, parent):
QtGui.QDialog.__init__(self, parent)
def closeEvent(self, QCloseEvent):
print "Close Event"
def hideEvent(self, QHideEvent):
print "Hide Event"
class MyWindow(QtGui.QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.setWindowTitle("Main Window")
button = QtGui.QPushButton("Press me", self)
button.clicked.connect(self.run_dialog)
def run_dialog(self):
self.dialog = MyDialog(self)
self.dialog.setModal(True)
self.dialog.show()
QtCore.QTimer.singleShot(1000, self.hide_dialog)
status = self.dialog.exec_()
print "Dialog exited with status {}".format(status), "::", QtGui.QDialog.Accepted, QtGui.QDialog.Rejected
def hide_dialog(self):
self.dialog.setVisible(False)
# self.dialog.setHidden(True)
if __name__ == '__main__':
app = QtGui.QApplication([])
w = MyWindow()
w.show()
sys.exit(app.exec_())
PS1:這個代碼打印以下輸出:
Hide Event
Dialog exited with status 0 :: 1 0
(close事件不被調用)。
PS2:對於上下文,我試圖實現一個SystemTrayIcon,允許隱藏和恢復一個QMainWindow(這部分是好的),並可能它的模態QDialog沒有關閉對話框。
謝謝!
感謝您的解決方法,但它並沒有真正回答如何(如果可能的話)避免exec_()返回的問題。 – mhernandez
@mhernandez。看到我更新的答案。 – ekhumoro