Qt+Python开发流程大纲
pyqt5可实现Qt设计UI界面,Python编写逻辑代码,发挥各自的优势。
开发思路:独立开发界面代码与开发代码,即:界面与响应代码不在同一个文件中。
- Qt Designer设计UI界面,保存,将.ui文件复制到Python项目文件夹下
- Qt .ui文件转.py文件
打开Pycharm ->File->Settings-> Tools->External Tools,点击 + ,添加新项目。设置如下:
- Pycharm中右键复制过来的.ui文件,External Tools->PyUIC,即可获得.ui文件转化后的.py文件。
- 新建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设计的界面
'''
- 界面完成之后,通常还需要信号槽的实现,下面便是在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,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()