更新时间:2025-09-28 18:18点击:41
六、PyQt5信号与槽(事件处理、数据传递等)以及关联控件QPushButton、QRadioButton、QcheckBox、QComboBox等
6-1、PyQt5信号与槽的介绍
PyQt5中的信号: 用于在对象之间传递信息的一种机制。一个信号表示了一个事件或状态的变化,当这个事件或状态变化时,信号被发射(emit)。可以将信号连接到一个或多个槽函数中,当信号被发射时,连接的槽函数会被调用执行。槽函数则是用于接收和处理信号的函数。(槽本质上就是一个函数或者方法)
在PyQt5中,使用connect()方法来将信号连接到槽函数中。connect()方法的基本语法为:
sender.signal.connect(receiver.slot)
其中,sender表示发送信号的对象,signal表示信号的名称,connect()方法将信号signal连接到receiver对象的槽函数slot中。槽函数可以是任何可调用的Python函数。
除了基本的信号和槽连接,PyQt5还支持一些高级的信号和槽机制,如:
使用自定义信号:可以定义自己的信号,并将其连接到槽函数中。自定义信号可以通过QObject类的signal()方法定义,并使用emit()方法发射信号。
使用Lambda表达式:可以使用Lambda表达式作为槽函数,Lambda表达式可以简洁地表示一个函数。
使用信号参数:PyQt5中的信号可以带有参数,参数可以在信号发射时被传递给槽函数。
一个信号连接多个槽函数:可以将一个信号连接到多个槽函数中,所有的槽函数都会在信号被发射时被调用执行。
信号和槽机制是PyQt5中非常重要的一个概念,可以用于实现各种功能,如用户界面响应、事件处理、多线程通信等。对于PyQt5的学习和使用来说,熟悉信号和槽机制是至关重要的。
6-2、在Qt Designer中的操作
以下为在Qt Designer中的编辑信号与槽:

详细的操作步骤:
创建一个按钮
点击菜单中的编辑信号/槽
拖动按钮,得到如图所示的对话框
左侧为信号对应的函数,即点击button发生的事件,(下边继承的信号与槽打对勾,显示右侧函数)
右侧为槽,即信号对应的触发事件
点击ok,则按钮点击之后就会触发关闭窗口事件。

6-3、QPushButton介绍
**QPushButton是Qt中常用的按钮控件,可以用于在GUI中创建各种类型的按钮,如普通按钮、复选框按钮、单选框按钮等。**它继承自QAbstractButton类,因此具有QAbstractButton类的所有特性和方法。
QpushButton的构造函数如下:
QPushButton(parent=None)
QPushButton(str, parent=None)
QPushButton(QIcon, str, parent=None)
其中,第一个构造函数创建一个无标签的按钮;第二个构造函数创建一个有标签的按钮;第三个构造函数创建一个既有图标又有标签的按钮。
QPushButton可以通过调用:
setText()方法设置按钮的文本标签,
setIcon()方法设置按钮的图标。
setEnabled()用于设置按钮是否可用
setFlat()用于设置按钮是否平面、setCheckable()用于设置按钮是否可选中等。
QPushButton还可以通过信号与槽机制来响应用户的点击事件。当用户单击按钮时,会发出clicked()信号,可以通过连接这个信号来执行特定的操作,例如在文本框中显示一个消息或启动一个特定的函数。此外,QPushButton还支持其他一些与点击相关的信号和槽,例如pressed()和released()信号,用于在按钮被按下和释放时执行操作。
以下是一个简单的示例,演示如何创建一个QPushButton并设置其文本标签、图标和点击事件:
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QLabel, QHBoxLayout, QVBoxLayout, QWidget
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import Qt
class MyMainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('QPushButton Demo')
self.setGeometry(300, 300, 400, 300)
# 创建一个QPushButton并设置文本标签和图标
btn = QPushButton('Click me!', self)
btn.setIcon(QIcon('icon.png'))
# 连接按钮的clicked信号到槽函数onBtnClicked
btn.clicked.connect(self.onBtnClicked)
# 创建一个QLabel用于显示按钮状态
self.label = QLabel('Button not clicked', self)
# 创建水平布局和垂直布局,并将按钮和标签添加到布局中
hbox = QHBoxLayout()
hbox.addStretch(1)
hbox.addWidget(btn)
hbox.addStretch(1)
vbox = QVBoxLayout()
vbox.addStretch(1)
vbox.addLayout(hbox)
vbox.addStretch(1)
vbox.addWidget(self.label, alignment=Qt.AlignCenter)
# 创建一个QWidget,并将垂直布局添加到QWidget中
widget = QWidget()
widget.setLayout(vbox)
self.setCentralWidget(widget)
def onBtnClicked(self):
self.label.setText('Button clicked')
if __name__ == '__main__':
app = QApplication(sys.argv)
win = MyMainWindow()
win.show()
sys.exit(app.exec_())
如下图为输出示例:

