目录
一、信号与槽机制:
二、信号与槽使用方法:
(1)使用Qt Designer 的信号与槽编辑器:
(2)使用固定语法直接建立信号槽连接:
三、PyQt小部件及其触发信号:
(1)常见PyQt小部件及其触发信号:
(2) PyQt5 官方文档:
四、PyQt5 基本小部件:
一、信号与槽机制:
PyQt5中的信号和槽机制是一种事件驱动编程范式,允许小部件(如按钮和菜单项)在特定用户交互发生时发出信号,并将这些信号连接到槽函数,即定义好的响应动作,从而实现用户界面与程序逻辑的松耦合和交互响应。
PyQt中的小部件作为事件源,通过继承QObject
类获得发出信号的能力。信号是事件通知,而槽是响应这些事件的函数。响应事件函数可以为任意可调用的python函数。
信号与槽机制具有以下特点。
-
一个信号可以连接到多个槽。
-
一个信号也可以连接到另一个信号。
-
Signal 参数可以是任何 Python 类型。
-
一个槽可以连接到许多信号。
-
连接可以是直接的(即同步的)或排队的(即异步的)。
-
可以跨线程建立连接。
-
信号可能会断开连接。
二、信号与槽使用方法:
(1)使用Qt Designer 的信号与槽编辑器:
首先先创建Qt Designer 文件,并在窗口内添加小部件如下:
【PyQt5教程 一】Qt Designer 安装及其使用方法说明,附程序源码
然后,点击信号与槽编辑器的+号,添加信号与槽:
添加过程
添加完成后保存.ui文件,并使用:
pyuic5 -x Signalandslot.ui -o Signalandslot.py
转化为对应的.py文件。Signalandslot.py如下:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'Signalandslot.ui'
#
# Created by: PyQt5 UI code generator 5.15.11
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
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.Button1 = QtWidgets.QPushButton(self.centralwidget)
self.Button1.setGeometry(QtCore.QRect(140, 450, 93, 28))
self.Button1.setObjectName("Button1")
self.Button2 = QtWidgets.QPushButton(self.centralwidget)
self.Button2.setGeometry(QtCore.QRect(540, 450, 93, 28))
self.Button2.setObjectName("Button2")
self.line_text = QtWidgets.QLineEdit(self.centralwidget)
self.line_text.setGeometry(QtCore.QRect(290, 190, 171, 41))
self.line_text.setObjectName("line_text")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 26))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
self.Button1.clicked.connect(self.line_text.clear) # type: ignore
self.Button2.clicked.connect(MainWindow.close) # type: ignore
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.Button1.setText(_translate("MainWindow", "清空"))
self.Button2.setText(_translate("MainWindow", "退出"))
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_())
运行结果:
运行结果
(2)使用固定语法直接建立信号槽连接:
widget.signal.connect(slot_function)
widget为对应触发信号的小部件,signal为信号类型,connect(slot_function)为连接到的槽函数,其中slot_function可以为任意可调用的python函数。
例如之前.ui生成的.py中有:
self.Button1.clicked.connect(self.line_text.clear) # type: ignore
self.Button2.clicked.connect(MainWindow.close) # type: ignore
Button1,Button2为触发信号的小部件,clicked为触发的信号(即单击按钮),触发后执行槽函数,self.line_text.clear(清空line_text中的文本),MainWindow.close(关闭主窗口)。
三、PyQt小部件及其触发信号:
PyQt中的信号和槽机制允许小部件(Widgets)在特定事件发生时发出信号,并将这些信号连接到槽函数上,以便执行相应的操作。
(1)常见PyQt小部件及其触发信号:
QPushButton(按钮):
clicked
信号:当按钮被点击时触发。可以传递一个布尔值,表示按钮是否被按下。btn.clicked.connect(lambda: some_function(True))
pressed
信号:当鼠标按下按钮时触发。btn.pressed.connect(some_function)
released
信号:当鼠标释放按钮时触发。btn.released.connect(some_function)
QCheckBox(复选框):
stateChanged
信号:当复选框的选中状态改变时触发。传递一个整数参数,表示新的复选框状态(0表示未选中,2表示选中)。checkbox.stateChanged.connect(some_function)
QRadioButton(单选按钮):
toggled
信号:当单选按钮的选中状态改变时触发。传递一个布尔值参数,表示当前是否被选中。radiobutton.toggled.connect(some_function)
QSlider(滑动条):
valueChanged
信号:当滑动条的值改变时触发。传递一个整数参数,表示滑动条的新值。slider.valueChanged.connect(some_function)
rangeChanged
信号:当滑动条的范围改变时触发。slider.rangeChanged.connect(some_function)
QListWidget(列表控件):
itemClicked
信号:当列表中的项被点击时触发。传递一个列表项对象作为参数。listwidget.itemClicked.connect(some_function)
itemDoubleClicked
信号:当列表中的项被双击时触发。listwidget.itemDoubleClicked.connect(some_function)
QComboBox(下拉列表框):
currentIndexChanged
信号:当下拉列表框的当前选中项改变时触发。传递一个整数参数,表示新的当前选中项的索引。combobox.currentIndexChanged.connect(some_function)
currentTextChanged
信号:当当前选中项的文本改变时触发。combobox.currentTextChanged.connect(some_function)
QLineEdit(文本输入框):
textChanged
信号:当文本框的内容改变时触发。传递一个字符串参数,表示文本框的新内容。lineedit.textChanged.connect(some_function)
editingFinished
信号:当编辑完成时触发,通常在用户按下回车键或离开编辑框时。lineedit.editingFinished.connect(some_function)
QTableWidget / QTreeView(表格和树视图):
itemClicked
信号:当表格或树中的项被点击时触发。table.itemClicked.connect(some_function)
itemDoubleClicked
信号:当表格或树中的项被双击时触发。table.itemDoubleClicked.connect(some_function)
QMainWindow / QDialog(主窗口 / 对话框):
accepted
信号:当对话框被接受时触发(例如,用户点击了OK按钮)。dialog.accepted.connect(some_function)
rejected
信号:当对话框被拒绝时触发(例如,用户点击了Cancel按钮)。dialog.rejected.connect(some_function)
(2) PyQt5 官方文档:
PyQt5 官方文档
四、PyQt5 基本小部件:
-
QLabel:用于显示文本或图像,不可编辑,可作为其他控件的辅助标签。
-
QLineEdit:单行文本输入框,适用于用户输入有限长度的文本。
-
QPushButton:按钮控件,点击时可触发预设的函数或动作。
-
QRadioButton:单选按钮,允许在多个选项中选择一个,适用于互斥选择。
-
QCheckBox:复选框,允许用户选择或取消选择一个选项,适用于多选场景。
-
QComboBox:下拉列表框,显示当前选中项,用户可从中选择一个选项。
-
QSpinBox:数字输入框,带有两个按钮用于增加或减少数值。
-
QSlider:滑动条控件,用户通过移动滑块选择一个有界值。
-
QMenuBar, QMenu & QAction:菜单栏、菜单和动作,用于组织和访问应用程序的功能。
-
QToolBar:工具栏,包含按钮和其他控件,提供快速访问常用功能。
-
QInputDialog:预配置对话框,用于收集用户输入的文本。
-
QFontDialog:字体选择对话框,返回用户选择的字体。
-
QFileDialog:文件选择对话框,用于浏览和选择文件。
-
QTabWidget:选项卡控件,允许将多个表单组织在不同的选项卡中。
-
QStackedWidget:堆叠控件,用于在有限空间内切换不同的表单或控件。
-
QSplitter:分割器控件,允许动态调整子控件的大小。
-
QDockWidget:可停靠窗口,可以浮动或附着在主窗口的边缘。
-
QStatusBar:状态栏,用于显示状态信息。
-
QListWidget:列表控件,用于显示和管理项目列表。
-
QScrollBar:滚动条,用于浏览超出可视区域的内容。
-
QCalendarWidget:日历控件,用于选择日期。