Qt+Python开发流程大纲

pyqt5可实现Qt设计UI界面,Python编写逻辑代码,发挥各自的优势。

开发思路:独立开发界面代码与开发代码,即:界面与响应代码不在同一个文件中。

  1. Qt Designer设计UI界面,保存,将.ui文件复制到Python项目文件夹下
  2. Qt .ui文件转.py文件

打开Pycharm ->File->Settings-> Tools->External Tools,点击 + ,添加新项目。设置如下:

Python Qt GUI快速编程:PyQt编程指南 PDF 高清版 qt python开发_Qt

  1. Pycharm中右键复制过来的.ui文件,External Tools->PyUIC,即可获得.ui文件转化后的.py文件。
  2. Python Qt GUI快速编程:PyQt编程指南 PDF 高清版 qt python开发_python_02

  3. 新建Python文件main.py
    新建main.py文件是为了实现代码与界面代码的分开设计。
import sys
from PyQt5.Qt import *
import mainwindow   # 界面模块 即:ui转py文件
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
    MainWindow = QMainWindow()
    ui = mainwindow.Ui_MainWindow()  # mainwindow界面模块 Ui_MainWindow类。这些都是ui转py文件时自动生成的
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
'''
这是标准模式:
安装需要的package,如PyQt5,运行main.py,即可显示QT5设计的界面
'''
  1. 界面完成之后,通常还需要信号槽的实现,下面便是在pyqt5中如何使用信号槽

新建Python文件son.py,在该文件里实现信号与槽。这么做的好处是:信号槽的实现代码与界面代码mainwindow.py分开写,界面样式可以随时去Qt Designer更改,然后重新生成mainwindow.py文件,不会影响信号槽的实现。

'''
son.py文件 实现pyqt5的信号和槽
'''
from mainwindow import *
from PyQt5.QtWidgets import *
 
class Son(QMainWindow):				# 重点1:基类QMainWindow
    def __init__(self, name=""):
        # 构造函数
        super().__init__()
        self.initUI(name)			# 重点2:单独创建一个初始化UI方法,这样做更整洁
 
 
    def initUI(self, name):
        # 初始化函数
        self.ui = Ui_MainWindow()		# 重点3:创建Ui_MainWindow对象
        self.ui.setupUi(self)
        self.setWindowTitle(name)		# 设置窗口标题命名
        # self.ui.horizontalSlider.setTracking(True)
 
        # 关联信号槽					# 重点4:关联信号槽
        self.ui.horizontalSlider.valueChanged[int].connect(self.setValue)
 
    # 定义槽函数						# 重点5:实现信号槽(方法)
    def setValue(self, value):
        self.ui.lineEdit.setText(str(value))

	'''
	全部思路如上,将关联信号槽和实现信号槽在一个单独的py文件中实现,就可以实现界面设计和逻辑设计互不干扰。
	'''

main.py改写为如下

import sys
from PyQt5.Qt import *
import mainwindow
from son import *		# 添加信号槽功能实现类
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
    # MainWindow = QMainWindow()
    # ui = mainwindow.Ui_MainWindow()
    # ui.setupUi(MainWindow)
    # MainWindow.show()
 
 	'''
 	用下面的2句,代替上面注释的4句
 	注意:Son类的基类是QMainWindow类  
 	并且在Son类内部实现了 创建Ui_MainWindow对象和初始化(ui.setupUi(MainWindow))
 	'''
    Mainwindow=Son("主界面")
    Mainwindow.show()
    
    sys.exit(app.exec_())
  1. 最终效果如下

Python Qt GUI快速编程:PyQt编程指南 PDF 高清版 qt python开发_Qt_03

  1. 通过点击按钮,弹出二级界面

重复步骤1,3(设计一个新界面),获得二级界面的.py文件dialog.py,我这里基类是QDialog

新建son2.py文件(重点:新建了一个py文件用于创建dialog.py信号和槽),代码如下:

from dialog import *
from PyQt5.QtWidgets import *
 
class Son2(QDialog):				# 重点1:由于这个是对话框,所以基类是QDialog
    def __init__(self, name=""):
        # 构造函数
        super().__init__()
        self.initUI(name)
 
 
    def initUI(self, name):
        # 初始化函数
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)
        self.setWindowTitle(name)
'''
son2.py中并没有关联信号和槽方法,这是因为这个示例只显示该对话框,并不需要处理该对话框的交互信号
'''

son.py添加如下代码,注意一定是self.Page2 .show(),而不是Page2 .show();否则Page2是个临时变量,窗口只是一闪而过。

'''
son.py
在son.py中添加 son2的信号关联和槽方法
'''
from son2 import *

# 信号槽关联
self.ui.pushButton.clicked.connect(self.newPage)

#槽函数
    def newPage(self):
        self.Page2 = Son2("二级界面")
        self.Page2.show()			# 重点2:针对于self.Page2变量的show()方法为非模窗口
		# self.Page2.exec()			exec方法为模式窗口
'''
Python的局部变量 更容易搞混,需要以后单独总结一下
'''

当使用show时,窗口默认为非模态,此时当前窗口可以与其它窗口进行交互。当使用exec时,为模态窗口,此时会阻塞线程,直到子事件循环退出之后,才能进行下一步操作。

son.py完整代码:

from mainwindow import *
from PyQt5.QtWidgets import *
from son2 import *
 
class Son(QMainWindow):
    def __init__(self, name=""):
        # 构造函数
        super().__init__()
        self.initUI(name)
 
 
    def initUI(self, name):
        # 初始化函数
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.setWindowTitle(name)
        # self.ui.horizontalSlider.setTracking(True)
 
        # 关联信号槽
        self.ui.horizontalSlider.valueChanged[int].connect(self.setValue)
        self.ui.pushButton.clicked.connect(self.newPage)
 
    # 定义槽函数
    def setValue(self, value):
        self.ui.lineEdit.setText(str(value))
 
    def newPage(self):
        self.Page2= Son2("二级界面")
        self.Page2.show()