文章目录
- pip 安装
- Designer 工具可视化拖拽创建UI
- designer.exe
- VS Code 插件
- PYQT Integration
- 生成UI文件
- 通过 PyUic 编译成UI_xxx.py文件
- 调用生成的Ui画面
- QApplication
- window.show()
- app.exec_()
- 事件处理
- 低级事件处理程序
- 信号和插槽( Signals and Slots)
pip 安装
需要同时安装 PyQt5 和 pyqt5-tools
$ pip install PyQt5
$ pip install pyqt5-tools
以上安装缓慢,可以使用国内源安装
$ pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyqt5
$ pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyqt5-tools
Designer 工具可视化拖拽创建UI
designer.exe
参考查找路径: .venv\Lib\site-packages\qt5_applications\Qt\bin\designer.exe
.venv是本人创建的虚拟环境目录,根据自身环境位置进行查找
VS Code 插件
PYQT Integration
首次建立窗体时,会弹出一个文件选择框,用来选择 Designer.exe 所在路径
也可以点击扩展设置按钮手动配置d:\Code\ZGPythonCode\.venv\Lib\site-packages\qt5_applications\Qt\bin\designer.exe
另外,还需设置Pyuic路径
D:\Code\ZGPythonCode\.venv\Scripts\pyuic5.exe
生成UI文件
通过可视化的拖动工具Designer 生成的UI文件后缀为.ui
即为XML结构的图形界面数据,实际使用时,需要将其转化成Python可使用的QT语法
SocketServer.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>282</width>
<height>101</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
...
...
通过 PyUic 编译成UI_xxx.py文件
Ui_SocketServer.py
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(327, 132)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.btnOpenListener = QtWidgets.QPushButton(self.centralwidget)
self.btnOpenListener.setGeometry(QtCore.QRect(40, 30, 75, 23))
self.btnOpenListener.setObjectName("btnOpenListener")
self.btnCreateHtml = QtWidgets.QPushButton(self.centralwidget)
self.btnCreateHtml.setGeometry(QtCore.QRect(140, 30, 75, 23))
self.btnCreateHtml.setObjectName("btnCreateHtml")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 327, 21))
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)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.btnOpenListener.setText(_translate("MainWindow", "开启监听"))
self.btnCreateHtml.setText(_translate("MainWindow", "生成Html"))
调用生成的Ui画面
文件结构
SocketServer.py
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget
from ui.Ui_SocketServer import Ui_MainWindow # 在此导入自定义界面类
''' 创建类继承自 QMainWindow, Ui_MainWindow '''
class SocketServer(QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.btnOpenListener.clicked.connect(self.runServer)
self.btnCreateHtml.clicked.connect(self.formatUrl)
def runServer(self):
print("runServer Clicked")
def formatUrl(self):
print("formatUrl Clicked")
if __name__ == "__main__":
app = QApplication(sys.argv)
win = SocketServer()
win.show()
sys.exit(app.exec_())
QApplication
提供了整个图形界面程序的底层管理功能,比如:初始化、程序入口参数的处理,用户事件(对界面的点击、输入、拖拽)分发给各个对应的控件,等等…
因为QApplication要做很多初始化操作,所以必须在任何界面控件对象创建前,先创建它。
window.show()
放在主窗口的控件,要能全部显示在界面上, 必须调用show()方法
app.exec_()
进入QApplication的事件处理循环,接收用户的输入事件,并且分配给相应的对象去处理。
事件处理
低级事件处理程序
作用类似于C#的 Application.DoEvents()
即在耗时或跨线程时刷新界面UI
QApplication.processEvents()
信号和插槽( Signals and Slots)
注意事项:
事件在绑定时不要带括号,即直接传入方法名即可
# 第一种绑定方式
QtCore.QObject.connect(widget, QtCore.SIGNAL(‘signalname’), slot_function) # 如:
QObject.connect(b2, SIGNAL("clicked()"), b2_clicked)
# 第二种绑定方式
widget.signal.connect(slot_function) # 如:
b1.clicked.connect(b1_clicked)
构造方法内绑定事件
def __init__(self):
super().__init__()
self.setupUi(self)
self.btnOpenListener.clicked.connect(self.runServer)
self.btnCreateHtml.clicked.connect(self.formatUrl)