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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM