如何使用 .ui 文件创建 Widget?

How to create a Widget using .ui file?

我想在 MainWindow 中创建一个小部件,它的设计来自使用 QtDesigner 创建的文件。

实际上,应用程序显示空白 window

代码如下:

from PySide2.QtWidgets import QMainWindow, QApplication, QDesktopWidget, QWidget
from PySide2.QtCore import QCoreApplication, Qt

from PySide2.QtUiTools import QUiLoader
from PySide2.QtCore import QFile

class MyWidget(QWidget):
    def __init__(self, parent=None):        
        super(MyWidget, self).__init__(parent)

    ui_file = QFile("test.ui")
    ui_file.open(QFile.ReadOnly)

    loader = QUiLoader()
    window = loader.load(ui_file)
    ui_file.close()


class MainWindow(QMainWindow):

    def __init__(self):
        super(MainWindow, self).__init__()
        self.ui_dim_percentage = 70/100
        self.initUI()

    def initUI(self):
        self.center()

        self.home_widget = MyWidget(self)
        self.setCentralWidget(self.home_widget)

        self.show()

    def center(self): # resizes the UI to a percentage of the screen and centers the widget

        screen_size = QDesktopWidget().screenGeometry()
        self.resize(screen_size.width()*self.ui_dim_percentage, screen_size.height()*self.ui_dim_percentage)

        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())


def main():

    app = QApplication(sys.argv)
    ex = MainWindow()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

我应该如何更正代码?

您是否尝试过转换您的 ui-file?

您可以在 shell 上使用 pyuic4 命令:

pyuic4 test.ui -o test.py

问题是您混淆了概念,当您使用 QUiLoader 时,您正在创建 window,在本例中是作为局部变量的 window 变量,即 . ui不填写MyWidget。

解决方案是不创建 MyWidget class,只需使用 window 变量。

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


def create_widget():
    ui_file = QFile("test.ui")
    if ui_file.open(QFile.ReadOnly):
        loader = QUiLoader()
        window = loader.load(ui_file)
        ui_file.close()
        return window


class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.ui_dim_percentage = 70 / 100
        self.initUI()

    def initUI(self):
        self.center()

        self.home_widget = create_widget()
        self.setCentralWidget(self.home_widget)

        self.show()

    # resizes the UI to a percentage of the screen and centers the widget
    def center(self):

        screen_size = QDesktopWidget().screenGeometry()
        self.resize(
            screen_size.width() * self.ui_dim_percentage,
            screen_size.height() * self.ui_dim_percentage,
        )

        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())


def main():
    import sys

    app = QApplication(sys.argv)
    ex = MainWindow()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()