安装
pip install pyqt5
pip install PyQt5-tools
界面
区域1是UI界面制作导向,QtDesigner为我们提供了一些常用模块,非常方便;
区域2是UI控件列表;
区域3是控件属性列表;
区域4是Action Editor编辑列表;
区域5信号和槽的编辑列列表;
区域6是资源处理窗口。
信号与槽
i.信号绑定槽
self.pushButton.clicked.connect(self.firtPyQt5_button_click)
ii.信号绑定多个槽
self.pushButton.clicked.connect(self.firtPyQt5_button_click)
self.pushButton.clicked.connect(self.firtPyQt5_button_click_2)
iii.信号绑定信号
self.pushButton.clicked.connect(self.firtPyQt5_button_click)
self.pushButton1.clicked.connect(self.pushButton.clicked)
iv.信号与信号,信号与槽的解绑
self.pushButton1.clicked.disconnect(self.pushButton.clicked)
self.pushButton.clicked.disconnect(self.firtPyQt5_button_click_2)
v,自定义信号
PyQt5提供了QtCore.pyqtSignal函数来产生一个signal,之后就是熟悉的绑定操作了,看个实例就清楚了
class EmitSignal(QWidget):
def __init__(self):
super(EmitSignal,self).__init__()
self.customSignal = pyqtSignal()
def emitCustomSignal(self):
self.customSignal.emit()
资源文件
在QtDesigner引用资源文件之前,需要先准备一个qrc文件,它跟xml文件比较类似,用来制定资源文件的路径
<RCC version="1.0">
<qresource>
<file>qt.png</file>
<file>penguin.jpg</file>
</qresource>
</RCC>
然后引用
将UI文件转为python代码
pyuic5 -o firstPyQt5.py firstPyQt5.ui
pyqt线程
启动界面的线程暂称为UI线程。界面执行命令时都在自己的UI线程中。
如果在UI线程中执行网络连接和数据库操作等耗时的操作,界面会被卡住,Windows下有可能会出现“无响应”的警告。
阻塞UI线程会降低用户体验和应用稳定性。因此我们可以把耗时操作放在线程中去执行。
QThread代表一个线程,我们可以复写run函数来执行我们要的操作。
QThread可以使用 QtCore.pyqtSignal 来与界面交互和传输数据。
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'hh.ui'
#
# Created by: PyQt5 UI code generator 5.10.1
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtWidgets
class TimeThread(QtCore.QThread):
signal_time = QtCore.pyqtSignal(str, int) # 信号
def __init__(self, parent=None):
super(TimeThread, self).__init__(parent)
self.working = False
self.num = 0
def start_timer(self):
self.num = 0
self.working = True
def stop_timer(self):
self.working=False
def run(self):
while self.working:
self.signal_time.emit("Running time:", self.num) # 发送信号
self.num += 1
self.sleep(1)
class Ui_MainWindow(object):
def __init__(self):
super(Ui_MainWindow, self).__init__()
self.timer_t = TimeThread()
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(350, 170, 300, 23))
self.pushButton.setObjectName("pushButton")
self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_2.setGeometry(QtCore.QRect(270, 240, 75, 23))
self.pushButton_2.setObjectName("pushButton_2")
self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_3.setGeometry(QtCore.QRect(420, 240, 75, 23))
self.pushButton_3.setObjectName("pushButton_3")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 23))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
self.addslot()
def addslot(self):
self.timer_t.signal_time.connect(self.update_timer_tv)
# add signal an slot
self.pushButton_2.clicked.connect(self.click_start_btn)
self.pushButton_3.clicked.connect(self.timer_t.stop_timer)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton.setText(_translate("MainWindow", "wait"))
self.pushButton_2.setText(_translate("MainWindow", "start"))
self.pushButton_3.setText(_translate("MainWindow", "quit"))
def click_start_btn(self):
if(~self.timer_t.isRunning()):
self.timer_t.start()
self.timer_t.start_timer()
def update_timer_tv(self, text, number):
self.pushButton.setText(text + " " + str(number))
main.py
# -*- coding: utf-8 -*-
__author__ = 'maolanhan@gmail.com'
import sys
from PyQt5.QtWidgets import QApplication , QMainWindow
from hh import *
if __name__=="__main__":
app=QApplication(sys.argv)
mainWindow=QMainWindow()
ui=Ui_MainWindow()
ui.setupUi(mainWindow)
mainWindow.show()
sys.exit(app.exec_())
结果: