gpt4 book ai didi

python - PyQT4:为什么当 setVisible(false) 时 QDialog 从 exec_() 返回

转载 作者:行者123 更新时间:2023-11-30 22:49:44 26 4
gpt4 key购买 nike

我使用的是 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,而无需关闭对话框。

谢谢!

最佳答案

您可以通过调用基类方法来绕过 QDialog.setVisible 的正常行为(隐式关闭对话框):

    def hide_dialog(self):
# self.dialog.setVisible(False)
QtGui.QWidget.setVisible(self.dialog, False)

但是,最好连接到对话框的 finished() 信号,而不是使用 exec(),并显式 reject() 对话框的 closeEvent 中。

#!/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)
layout = QtGui.QHBoxLayout(self)
for title, slot in ('Ok', self.accept), ('Cancel', self.reject):
button = QtGui.QPushButton(title)
button.clicked.connect(slot)
layout.addWidget(button)

def closeEvent(self, QCloseEvent):
print "Close Event"
self.reject()

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.finished.connect(self.dialog_finished)
self.dialog.setModal(True)
self.dialog.show()
QtCore.QTimer.singleShot(3000, self.dialog.hide)

def dialog_finished(self, status):
print "Dialog exited with status:", status

if __name__ == '__main__':

app = QtGui.QApplication([])
w = MyWindow()
w.show()
sys.exit(app.exec_())

关于python - PyQT4:为什么当 setVisible(false) 时 QDialog 从 exec_() 返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39638749/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com