【发布时间】:2016-09-22 12:12:53
【问题描述】:
我正在使用 Python 2.7 和 PyQT4。
我想隐藏一个模态 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
(不调用关闭事件)。
PS2:对于上下文,我正在尝试实现一个 SystemTrayIcon,它允许隐藏和恢复 QMainWindow(这部分很好)和可能的模式 QDialog,而无需关闭对话框。
谢谢!
【问题讨论】: