使用PyQt5 初始化时,super() 和 _ init _ () 函数的配合使用所面临的问题,以及对应的学习和解决方案

使用PyQt5 初始化时,super() 和 _ init _ () 函数的配合使用所面临的问题,以及对应的学习和解决方案。

问题描述:

1、在学习PyQt5 时,想要配合 QT Designer 设计的 .ui文件来设计界面,但是,需要将.ui文件转换为.py文件进行使用。(如果使用pyside ,则可以直接使用.ui 文件,但是在打包为一个 .exe 文件时,则需要将这些文件进行额外的操作。)

2、由于在转换为.py代码的时候,他是以 class 类的方式来生成的。所以,在使用的时候,需要调用生成的类方法进行界面的初始话时,需要对其进行再次封装。

3、并且,在自己实际使用QT Designer 设计Ui文件,并且将其导入为.py文件的时候,参考别人的例程的进行编写.py文件运行的时候,出现了一个super(),由于不是很懂这个函数的使用方式,在仿照写代码的时候,老是会出现报错的问题。

4、故在这里自己做一个笔记记录学习一下。

首先给出完整的.ui 文件 和 转换后的.py 文件

主窗口文件 plot_graph.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>648</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>主窗口</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <layout class="QVBoxLayout" name="verticalLayout">
    <item>
     <layout class="QHBoxLayout" name="horizontalLayout_3">
      <item>
       <layout class="QHBoxLayout" name="horizontalLayout">
        <item>
         <widget class="QPushButton" name="pushButton_2">
          <property name="text">
           <string>PushButton</string>
          </property>
         </widget>
        </item>
        <item>
         <widget class="QPushButton" name="pushButton">
          <property name="text">
           <string>PushButton</string>
          </property>
         </widget>
        </item>
       </layout>
      </item>
      <item>
       <spacer name="horizontalSpacer">
        <property name="orientation">
         <enum>Qt::Horizontal</enum>
        </property>
        <property name="sizeHint" stdset="0">
         <size>
          <width>40</width>
          <height>20</height>
         </size>
        </property>
       </spacer>
      </item>
      <item>
       <layout class="QHBoxLayout" name="horizontalLayout_2">
        <item>
         <widget class="QPushButton" name="pushButton_3">
          <property name="text">
           <string>PushButton</string>
          </property>
         </widget>
        </item>
        <item>
         <widget class="QPushButton" name="pushButton_4">
          <property name="text">
           <string>PushButton</string>
          </property>
         </widget>
        </item>
       </layout>
      </item>
     </layout>
    </item>
    <item>
     <widget class="QPlainTextEdit" name="plainTextEdit">
      <property name="minimumSize">
       <size>
        <width>104</width>
        <height>71</height>
       </size>
      </property>
     </widget>
    </item>
   </layout>
  </widget>
 </widget>
 <resources/>
 <connections/>
</ui>

通过转换(VScode + 插件 PYQT Integration)后得到的 Ui_plot_graph.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'c:\Users\LJ\Desktop\pyQT5\plot_graph.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_mainWindow(object):
    def setupUi(self, mainWindow):
        mainWindow.setObjectName("mainWindow")
        mainWindow.resize(800, 648)
        self.centralwidget = QtWidgets.QWidget(mainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName("verticalLayout")
        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setObjectName("pushButton_2")
        self.horizontalLayout.addWidget(self.pushButton_2)
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setObjectName("pushButton")
        self.horizontalLayout.addWidget(self.pushButton)
        self.horizontalLayout_3.addLayout(self.horizontalLayout)
        spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_3.addItem(spacerItem)
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_3.setObjectName("pushButton_3")
        self.horizontalLayout_2.addWidget(self.pushButton_3)
        self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_4.setObjectName("pushButton_4")
        self.horizontalLayout_2.addWidget(self.pushButton_4)
        self.horizontalLayout_3.addLayout(self.horizontalLayout_2)
        self.verticalLayout.addLayout(self.horizontalLayout_3)
        self.plainTextEdit = QtWidgets.QPlainTextEdit(self.centralwidget)
        self.plainTextEdit.setMinimumSize(QtCore.QSize(104, 71))
        self.plainTextEdit.setObjectName("plainTextEdit")
        self.verticalLayout.addWidget(self.plainTextEdit)
        mainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(mainWindow)
        QtCore.QMetaObject.connectSlotsByName(mainWindow)

    def retranslateUi(self, mainWindow):
        _translate = QtCore.QCoreApplication.translate
        mainWindow.setWindowTitle(_translate("mainWindow", "主窗口"))
        self.pushButton_2.setText(_translate("mainWindow", "PushButton"))
        self.pushButton.setText(_translate("mainWindow", "PushButton"))
        self.pushButton_3.setText(_translate("mainWindow", "PushButton"))
        self.pushButton_4.setText(_translate("mainWindow", "PushButton"))

窗口文件 plot_graph1.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Form</class>
 <widget class="QWidget" name="Form">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>400</width>
    <height>300</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Form</string>
  </property>
  <layout class="QGridLayout" name="gridLayout">
   <item row="0" column="0">
    <widget class="QPushButton" name="pushButton">
     <property name="text">
      <string>PushButton</string>
     </property>
    </widget>
   </item>
   <item row="0" column="1">
    <widget class="QPushButton" name="pushButton_3">
     <property name="text">
      <string>PushButton</string>
     </property>
    </widget>
   </item>
   <item row="1" column="0">
    <widget class="QPushButton" name="pushButton_2">
     <property name="text">
      <string>PushButton</string>
     </property>
    </widget>
   </item>
   <item row="1" column="1">
    <widget class="QPushButton" name="pushButton_4">
     <property name="text">
      <string>PushButton</string>
     </property>
    </widget>
   </item>
  </layout>
 </widget>
 <resources/>
 <connections/>
</ui>

转换后的窗口文件 Ui_plot_graph1.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'c:\Users\LJ\Desktop\pyQT5\plot_graph1.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(400, 300)
        self.gridLayout = QtWidgets.QGridLayout(Form)
        self.gridLayout.setObjectName("gridLayout")
        self.pushButton = QtWidgets.QPushButton(Form)
        self.pushButton.setObjectName("pushButton")
        self.gridLayout.addWidget(self.pushButton, 0, 0, 1, 1)
        self.pushButton_3 = QtWidgets.QPushButton(Form)
        self.pushButton_3.setObjectName("pushButton_3")
        self.gridLayout.addWidget(self.pushButton_3, 0, 1, 1, 1)
        self.pushButton_2 = QtWidgets.QPushButton(Form)
        self.pushButton_2.setObjectName("pushButton_2")
        self.gridLayout.addWidget(self.pushButton_2, 1, 0, 1, 1)
        self.pushButton_4 = QtWidgets.QPushButton(Form)
        self.pushButton_4.setObjectName("pushButton_4")
        self.gridLayout.addWidget(self.pushButton_4, 1, 1, 1, 1)

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.pushButton.setText(_translate("Form", "PushButton"))
        self.pushButton_3.setText(_translate("Form", "PushButton"))
        self.pushButton_2.setText(_translate("Form", "PushButton"))
        self.pushButton_4.setText(_translate("Form", "PushButton"))

注: 上面两个.py文件分别是 各自的ui文件自动生成的,通过运行这两个脚本是不会有任何方音的(仅仅只是两个类,并没有做其它的操作)。

因此,为了调用由ui生成.py界面,需要定编写一个新的.py 来实现这两个不同的界面,具体代码如下所示。

import sys 
from PyQt5.QtWidgets import QApplication , QMainWindow
from PyQt5.QtWidgets import QWidget
from Ui_plot_graph import Ui_mainWindow   # 导入自定义的 创建的  主窗口(mainwidget)的设计界面
from Ui_plot_graph1 import Ui_Form    # 导入自定义的 创建的  窗口(widget)的设计界面


# 注: Ui_mainWindow 可以替换为任意名称,但是必须是 通过 mainWindow.ui 生成的类
# 主窗口初始化的类
class MyMainWindow(QMainWindow,Ui_mainWindow):
    def __init__(self):
        #super(MyMainWindow, self).__init__() # 调用MyMainWindow的父类构造初始化方法
        QMainWindow.__init__(self) # 调用QMainWindow父类构造初始化方法
    #def __init__(self,parent=None):
        #super(MyMainWindow, self).__init__(parent=None) # 调用MyMainWindow的父类构造初始化方法    
        self.setupUi(self)   # 初始化,调用父类(Ui_mainWindow)的 setupUi() 方法

# 注: Ui_Form 可以替换为任意名称,但是必须是 通过 MyWidget.ui 生成的类
# 窗口初始化的类
class MyWidget(QMainWindow,Ui_Form):
    def __init__(self):
        super(QMainWindow, self).__init__() # 调用MyMainWindow的父类构造初始化方法
    #def __init__(self,parent=None):
        #super(MyMainWindow, self).__init__(parent=None) # 调用MyMainWindow的父类构造初始化方法    
        self.setupUi(self)   # 初始化,调用父类(Ui_mainWindow)的 setupUi() 方法


# 错误示例,这里是在设计 .UI文件时,使用的是窗口的类名称,但是在运行时,继承的类是 主窗口的类名称 QMainWindow.进而导致出错。 
"""
class MyWidget(QMainWindow,Ui_Form):
    def __init__(self):
        super(QMainWindow, self).__init__() # 调用MyMainWindow的父类构造初始化方法
    #def __init__(self,parent=None):
        #super(MyMainWindow, self).__init__(parent=None) # 调用MyMainWindow的父类构造初始化方法    
        self.setupUi(self)   # 初始化,调用父类(Ui_mainWindow)的 setupUi() 方法
"""

if __name__=="__main__":  
    app = QApplication(sys.argv)  # QT 自身初始化,sys.argv是命令行参数 注: 这个必须放在QT使用的最前面
    myWin = MyWidget()      # 加载一个UI文件,并对UI界面进行初始化
    myWin.show()             # 显示UI界面
    sys.exit(app.exec_())  



主要实现思想:

1、导入两个转换的(class)类(一个是主窗口的类、一个是窗口的类)

from Ui_plot_graph import Ui_mainWindow   # 导入自定义的 创建的  主窗口(mainwidget)的设计界面
from Ui_plot_graph1 import Ui_Form    # 导入自定义的 创建的  窗口(widget)的设计界面

2、分别对这两个类进行封装,实现界面的初始化

# 主窗口初始化的类
class MyMainWindow(QMainWindow,Ui_mainWindow):
    def __init__(self):
        #super(MyMainWindow, self).__init__() # 调用MyMainWindow的父类构造初始化方法
        QMainWindow.__init__(self) # 调用QMainWindow父类构造初始化方法
    #def __init__(self,parent=None):
        #super(MyMainWindow, self).__init__(parent=None) # 调用MyMainWindow的父类构造初始化方法    
        self.setupUi(self)   # 初始化,调用父类(Ui_mainWindow)的 setupUi() 方法

# 窗口初始化的类
class MyWidget(QWidget,Ui_Form):
    def __init__(self):
        super(QWidget, self).__init__() # 调用MyMainWindow的父类构造初始化方法
    #def __init__(self,parent=None):
        #super(MyMainWindow, self).__init__(parent=None) # 调用MyMainWindow的父类构造初始化方法    
        self.setupUi(self)   # 初始化,调用父类(Ui_mainWindow)的 setupUi() 方法

这里包括了两个不同界面的封装,可以看到,封装的类里面有一个首先继承了两个 父类的内容,分别是 (对应的ui 窗口类型父类,UI生成的类)。

_ init _(self) 函数,其本身就是在一调用这个函数的时候,首先内部执行这个初始化方法,这个不需要额外的调用。

所以,这里需要在封装的 _ init _ (self) 自身的初始化过程,由于继承了 QMainWindow(主窗口类)or QMainWindow (窗口类),本身有一些初始化的内容。因此,封装的类首先需要通过调用 父类的初始化方法完成 封装类的初始化内容,并且,还需要调用 由.ui 文件转换为 .py 文件的类。最终完成界面的初始化。

这里注意的是,在调用父类的方法或者父类初始化的时候,有以下几种方式。

# 方式一
QMainWindow.__init__(self) # 调用QMainWindow父类构造初始化方法
# 方式二
super(MyMainWindow, self).__init__() # 调用MyMainWindow的父类构造初始化方法
# 方式三 (这种也可以实现初始化的方式)
super(QMainWindow, self).__init__() # 调用MyMainWindow的父类构造初始化方法

这里在编写封装的类的时候,首先要明确的,就是在我们设计 .ui 文件的时候,使用的是 QMainWindow 还是 QWidget。 (因为我个人开始学的时候,没有经过系统的学习,其实pyQT也没找到很好的学习资料,并且看到super()函数不知道怎么使用。所以老是碰到各种问题,在这里多啰嗦一下。)

最后,在 封装的类 _ init _调用 ui生成的界面内容,最后实现界面的初始化。

self.setupUi(self)  # 初始化,调用父类(Ui_Form)的 setupUi() 方法

最后,对封装的类进行实例化。

if __name__=="__main__":  
    app = QApplication(sys.argv)  # QT 自身初始化,sys.argv是命令行参数 注: 这个必须放在QT使用的最前面
    myWin = MyMainWindow()      # 加载一个MyMainWindow 的UI文件,并对UI界面进行实例化,初始化界面的数据。
    myWin.show()             # 显示UI界面(这里是继承父类的方法来进行调用)
    sys.exit(app.exec_())  


  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值