文章目录

  • 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

Pythonqt5怎么连接后台 python qt5 gui_designer


首次建立窗体时,会弹出一个文件选择框,用来选择 Designer.exe 所在路径

也可以点击扩展设置按钮手动配置
d:\Code\ZGPythonCode\.venv\Lib\site-packages\qt5_applications\Qt\bin\designer.exe

Pythonqt5怎么连接后台 python qt5 gui_pyqt5_02

另外,还需设置Pyuic路径

D:\Code\ZGPythonCode\.venv\Scripts\pyuic5.exe

Pythonqt5怎么连接后台 python qt5 gui_pyqt5_03

生成UI文件

通过可视化的拖动工具Designer 生成的UI文件后缀为.ui
即为XML结构的图形界面数据,实际使用时,需要将其转化成Python可使用的QT语法

SocketServer.ui

Pythonqt5怎么连接后台 python qt5 gui_Pythonqt5怎么连接后台_04


Pythonqt5怎么连接后台 python qt5 gui_designer_05

<?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画面

文件结构

Pythonqt5怎么连接后台 python qt5 gui_vscode_06

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)