如何关闭QDialog

8

我一直在试图关闭一个从主窗口分支出来的QDialog窗口。迄今为止,以下方法都没有起作用:

self.close()
QDialog.close()

我尝试了其他命令,例如exitexec_(),但并没有成功。

我经常遇到的最常见错误是

[className]对象没有'close'属性

# Creating our window
class Ui_MainWindow(object):

    # Sets up GUI
    def setupUi(self, MainWindow):

        [GUI CODE]      

    # Sets text for parts of GUI
    def retranslateUi(self, MainWindow):

        [MORE GUI CODE]

    # Function handling screencap on click and metadata for filenames
    def cap_on_Click(arg1,arg2):

        popup = QDialog()
        popup_ui = Ui_Dialog()
        popup_ui.setupUi(popup)
        popup.show()
        sys.exit(popup.exec_())

上面是我的主窗口。
class Ui_Dialog(object):

    def setupUi(self, Dialog):

        [GUI CODE]

    def retranslateUi(self, Dialog):

        [MORE GUI CODE]

    def button_click(self, arg1):

        self.close()

第二个块是对话窗口的代码。我该如何关闭这个对话窗口?

请遵循这些 MVCE 指南:http://stackoverflow.com/help/mcve。 - MrAlexBailey
请考虑发布一个最小化的工作示例,以便我们进行调试。 - qurban
4个回答

7

首先,抱歉关于C++的链接,但是Python有相同的概念

您可以尝试使用rejectacceptdone函数来关闭对话框。这样做,您会适当地设置返回值(RejectedAccepted或作为参数指定的返回值)。

总之,当您希望对话框被接受/拒绝时,应该尝试调用YourDialog.done(n)来关闭对话框并返回nYourDialog.accept()YourDialog.reject()


我尝试过类似的模拟,但由于某种原因,我的对话框在那里没有定义。 - C Snyder
1
@CSnyder,这个没有定义在哪里? - ForceBru
2
@CSnyder,你尝试过调用self.done()或类似的方法吗? - ForceBru
我尝试了所有我能找到的关闭窗口的命令,但是它们都没有起作用。我转而使用C++而不是继续使用Python。在C++中,我没有遇到这样的问题。 - C Snyder
1
@CSnyder:如果Ui_Dialog继承自object,你该如何调用close()呢?使用Qt Designer生成的代码应该保持不变。你需要使用多重继承,让你的对话框同时继承于QDialog和(未改动的)Ui_Dialog。这样就可以同时访问生成的内容和与QDialog一起提供的内容了。 - z33k
显示剩余2条评论

4

我猜问题在于Ui_Dialog没有继承QDialog,所以reject()accept()done()没有定义。我认为

class Ui_Dialog(object):

应该改为

class Ui_Dialog(QDialog):

但是由于未提供最简工作示例,我无法进行测试。

我理解了这个问题,但在我的情况下,使用dialog.close()或dialog.done()仍然无法解决问题,窗口仍然打开着。 - greendino
请提供最小化、可重现的示例。 - cges30901
很有可能Ui_Dialog是通过pyuic或类似工具自动生成的。您不应手动编辑该文件。我发现一个好的做法是创建一个继承QWidget/QDialog(或类似) Ui_Dialog的自定义类。 - Buzz

3
由于QDialog是一个QWidget,而QWidget具有close()方法,我不明白为什么它不能工作。你不应该调用popup.exec_(),因为这将要求您的代码在没有意识到的情况下重新进入。这是不必要的-当cap_on_Click正在执行时,您已经拥有应用程序事件循环正在运行并在调用堆栈上。

popup.show()之后,对话框会可见且可用,直到用户接受或拒绝它。希望您的对话框设计将按钮框的accepted()rejected()信号连接到对话框的accept()reject()槽。这是Qt Creator提供的QDialog模板的默认行为,也可能是Qt Designer的默认行为,但您应该通过进入信号/槽编辑器模式查看Ui文件来检查它。


2
是的,我也不明白。但我可以告诉你,如果不加popup.exec_(),我的对话框窗口就不会出现。 - C Snyder
@CSnyder,那就是其他地方出了问题。你展示的代码看起来没问题。 - Kuba hasn't forgotten Monica

2

我知道这已经过去5个月了,但我选择在这里留下评论,这可能会对明天的其他人有所帮助。如果只使用self.close,则无法关闭或取消打开的对话框,因为这将关闭整个程序。可以使用以下示例:

self.dlg = QDialog(self)
self.dlg.setWindowTitle("Admin")
self.dlg.setGeometry(100,100,300,200)
btnBox = QDialogButtonBox()
btnBox.setStandardButtons(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)

btnBox.rejected.connect(self.close1)
def close1():
    self.dlg.close()

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