【问题标题】:How can I self hide and show QDialog() in PyQT5?如何在 PyQT5 中自我隐藏和显示 QDialog()?
【发布时间】:2016-08-30 13:36:20
【问题描述】:

我有一个使用 Qt Designer 生成的 GUI,我使用 pyuic5 生成了一个 .py 文件。在一个单独的 py (program.py) 文件中,我导入我的 UI 并在那里完成我的所有工作。

program.py

import sys, os, time
from subprocess import call
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyCred_GUI import Ui_Dialog


class MyGUI(Ui_Dialog):
    def __init__(self, dialog):
        Ui_Dialog.__init__(self)
        self.setupUi(dialog)


        self.pushButton_2.clicked.connect(self.cancelbutton)

    def cancelbutton(self):
        exit()


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    dialog = QtWidgets.QDialog()
    dialog.setWindowFlags(QtCore.Qt.WindowSystemMenuHint)
    prog = MyGUI(dialog)

    dialog.show()
    sys.exit(app.exec_())

我抽出很多东西只是为了专注于这里的问题。当我单击“取消”按钮时,我希望窗口隐藏,设置一个计时器,然后在这么多秒后重新出现。我已经尝试了 self.close() self.hide() self.destroy() 的每一种组合,但它们都没有隐藏我的窗口。我收到一条错误提示

"AttributeError: 'MyGUI' object has no attribute 'hide'"

这是有道理的,因为 MyGUI 没有 hide() 函数。我完全不知道如何隐藏这个窗口。

编辑(已解决) 对于未来的人,正如Hi Im Frogatto dialog.hide() 所建议的那样有效。

【问题讨论】:

  • dialog.hide() 怎么样? (顺便说一句,QDialog 不应该显示您的主应用程序的 UI,请改用 QMainWindow
  • @HiI'mFrogatto 顺便说一句,这是个坏建议。 QMainWindow 应该在您需要它的特定功能时使用:可停靠的子窗口等。它完全有效主 UI 直接派生自 QDialogQWidget不幸 Qt Creator 默认使用派生自 QMainWindow 的“主 ui”启动您。在许多情况下,这恰恰是错误的做法。
  • @KubaOber 我没有说使用QDialog 是一种无效的方法。但是 UX 要求应用程序的主 UI 有菜单栏、状态栏等,由QMainWindow 提供,而不是裸QWidgetQDialog。此外,QDialog 应该被接受或拒绝而不是隐藏和显示。
  • 并非所有内容都足够复杂以保证状态/菜单。既然你带来了 UX:现代屏幕又短又宽。经典的菜单和状态栏浪费了宝贵的垂直空间。许多应用程序没有菜单栏。它在 OS X 上是给定的,但除此之外,我会说它是高度可选的。状态栏很有帮助——你真的会喜欢 1995 年的 MFC 外观。我有一个浏览器和 Qt Creator 打开,也没有状态栏,浏览器也没有菜单。玩具应用也不是 :) 所以是的,QMainWindow 不应该被随意使用。
  • 这是正常的,应该是 showQDialog(而不是 exec()-ing 它)——这样你就不会重新进入事件循环。当然你应该接受或拒绝它,但很多小型应用程序都是这样的。否则,正如我所说,对于您想要QWidget 的无菜单应用程序。即使有菜单,您也应该考虑QMainWidget 是否适合您的用例。

标签: python qt python-3.x pyqt5


【解决方案1】:

在您的代码 sn-p 中,dialog 的类型为 QDialog,因此具有 hide 方法。然而MyGUI 类的实例似乎没有这样的方法。所以,如果你在那个__init__()函数中写dialog.hide(),你可以隐藏它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多