我使用的是python2.7和PyQT4。在
我想隐藏一个模态QDialog实例,稍后再显示它。但是,什么时候对话框.setVisible(false)被调用(例如,使用QTimer),则对话框.exec_()呼叫返回(带QDialog.已拒绝返回值)。在
但是,根据http://pyqt.sourceforge.net/Docs/PyQt4/qdialog.html#exec,在用户关闭对话框之前,\u 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:此代码打印以下输出:
^{pr2}$(不调用关闭事件)。在
PS2:对于上下文,我试图实现一个SystemTrayIcon,它允许在不关闭对话框的情况下隐藏和恢复QMainWindow(这个部分很好)和可能的模态QDialog。在
谢谢!在
如果有人感兴趣,下面的代码为我提供了一种快速而肮脏的方法来解决问题,尽管它并不能真正回答问题。在
您可以通过调用基类方法来绕过
QDialog.setVisible
(它隐式关闭对话框)的正常行为:但是,最好连接到对话框的
^{pr2}$finished()
信号,而不是使用exec()
,并在其closeEvent
中显式地reject()
对话框。在相关问题 更多 >
编程相关推荐