zoukankan      html  css  js  c++  java
  • PySide6直接载入UI文件实现界面和代码分离

     直接载入,无需再生成相应的py文件。

     参考:Using .ui files from Designer or QtCreator with QUiLoader and pyside6-uic — Qt for Python

    入口文件 simpleApp.py 

    from MainWindow import Window
    from PySide6.QtWidgets import QApplication
    from PySide6.QtGui import QIcon
    
    if __name__ == '__main__':
        app = QApplication([])
        app.setWindowIcon(QIcon("logo.png"))    # 添加图标
        w = Window()
        w.ui.show()
        #w.win.show()
        app.exec()
    simpleApp.py

    界面控件属性设置文件 MainWindow.py

    import sys
    from PySide6.QtGui import QScreen
    from PySide6.QtCore import QFile
    from PySide6.QtUiTools import QUiLoader
    from PySide6.QtWidgets import QApplication, QButtonGroup, QLabel, QMessageBox
    
    class Window:
        def __init__(self):
            super(Window, self).__init__()
            # 从ui文件中加载UI定义
            qfile = QFile("mainPage.ui")
            qfile.open(QFile.ReadOnly)
            qfile.close()
            # 从UI定义中动态创建一个相应的窗口对象
            self.ui = QUiLoader().load(qfile)
            
            if not self.ui:
                print(QUiLoader().errorString())
                sys.exit(-1)
    
            self.center()
    
            # 信号处理
            self.ui.pushButton.clicked.connect(self.btnClick)
            # self.button.clicked.connect(self.btnClick)
    
        def btnClick(self):
            info = self.ui.textEdit.toPlainText()   # 获取文本信息
            # info = self.textEdit.toPlainText()
            print(info)
            # self.appLabel = QLabel()
            # self.appLabel.setAlignment(Qt.AlignCenter)
            # self.appLabel.alignment = Qt.AlignCenter
            # self.appLabel.setText(info)
            # self.appLabel.setWindowTitle(info)
            # self.appLabel.setGeometry(300, 300, 250, 175)
            # self.ui.setWindowTitle(info)
            # # 显示这个Label
            # self.appLabel.show()
            self.msgbox = QMessageBox()
            msgBox = self.msgbox
            msgBox.setText(info)
            # msgBox.setStandardButtons(QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel)
            # msgBox.setDefaultButton(QMessageBox.Save)
            msgBox.setStandardButtons(QMessageBox.Ok | QMessageBox.Discard | QMessageBox.Cancel)
            msgBox.setIcon(QMessageBox.Information)
            msgBox.setDetailedText("Information:"
            "
    sdfsdfaaa"
            "
    Testsertsetsetse")
            msgBox.setInformativeText("sdfsdfasssssss")
            # msgBox.show()
    
            # MessageBox = QMessageBox()
            # Ret = MessageBox.question(self.ui, "标题", "内容")     #Critical对话框
            # print(Ret)
            
            self.msgbox2 = QMessageBox()
            msgBox2 = self.msgbox2
            connectButton = msgBox2.addButton("Connect", QMessageBox.ActionRole)
            disconnectButton = msgBox2.addButton("DisConnect", QMessageBox.ActionRole)
            
            msgBox.setText(info)
            msgBox2.setIcon(QMessageBox.Information)
            msgBox2.exec()
            if msgBox2.clickedButton() == connectButton:
                self.ui.textEdit.append("Connect clicked!")
                print("Connect pass")
            elif msgBox2.clickedButton() == disconnectButton:
                self.ui.textEdit.append("DisConnect clicked!")
                print("DisConnect pass")
    
    
        def center(self):
            #Get Screen geometry
            SrcSize = QScreen.availableGeometry(QApplication.primaryScreen())
            #Set X Position Center
            frmX = (SrcSize.width() - self.ui.width())/2
            #Set Y Position Center
            frmY = (SrcSize.height() - self.ui.height())/2
            #Set Form's Center Location
            self.ui.move(frmX, frmY)
    MainWindow.py

    界面UI文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <ui version="4.0">
     <class>MainWindow</class>
     <widget class="QMainWindow" name="MainWindow">
      <property name="geometry">
       <rect>
        <x>0</x>
        <y>0</y>
        <width>800</width>
        <height>600</height>
       </rect>
      </property>
      <property name="windowTitle">
       <string>MainWindow</string>
      </property>
      <widget class="QWidget" name="centralwidget">
       <widget class="QGroupBox" name="groupBox">
        <property name="geometry">
         <rect>
          <x>40</x>
          <y>10</y>
          <width>431</width>
          <height>451</height>
         </rect>
        </property>
        <property name="title">
         <string>GroupBox</string>
        </property>
        <widget class="QRadioButton" name="radioButton">
         <property name="geometry">
          <rect>
           <x>40</x>
           <y>80</y>
           <width>95</width>
           <height>20</height>
          </rect>
         </property>
         <property name="text">
          <string>RadioButton</string>
         </property>
        </widget>
        <widget class="QCheckBox" name="checkBox">
         <property name="geometry">
          <rect>
           <x>40</x>
           <y>20</y>
           <width>81</width>
           <height>20</height>
          </rect>
         </property>
         <property name="text">
          <string>CheckBox</string>
         </property>
        </widget>
        <widget class="QTabWidget" name="tabWidget">
         <property name="geometry">
          <rect>
           <x>40</x>
           <y>110</y>
           <width>351</width>
           <height>261</height>
          </rect>
         </property>
         <property name="currentIndex">
          <number>0</number>
         </property>
         <widget class="QWidget" name="tab">
          <attribute name="title">
           <string>Tab 1</string>
          </attribute>
          <widget class="QTextEdit" name="textEdit">
           <property name="geometry">
            <rect>
             <x>10</x>
             <y>30</y>
             <width>331</width>
             <height>191</height>
            </rect>
           </property>
          </widget>
         </widget>
         <widget class="QWidget" name="tab_2">
          <attribute name="title">
           <string>Tab 2</string>
          </attribute>
         </widget>
        </widget>
        <widget class="QPushButton" name="pushButton">
         <property name="geometry">
          <rect>
           <x>330</x>
           <y>410</y>
           <width>93</width>
           <height>28</height>
          </rect>
         </property>
         <property name="text">
          <string>PushButton</string>
         </property>
        </widget>
        <widget class="QRadioButton" name="radioButton_2">
         <property name="geometry">
          <rect>
           <x>40</x>
           <y>50</y>
           <width>95</width>
           <height>20</height>
          </rect>
         </property>
         <property name="text">
          <string>RadioButton</string>
         </property>
        </widget>
       </widget>
       <widget class="QToolBox" name="toolBox">
        <property name="geometry">
         <rect>
          <x>480</x>
          <y>20</y>
          <width>291</width>
          <height>201</height>
         </rect>
        </property>
        <property name="currentIndex">
         <number>1</number>
        </property>
        <widget class="QWidget" name="page">
         <property name="geometry">
          <rect>
           <x>0</x>
           <y>0</y>
           <width>291</width>
           <height>141</height>
          </rect>
         </property>
         <attribute name="label">
          <string>Page 1</string>
         </attribute>
        </widget>
        <widget class="QWidget" name="page_2">
         <property name="geometry">
          <rect>
           <x>0</x>
           <y>0</y>
           <width>291</width>
           <height>141</height>
          </rect>
         </property>
         <attribute name="label">
          <string>Page 2</string>
         </attribute>
        </widget>
       </widget>
      </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 class="QMenu" name="menuMenu">
        <property name="title">
         <string>File</string>
        </property>
        <addaction name="actionOpen"/>
        <addaction name="actionSave"/>
        <addaction name="actionClose"/>
       </widget>
       <widget class="QMenu" name="menuEdit">
        <property name="title">
         <string>Edit</string>
        </property>
        <addaction name="actionSettings"/>
        <addaction name="actionReload"/>
       </widget>
       <addaction name="menuMenu"/>
       <addaction name="menuEdit"/>
      </widget>
      <widget class="QStatusBar" name="statusbar"/>
      <action name="actionOpen">
       <property name="text">
        <string>Open</string>
       </property>
      </action>
      <action name="actionSave">
       <property name="text">
        <string>Save</string>
       </property>
      </action>
      <action name="actionClose">
       <property name="text">
        <string>Close</string>
       </property>
      </action>
      <action name="actionSettings">
       <property name="text">
        <string>Settings</string>
       </property>
      </action>
      <action name="actionReload">
       <property name="text">
        <string>Reload</string>
       </property>
      </action>
     </widget>
     <resources/>
     <connections/>
    </ui>
    mainPage.ui

    打包部署,将所有依赖的DLL文件整理到exe文件同一目录:

    Command Line

    实现dll文件整理到distlib文件夹下(试了一下功能未实现,仅做记录,寻找解决方案,如有解决方案的朋友请不吝赐教):

    runtimehook.py

    调用命令,结束后需要拷贝相应的UI文件到生成的目录:

    Command line

    以下文件用于扩展相关功能,但是入口文件中会用到,需要 更新 simpleApp.py:

    from MainWindow import Window
    from qt import QApplication, QIcon, _exec
    
    if __name__ == '__main__':
        app = QApplication([])
        app.setWindowIcon(QIcon("logo.png"))    # 添加图标
        w = Window()
        w.ui.show()
        #w.win.show()
        _exec(app)
    simpleApp.py

    PyQt6和PySide6兼容设置 qt.py:

    import sys
    
    if 'PyQt6' in sys.modules:
        # PyQt6
        from PyQt6 import QtGui, QtWidgets, QtCore
        from PyQt6.QtCore import pyqtSignal as Signal, pyqtSlot as Slot
    
    
    else:
        # PySide6
        from PySide6 import QtGui, QtWidgets, QtCore
        from PySide6.QtCore import Signal, Slot
        
        from PySide6.QtWidgets import QApplication
        from PySide6.QtGui import QIcon
        
    
    def _enum(obj, name):
        parent, child = name.split('.')
        result = getattr(obj, child, False)
        if result:  # Found using short name only.
            return result
    
        obj = getattr(obj, parent)  # Get parent, then child.
        return getattr(obj, child)
    
    
    def _exec(obj):
        if hasattr(obj, 'exec'):
            return obj.exec()
        else:
            return obj.exec_()
    qt.py
  • 相关阅读:
    网络IO
    进程与线程
    计算机网络
    操作系统
    刷题笔记
    fasd
    线程池
    epoll反应堆
    read函数
    dup与dup2
  • 原文地址:https://www.cnblogs.com/CCJVL/p/15250607.html
Copyright © 2011-2022 走看看