如何在 __init__ 语句中(或之后)停止 QDialog 的执行?
Posted
技术标签:
【中文标题】如何在 __init__ 语句中(或之后)停止 QDialog 的执行?【英文标题】:How to stop a QDialog from executing while still in the __init__ statement (or immediately after)? 【发布时间】:2010-03-09 00:14:39 【问题描述】:我想知道如果在__init__
语句中满足某些条件,我该如何阻止对话框打开。
下面的代码尝试调用'self.close()'函数并且它确实调用了,但是(我假设)由于对话框还没有开始它的事件循环,它不会触发关闭事件?那么是否有另一种方法可以在不触发事件的情况下关闭和/或阻止对话框打开?
示例代码:
from PyQt4 import QtCore, QtGui
class dlg_closeInit(QtGui.QDialog):
'''
Close the dialog if a certain condition is met in the __init__ statement
'''
def __init__(self):
QtGui.QDialog.__init__(self)
self.txt_mytext = QtGui.QLineEdit('some text')
self.btn_accept = QtGui.QPushButton('Accept')
self.myLayout = QtGui.QVBoxLayout(self)
self.myLayout.addWidget(self.txt_mytext)
self.myLayout.addWidget(self.btn_accept)
self.setLayout(self.myLayout)
# Connect the button
self.connect(self.btn_accept,QtCore.SIGNAL('clicked()'), self.on_accept)
self.close()
def on_accept(self):
# Get the data...
self.mydata = self.txt_mytext.text()
self.accept()
def get_data(self):
return self.mydata
def closeEvent(self, event):
print 'Closing...'
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
dialog = dlg_closeInit()
if dialog.exec_():
print dialog.get_data()
else:
print "Failed"
【问题讨论】:
【参考方案1】:只有在调用 exec_ 方法时才会运行对话框。因此,您应该检查 exec_ 方法中的条件,如果满足,请从 QDialog 运行 exec_。
其他方法是在构造函数内部引发异常(虽然我不确定,这是一个很好的做法;在其他语言中,您通常不应该在构造函数内部允许这种行为)并在外部捕获它。如果你捕捉到一个异常,就不要运行 exec_ 方法。
请记住,除非您运行 exec_,否则您不需要关闭窗口。对话框已构建,但尚未显示。
【讨论】:
感谢您的回复!这几乎就是我最终做的事情。在实际应用程序中,我有一个从数据库获取信息的小部件,但我将数据库连接传递给该小部件。我最初试图在 init 中打开连接并在失败时关闭对话框,因此是上面的示例。相反,我现在在外面打开连接,如果它有效,我将传入一个连接引用,否则我不运行'exec_' 我很高兴,我可以帮忙 :-) 使用 pyqt 进行愉快的黑客攻击 :-)以上是关于如何在 __init__ 语句中(或之后)停止 QDialog 的执行?的主要内容,如果未能解决你的问题,请参考以下文章