【问题标题】:How to close a QDialog如何关闭 QDialog
【发布时间】:2015-09-17 18:04:43
【问题描述】:

我一直在尝试关闭一个从我的主窗口分支出来的 QDialog 窗口。到目前为止,以下内容对我不起作用:

self.close()
QDialog.close()

我尝试了其他命令,例如 exitexec_(),但没有成功。 我得到的最常见的错误是

[className] 对象没有“关闭”属性

# 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()

第二个块是对话窗口代码。如何关闭此对话窗口?

【问题讨论】:

  • 请关注these MVCE guidlines
  • 请考虑发布一个最小的工作示例,以便我们对其进行调试。

标签: python qt user-interface pyqt qdialog


【解决方案1】:

首先,很抱歉与 C++ 相关的链接,但Python has the same concept

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

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

【讨论】:

  • 我尝试过类似的方法,但由于某种原因,我的对话框没有在那里定义。
  • @CSnyder,它没有定义在哪里
  • 在 Ui_Dialog 类中,我尝试调用 self.close() 函数。
  • @CSnyder,你有没有试过打电话给self.done()或类似的东西?
  • @CSnyder: 如果Ui_Dialog 继承自object,你应该如何调用close()?使用 Qt Designer 生成的代码应该保持不变。你要做的是你必须使用多重继承并使你的对话框继承自QDialog和(未篡改)Ui_Dialog。然后,您可以访问生成的内容以及 QDialog 附带的内容
【解决方案2】:

由于QDialogQWidget,而QWidgetclose() 方法,我不明白它怎么不能工作。但是,您永远不应该调用popup.exec_(),因为它会很高兴地要求您的大量代码在您没有意识到的情况下可重入。这是不必要的 - 当cap_on_Click 正在执行时,您已经运行了应用程序事件循环并在调用堆栈上。

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

【讨论】:

  • 是的,我也不明白。但是我可以告诉你,通过省略 popup.exec_(),我的对话窗口根本不会出现。
  • @CSnyder 那么其他东西坏了。如图所示,您的代码看起来不错。
【解决方案3】:

我猜问题是Ui_Dialog没有继承QDialog,所以reject()accept()done()没有定义。我觉得

class Ui_Dialog(object):

应该改为

class Ui_Dialog(QDialog):

但我无法测试它,因为没有提供最小的工作示例。

【讨论】:

  • 我做对了。但在我的情况下,使用 dialog.close() 或 dialog.done() 仍然不起作用。窗口仍然打开
  • 请提供最小的、可重现的例子。
【解决方案4】:

我知道已经超过 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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    相关资源
    最近更新 更多