悠闲博客-blog.yxrjt.cn

手把手教你学习PyQT5:6PyQt5信号与槽(事件处理、数据传递等)以及关联控件6

更新时间: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

栏目分类

联系方式
  • help@yxrjt.cn
  • lgc@yxrjt.cn
  • admin@yxrjt.cn