6-3、QRadioButton介绍
QRadioButton是一个单选按钮控件,可以用于从多个互斥的选项中选择一个选项。与QCheckBox不同,QRadioButton只允许选择一个选项。
QRadioButton控件的基本属性和方法包括:
setText():设置按钮的文本。
isChecked():检查按钮是否被选中。
setChecked():设置按钮的选中状态。
toggled():每当按钮的选中状态发生变化时,都会发出toggled()信号。
下边是一个简单示例:
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QRadioButton
class MyMainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('QRadioButton Demo')
self.setGeometry(300, 300, 400, 300)
# 创建两个单选框按钮
rb1 = QRadioButton('Option 1', self)
rb1.move(50, 50)
rb1.setChecked(True)
rb2 = QRadioButton('Option 2', self)
rb2.move(50, 80)
# 绑定toggled()信号
rb1.toggled.connect(self.onToggled)
rb2.toggled.connect(self.onToggled)
def onToggled(self, checked):
sender = self.sender()
if checked:
print(sender.text() + ' is checked')
if __name__ == '__main__':
app = QApplication(sys.argv)
win = MyMainWindow()
win.show()
sys.exit(app.exec_())
下图为输出图:

6-4、复选框控件(QcheckBox)介绍
QCheckBox是一个复选框控件,可以用于从多个选项中选择一个或多个选项。与QRadioButton不同,QCheckBox允许选择多个选项。
QCheckBox控件的基本属性和方法包括:
setText():设置复选框的文本。
isChecked():检查复选框是否被选中。
setChecked():设置复选框的选中状态。
stateChanged():每当复选框的选中状态发生变化时,都会发出stateChanged()信号。
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QCheckBox
class MyMainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('QCheckBox Demo')
self.setGeometry(300, 300, 400, 300)
# 创建两个复选框
cb1 = QCheckBox('Option 1', self)
cb1.move(50, 50)
cb2 = QCheckBox('Option 2', self)
cb2.move(50, 80)
# 绑定stateChanged()信号
cb1.stateChanged.connect(self.onStateChanged)
cb2.stateChanged.connect(self.onStateChanged)
def onStateChanged(self, state):
sender = self.sender()
if state == 2:
print(sender.text() + ' is checked')
else:
print(sender.text() + ' is unchecked')
if __name__ == '__main__':
app = QApplication(sys.argv)
win = MyMainWindow()
win.show()
sys.exit(app.exec_())
下列为输出:

6-5、下拉列表控件(QComboBox)介绍
QComboBox是一个下拉列表控件,允许用户从预定义的一组选项中选择一个或多个选项。它通常用于表示枚举类型的值或选择一组预定义的选项。
QComboBox控件的基本属性和方法包括:
addItem():添加一个项到下拉列表中。
addItems():添加多个项到下拉列表中。
setCurrentIndex():设置当前选中的项的索引。
currentText():返回当前选中的项的文本。
currentIndexChanged():每当当前选中的项发生变化时,都会发出currentIndexChanged()信号。
下面是一个简单的演示示例:
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QComboBox
class MyMainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('QComboBox Demo')
self.setGeometry(300, 300, 400, 300)
# 创建一个下拉列表并添加几个选项
combo = QComboBox(self)
combo.addItem('Option 1')
combo.addItem('Option 2')
combo.addItem('Option 3')
combo.move(50, 50)
# 绑定currentIndexChanged()信号
combo.currentIndexChanged.connect(self.onIndexChanged)
def onIndexChanged(self, index):
# 选择下拉列表的某一项时,sender.currentText()对应的为数字1、2、3。
# 即在选择时,使用sender.currentText()来做出选择每一项对应的操作。
sender = self.sender()
print('Current selection is ' + sender.currentText())
if __name__ == '__main__':
app = QApplication(sys.argv)
win = MyMainWindow()
win.show()
sys.exit(app.exec_())
下图为输出:

