qt for python 动态加载ui文件不生效的问题

  近期想用qt+python写一个工具,利用qt Creator新建工程(qt for python(ui file))

 

  选择基类为QMainWindow,随后直接运行该工程,显示一个标题为python的空白窗口

 

  编辑ui文件,放置一个pushbutton,保存运行,仍然显示空白窗口,代码如下,除了main开头两行其余均为qt自动生成:

  

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

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


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

    def load_ui(self):
        loader = QUiLoader()
        path = os.fspath(Path(__file__).resolve().parent / "form.ui")
        ui_file = QFile(path)
        ui_file.open(QFile.ReadOnly)
        loader.load(ui_file, self)
        ui_file.close()


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

  经过尝试,将代码21行和30行分别修改为:

self.ui = loader.load(ui_file, self)

widget.ui.show()

  则代码运行正常,显示预期结果

 

  分析代码,个人认为是由于变量loader是局部变量导致的,思路是把ui文件load到类MainWindow的变量ui中,保存下来就可以正常show了。

  但是!如果新建一个基类为QWidget的工程,直接运行是可以正常显示ui文件设置的窗口的,选择基类QMainWindow和QDialog都显示空窗口,这就很奇怪了,看来是没完全解决,在这里求助各位。

新增2021/12/6 22:17

   很久之前的一篇文章说到这个动态加载ui的功能有限制,ui必须是QWidget窗体,不能是QMainWindow和QDialog,这种解释虽然不合理,但确实与我遇到的问题类似,暂且记录在此http://mobile.51cto.com/symbian-272128.htm。

posted @ 2021-12-06 17:09  空‘  阅读(2163)  评论(1编辑  收藏  举报