<p>好吧,我想我应该发布一个答案,而不是写一些夸张的评论:p</p>
<p>关于删除,我将引用<a href="http://doc.qt.io/qt-4.8/qdialog.html#done" rel="nofollow noreferrer">Qt documentation</a>:</p>
<blockquote>
<p>As with QWidget::close(), done() deletes the dialog if the
Qt::WA_DeleteOnClose flag is set. If the dialog is the application's
main widget, the application terminates. If the dialog is the last
window closed, the QApplication::lastWindowClosed() signal is emitted.</p>
</blockquote>
<p>但是,如果您想从打开对话框的其他窗口小部件中处理关闭(和删除)对话框窗口,应该使用插槽和信号。只需将主窗口小部件中的一个按钮或任何东西与其<code>clicked()</code>信号连接到对话框的<code>done()</code>插槽,就可以开始了。在</p>
<p>在这一点上,我还想指出,删除一个对话框可能没有必要。根据对话框的内存占用(创建和运行它所用的内存),您可能希望考虑在开始时创建对话框,并将其保留在内存中,直到主应用程序关闭。除此之外,您可以使用<code>hide()</code>和<code>show()</code>在屏幕上显示它。对于那些足够小的东西,这实际上是一个很好的实践,因为删除然后创建一个窗口比简单地隐藏和显示窗口要花费更多的时间。在</p>
<hr/>
<p>现在关于信号和插槽,它们有非常直接的语义。正如我在评论和我的另一个<a href="https://stackoverflow.com/a/35744748/1559401">answer</a>中所说的那样,为了将一个插槽连接到一个信号,你需要让它们出现在同一个范围内。如果不是这样的话,把一个(或两个)传给一个情况已经解决的地方。在你的情况下,你必须有一个共同的地方。如果两者都是顶级小部件,则必须在<code>main()</code>内进行连接。我宁愿将对话框作为扩展添加到您的<code>MainWindow</code>类(作为类成员)和实例化以及那里的连接-例如在<code>MainWindow</code>的构造函数中:</p>
<pre><code>class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setupUi(self)
self.dialog = DialogWindow(self)
# Connect mainwindow's signals to dialog's slots
# Connect dialog's signals to mainwindow's slots
# And even connect dialog's signals to dialog's slots
</code></pre>