参考书为:PyQt5快速开发与实战
一、环境搭建
基本上参考书本不会有大问题,需要注意的是:
(1)尽量使用PIP安装,方便简洁。
(2)Python安装路径,将会是你使用PIP安装PyQt时的路径。所以如果不想将这些东西
安装到C盘下,那么你应该讲Python安装在你想要的路径。
(3)安装完书本的一堆东西后,需要设置Eric6。书本上所说的PyQt5的Tools的路径并不对,正确应改为如下:
我Python安装在C盘根目录下。
二、PyQt5的使用
(1)设置控件的伙伴关系(buddy)
这个可用来使标签(Label)绑定控件,书本讲得不清楚。设置伙伴关系,标签里面的英文字符,可以被快捷键绑定。
比方说有个标签名为“test”,还有个spinbox控件,设置它们之间为伙伴关系(将label拉向spinbox),并在label的text
属性中改为"te&st"。
然后保存,Ctrl + R 开始预览界面,这时候如果Alt + x ,我们发现spinbox被选中了。这就是伙伴关系的运用。
同理,label的text属性改为“t&ext”,那么此时需要Alt + e才能选中spinbox了。
(2)界面与逻辑分离
具体操作如下:
1、创建新项目:
eric6->project->new
2、生成一个简单界面,这里只有一个button与checkbox,并且编译成py文件:
代码如下:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'D:\PyQt5\mainwin.ui'
#
# Created by: PyQt5 UI code generator 5.13.0
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
self.centralWidget = QtWidgets.QWidget(MainWindow)
self.centralWidget.setObjectName("centralWidget")
self.pushButton = QtWidgets.QPushButton(self.centralWidget)
self.pushButton.setGeometry(QtCore.QRect(260, 130, 131, 51))
self.pushButton.setObjectName("pushButton")
self.checkBox = QtWidgets.QCheckBox(self.centralWidget)
self.checkBox.setGeometry(QtCore.QRect(280, 260, 71, 16))
self.checkBox.setObjectName("checkBox")
MainWindow.setCentralWidget(self.centralWidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton.setText(_translate("MainWindow", "PushButton"))
self.checkBox.setText(_translate("MainWindow", "CheckBox"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
3、创建逻辑文件,并编写代码:
File->new->save
我创建了一个名为:“callmainwin”的py文件:代码如下:
import sys
from PyQt5.QtWidgets import QApplication,QMainWindow
import Ui_mainwin #这里是将生成的文件UI_mainwin.py include到本模块
#也可以直接from Ui_mainwin import Ui_MainWindow
#直接将界面的类Ui_MainWindow添加进来
#Ui_mainwin.Ui_MainWindow指的是Ui_mainwin.py里面界面的类Ui_MainWindow
class MainCode(QMainWindow,Ui_mainwin.Ui_MainWindow):
def __init__(self):
QMainWindow.__init__(self)
Ui_mainwin.Ui_MainWindow.__init__(self) #初始化界面
self.setupUi(self)
self.pushButton.clicked.connect(self.bt_setcheckbox) #设置信号与对应槽函数
#当Ui_MainWindow按键触发点击信号时,触发此函数将checkbox状态改变
def bt_setcheckbox(self):
if self.checkBox.checkState() == True:
self.checkBox.setCheckState(False)
else:
self.checkBox.setCheckState(True)
if __name__=='__main__':
app=QApplication(sys.argv)
md=MainCode()
md.show()
sys.exit(app.exec_())
最后,F2运行“callmainwin.py”脚本,点击按键可以触发checkbox的状态改变
(3)界面与逻辑分离(方法二)
也可以利用eric6生成“Dialog Code”的方法实现:
步骤1、2相同,就是创建一个界面并且转化为py代码,第3步有所不同
3、生成对话框代码:
然后,点击“new”输入生成的py文件名字以及生成的类的名称,并且选择对应控件发出的信号:
确认后eric6会生成对应的py文件
4、修改生成的py文件
主要是添加槽函数对应的处理代码,以及设置本模块运行时,一些系统调用的类,修改后代码:
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import QMainWindow, QApplication
from Ui_mainwin import Ui_MainWindow
class callmw(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(callmw, self).__init__(parent)
self.setupUi(self)
#这个是槽装饰器,button发送的点击信号所携带的参数
#会作为pyqtSlot()的参数被带进来,这里的点击信号不带参数
@pyqtSlot()
def on_pushButton_released(self):
if self.checkBox.checkState() == True:
self.checkBox.setCheckState(False)
else:
self.checkBox.setCheckState(True)
if __name__=='__main__':
app=QApplication(sys.argv)
md=callmw()
md.show()
sys.exit(app.exec_())
(3)super函数的使用
这个函数主要是用来使用继承的父类的同名方法的。参考:https://www.cnblogs.com/silencestorm/p/8404046.html