首页 > 解决方案 > PyQT 与 QT Creator

问题描述

我正在尝试使用 PySide 和 QT Creator 开发一个小型 gui。作为基本实现,我选择了一个QMainWindow. 问题是,当我运行代码时,将任何元素添加到编辑器内的 MainWindow 会导致一个空窗口。

最初生成的 python 代码如下所示:


class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.load_ui()

    def load_ui(self):
        loader = QUiLoader()
        path = os.path.join(os.path.dirname(__file__), "form.ui")
        ui_file = QFile(path)
        ui_file.open(QFile.ReadOnly)
        loader.load(ui_file, self)
        ui_file.close()


if __name__ == "__main__":
    app = QApplication([])
    widget = MainWindow()
    widget.show()
    sys.exit(app.exec_())

我知道loader.load(ui_file, self)返回一个小部件。我的解决方案是:

 def load_ui(self):
        loader = QUiLoader()
        path = os.path.join(os.path.dirname(__file__), "form.ui")
        ui_file = QFile(path)
        ui_file.open(QFile.ReadOnly)
        self.window = loader.load(ui_file, self)
        self.window.show()
        ui_file.close()

if __name__ == "__main__":
    app = QApplication([])
    widget = MainWindow()
    #widget.show()     <<<<<<--- removing this 
    sys.exit(app.exec_())

这对我有用,但这显然不是应该的工作方式。我对为什么 QT Creator 给我这个不工作的模板感到困惑。


此外,我很好奇应该如何实现自定义功能。单击clicked()按钮的插槽时,它告诉我

No ui_form.h found! (translated)

我最终将函数写到我的MainWindow类中,如下所示:

self.window.menuopen_button.clicked.connect(lambda x: self.menu_animation(x))
self.window.minimise_button.clicked.connect(lambda x: self.menu_buttons('minimise'))

标签: pythonqt-creatorpyside2

解决方案


您的初始代码仅将 UI 文件加载到 QUiLoader 对象中——您无需对它执行任何其他操作。当您调用 时widget.show(),您调用的是 QMainWindow 的 show 方法,该方法是默认窗口(因此为空),因为您尚未将加载的小部件添加到其中。

您的解决方案类似地加载 UI,但通过小部件对象的 show 方法显示它。但是,您并没有将其修改到主窗口,因此您基本上是在折腾主窗口并仅使用小部件。

有几种方法可以正确完成您想要的:

  1. 一种方法是,正如@musicamante 建议的那样,将加载的 UI 小部件添加到您的 MainWindow 对象(顺便说一下,PySide2 支持这一点:https : //doc.qt.io/archives/qtforpython-5.12/PySide2/ QtUiTools/QUiLoader.html - 详细描述中的示例准确显示了如何执行此操作)。
  2. 或者我更喜欢的另一种方式是在构建过程中使用 uic 实用程序 PySide2-uic 来基于 UI 文件生成 UI Python 类。

Qt 文档有显示这两种方法的教程。链接的文档显示 PySide6 对 PySide2 的支持已随着 Qt6 的发布而停止。PySide2、PySide6 和 PyQt5 的 API 都非常相似,因此如果您从 PySide2 或 PyQt 迁移,那么更改应该相对轻松。我推荐使用 PySide6,因为这是 Qt 官方支持的 Python 绑定。


推荐阅读