PySide2 (Qt for Python) 如何在 QMainWindow 子类中加载 .ui 文件

Posted

技术标签:

【中文标题】PySide2 (Qt for Python) 如何在 QMainWindow 子类中加载 .ui 文件【英文标题】:PySide2 (Qt for Python) how to load a .ui file in a QMainWindow subclass 【发布时间】:2020-09-02 21:17:59 【问题描述】:

我正在尝试使用 Qt Creator 和 Qt for Python 为新应用程序创建快速原型。但是,向导生成的代码对我来说没有多大意义。这是Qt Creator生成的main.py文件:

# This Python file uses the following encoding: utf-8
import sys
import os


from PySide2.QtWidgets import QApplication, QMainWindow
from PySide2.QtCore import QFile
from PySide2.QtUiTools import QUiLoader


class MyMainWindow(QMainWindow):
    def __init__(self):
        super(MyMainWindow, 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 = MyMainWindow()
    widget.show()
    sys.exit(app.exec_())

这是一个简单的form.ui,只需一个按钮:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MyMainWindow</class>
 <widget class="QMainWindow" name="MyMainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>800</width>
    <height>600</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MyMainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <layout class="QVBoxLayout" name="verticalLayout">
    <item>
     <widget class="QPushButton" name="pushButton">
      <property name="text">
       <string>PushButton</string>
      </property>
     </widget>
    </item>
   </layout>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>800</width>
     <height>22</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

我只是不明白 MyMainWindow 类中 load_ui 函数的用途。我知道 PyQt5 可以在使用 uic 模块初始化小部件期间加载 .ui 文件。据我所知,这对于 Python 的 Qt 是不可能的。我错过了什么吗?我正在使用 Qt Creator 4.13。

【问题讨论】:

你需要像__main__guard下面的示例代码一样使用它。如果您想自定义它,只需将其子类化并调用super().__init__(),就像您执行任何其他类一样。 【参考方案1】:

我找到了解决原始问题的方法,因为自动生成的代码似乎无法正常工作。 This answer 提供了一种在 PySide 中模仿 PyQt uic 模块功能的方法。

【讨论】:

以上是关于PySide2 (Qt for Python) 如何在 QMainWindow 子类中加载 .ui 文件的主要内容,如果未能解决你的问题,请参考以下文章

Qt for python pyside2/6 使用 PyInstaller打包项目exe

Qt for python pyside2/6 使用 PyInstaller打包项目exe

如pyside2程序显示的窗口与qt designer中的设置不符怎么办?

在 QT for Python 中使用 QFrames?

Python 使用Qt 报错:No module named 'PySide2'

使用 PySide2 开发 Maya 插件系列一:QT Designer 设计GUI, pyside-uic 把 .ui 文件转为 .py 文件