Skip to main content
 首页 » 编程设计

python之将一个用Qt designer创建的.ui文件传给fbs打包

2024年08月12日42飞鱼

我已经编写了一个 Python 应用程序,我想分发它。我在它上面构建了一个 GUI,到目前为止工作正常。我使用以下设置 GUI:

qtCreatorFile = "gui.ui"  
Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile) 
 
class MyApp(QtWidgets.QMainWindow, Ui_MainWindow): 
    def __init__(self): 
        # Initialize parent PyQt classes 
        QtWidgets.QMainWindow.__init__(self) 
        self.setupUi(self) 
        (....) 

应用程序从以下内容开始:

if __name__ == "__main__": 
     app = QtWidgets.QApplication(sys.argv) 
     window = MyApp() 
     window.show() 
     sys.exit(app.exec_())   

如果我理解正确的话,为了使用'gui.ui'文件和fbs打包,我应该将它作为资源加载。所以我用这些作为修改:

from fbs_runtime.application_context import ApplicationContext, cached_property #added to imports) 
 
class AppContext(ApplicationContext):           # Subclass ApplicationContext 
    def run(self): 
        qtCreatorFile=self.get_design()    # to get the .ui file 
        Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile) 
        window = MyApp() 
        version = self.build_settings['version'] 
        window.setWindowTitle("EPANET parser v" + version) 
        window.show() 
        return self.app.exec_() 
 
    def get_design(self): 
        qtCreatorFile=self.get_resource("gui.ui") # It is in the correct src\main\resources path 
        return qtCreatorFile 
 
    @cached_property # all tutorials suggest this , but don't understand why. ??? 
    def main_window(self): 
        return MainWindow(self) 

fbs 应用程序应以以下替换 if __name__ == '__main__:' 开始:

if __name__ == '__main__': 
    appctxt = AppContext()     
    exit_code = appctxt.app.exec_() 
    sys.exit(exit_code) 

但是,我收到以下错误: Traceback (most recent call last): File "C:\Users\....src\main\python\main.py", line 61, in <module> class MyApp(QtWidgets.QMainWindow, Ui_MainWindow): NameError: name 'Ui_MainWindow' is not defined

我知道 MyApp 继承自 Ui_MainWindow在 AppContext 中定义现在上课,MyApp 无法引用它。任何帮助将不胜感激!

请您参考如下方法:

您可以使用 uic.loadUi() 而不是使用 uic.loadUiType(),它只是通过传递 .ui 路径来填充窗口

主.py

from fbs_runtime.application_context.PyQt5 import ApplicationContext, cached_property 
 
import sys 
 
from mainwindow import MyApp 
 
 
class AppContext(ApplicationContext): 
    def run(self): 
        self.window.resize(640, 480) 
        self.window.show() 
        return appctxt.app.exec_() 
 
    def get_design(self): 
        qtCreatorFile = self.get_resource("gui.ui") 
        return qtCreatorFile 
 
    @cached_property 
    def window(self): 
        return MyApp(self.get_design()) 
 
 
if __name__ == "__main__": 
    appctxt = AppContext() 
    exit_code = appctxt.run() 
    sys.exit(exit_code) 

主窗口.py

from PyQt5 import QtWidgets, uic 
 
 
class MyApp(QtWidgets.QMainWindow): 
    def __init__(self, ui, parent=None): 
        super().__init__(parent) 
        uic.loadUi(ui, self) 
        # ... 
└── src 
    ├── build 
    │   └── settings 
    │       ├── base.json 
    │       ├── linux.json 
    │       └── mac.json 
    └── main 
        ├── icons 
        │   ├── base 
        │   │   ├── 16.png 
        │   │   ├── 24.png 
        │   │   ├── 32.png 
        │   │   ├── 48.png 
        │   │   └── 64.png 
        │   ├── Icon.ico 
        │   ├── linux 
        │   │   ├── 1024.png 
        │   │   ├── 128.png 
        │   │   ├── 256.png 
        │   │   └── 512.png 
        │   ├── mac 
        │   │   ├── 1024.png 
        │   │   ├── 128.png 
        │   │   ├── 256.png 
        │   │   └── 512.png 
        │   └── README.md 
        ├── python 
        │   ├── main.py 
        │   └── mainwindow.py 
        └── resources 
            └── base 
                └── gui.ui