PyQt4:如何显示一个非模态对话框?

7

我真的想不出来这个问题的答案...在按下按钮时,我的代码如下:

@QtCore.pyqtSlot():
def buttonPressed(self):
    d = QtGui.QDialog()
    d.show()

所有的情况下,一个窗口会短暂地弹出但没有任何内容,然后消失。反复点击按钮并不能解决问题。
使用Python 2.6和最新的PyQt4。

能否尝试使用d.exec_()而不是show()? - utdemir
@utdmr:是的,这将正确显示模态对话框。 - Claudiu
2个回答

8

如果我没记错的话,似乎有其他人也遇到了相似的问题。问题看起来是你定义了一个本地变量d并将其初始化为QDialog,然后显示它。问题在于一旦buttonPressed处理程序执行完毕,对d的引用就超出了其作用域,因此它会被垃圾收集器销毁。尝试像这样做:self.d = QtGui.QDialog() 以使其保持在作用域内。


啊,是的,我刚才意识到了这一点。如果你问我,我不明白他们为什么要这样做。嗯,在某种程度上,我能理解,但我认为既然QT已经引用它(因为必须显示它,对吧?),它应该一直保留直到“取消”被点击或类似的操作。 - Claudiu
我不太确定QT是如何引用它的,但是我期望它会保留某种对象句柄。我想知道QtGui.QDialog().show()是否有效...如果是这样,那么我认为就没有局部变量,也许垃圾收集器会将其保持不变。虽然我有一种乐观的感觉,但我觉得我可能太过于乐观了。 - voithos
我不认为那会奏效 =P。它会更快地被垃圾回收掉。 - Claudiu
好的。在这种情况下,我认为垃圾回收器做得非常出色。如果它不管对话框,那么一旦超出范围,它就会变成孤立的。 - voithos

5
当创建对话框时,您应将父级传递给它,就像这样:

您应在创建对话框时如此操作:

@QtCore.pyqtSlot():
def buttonPressed(self):
    d = QtGui.QDialog(self)
    d.show()

这将保留对QDialog对象的引用,使其处于作用域内。如果您将适当的QMainWindow等作为父级传递,则还允许对话框的正常行为。


我知道这是一个旧的线程,但这确实是正确的答案,应该被接受。QDialog(任何对话框都会继承)在其__init__中需要一个parent作为参数。通过将您的窗口作为父级传递,您的对话框不会被关闭。 - delrocco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接