6-9、Button综合案例
以下是一个综合案例,展示了如何使用多个QPushButton,包括普通按钮、复选框按钮、单选框按钮和菜单按钮,并演示了这些按钮的基本用法和属性。
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QCheckBox, QRadioButton, QMenu, QAction
class MyMainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('QPushButton Demo')
self.setGeometry(300, 300, 400, 300)
# 创建一个普通按钮和一个带图标的按钮
btn1 = QPushButton('Button', self)
btn1.move(30, 50)
btn2 = QPushButton(self)
btn2.setIcon(QIcon('switchicon.png'))
btn2.move(150, 50)
# 创建一个复选框按钮
cb = QCheckBox('Show Title', self)
cb.move(30, 100)
cb.stateChanged.connect(self.toggleTitle)
# 创建两个单选框按钮
rb1 = QRadioButton('Button 1', self)
rb1.move(30, 150)
rb2 = QRadioButton('Button 2', self)
rb2.move(150, 150)
# 创建一个菜单按钮和一个菜单
mb = QPushButton('Menu', self)
mb.move(30, 200)
menu = QMenu(self)
menu.addAction('Action 1', self.onAction1)
menu.addAction('Action 2', self.onAction2)
mb.setMenu(menu)
def toggleTitle(self, state):
if state == Qt.Checked:
self.setWindowTitle('QPushButton Demo - Title Visible')
else:
self.setWindowTitle('QPushButton Demo')
def onAction1(self):
print('Action 1 clicked')
def onAction2(self):
print('Action 2 clicked')
if __name__ == '__main__':
app = QApplication(sys.argv)
win = MyMainWindow()
win.show()
sys.exit(app.exec_())
输出展示如下图所示:

6-10、控件综合案例
以下是一个使用PyQt5中的各种控件的综合案例,包括标签、按钮、文本框、列表框、进度条、滑块、单选框和复选框。
在这个例子中,我们创建了一个名为MyWindow的QWidget窗口,并向它添加了标签、按钮、文本框、列表框、进度条、滑块、单选框和复选框等控件。我们使用QVBoxLayout和QHBoxLayout等布局管理器将控件放置在窗口中,使用QGroupBox将单选框和复选框包含在一个控件组合框中。我们还绑定了按钮的点击事件,以便在点击按钮时执行一些操作。
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QLineEdit, QListWidget, QProgressBar, QSlider, QRadioButton, QCheckBox, QVBoxLayout, QHBoxLayout, QGroupBox
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("Widget Example")
# 创建标签、按钮和文本框控件
label = QLabel("Enter your name:")
button = QPushButton("Submit")
self.text_box = QLineEdit()
# 创建列表框控件
list_widget = QListWidget()
list_widget.addItems(["Item 1", "Item 2", "Item 3"])
# 创建进度条和滑块控件
progress_bar = QProgressBar()
slider = QSlider()
slider.setOrientation(1)
slider.setRange(0, 100)
slider.setValue(50)
slider.valueChanged.connect(progress_bar.setValue)
# 创建单选框和复选框控件
radio_button_1 = QRadioButton("Option 1")
radio_button_2 = QRadioButton("Option 2")
check_box = QCheckBox("Check me")
# 将控件添加到布局中
v_layout_1 = QVBoxLayout()
v_layout_1.addWidget(label)
v_layout_1.addWidget(self.text_box)
v_layout_1.addWidget(button)
v_layout_1.addWidget(list_widget)
v_layout_2 = QVBoxLayout()
v_layout_2.addWidget(progress_bar)
v_layout_2.addWidget(slider)
h_layout = QHBoxLayout()
h_layout.addWidget(radio_button_1)
h_layout.addWidget(radio_button_2)
h_layout.addWidget(check_box)
# 创建控件组合框
group_box = QGroupBox("Options")
group_box.setLayout(h_layout)
# 将布局添加到主布局中
main_layout = QVBoxLayout()
main_layout.addLayout(v_layout_1)
main_layout.addLayout(v_layout_2)
main_layout.addWidget(group_box)
# 设置主布局
self.setLayout(main_layout)
# 绑定按钮的点击事件
button.clicked.connect(self.button_clicked)
# 按钮的点击事件
def button_clicked(self):
name = self.text_box.text()
print("Hello,", name)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec_())
以下为输出图:

原文链接:https://blog.csdn.net/weixin_42475060/article/details/130327901