Python编程实例-PyQt5 GUI编程-Signals & Slots及Events

Signals & Slots及Events

Qt GUI 应用程序是事件驱动的。 事件主要由应用程序的用户生成。 但它们也可以通过其他方式生成; 例如 Internet 连接、窗口管理器或计时器。 当调用应用程序的 execexec_ 方法时,应用程序进入主循环。 主循环获取事件并将它们发送给对象。

在事件模型中,有三个参与者:

  • 事件源
  • 事件对象
  • 事件目标

事件源是状态发生变化的对象。 它生成事件。 事件对象(event)封装了事件源中的状态变化。 事件目标是想要被通知的对象。 事件源对象将处理事件的任务委托给事件目标。

PyQt5 有一个独特的信号和槽机制来处理事件。 信号和槽用于对象之间的通信。 当特定事件发生时会发出信号。 插槽可以是任何 Python 可调用的。 发出连接信号时调用插槽。

在文中,将详细介绍PyQt的Singal、Slote和Event。

1、Signals & Slots

Signal(信号)是Qt小部件在发生某些事情时发出的通知。例如,从按下按钮,到输入框的文本发生变化,再到窗口的文本发生变化。 许多信号是由用户操作发起的,但也可以是其他方式,例如Internet连接、窗口管理器或计数器。

除了通知发生的事情外,信号还可以发送数据以提供有关发生情况的额外上下文。

在Qt中,除了小部件自带的信号之外,还支持自定义信号,这将在后面详细介绍。

Slots 是 Qt 用于信号接收器的名称。 在 Python 中,应用程序中的任何函数(或方法)都可以用作Slot——只需将信号连接到它即可。 如果信号发送数据,那么接收函数也将接收该数据。 许多 Qt 小部件也有自己的内置插槽,这意味着可以直接将 Qt 小部件连接在一起。

让我们看一下 Qt 信号的基础知识,以及如何使用它们来连接小部件以使事情发生在应用程序中。

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton


class MainWindow(QMainWindow):

    def __init__(self):
        super(MainWindow, self).__init__()

        self.setWindowTitle("PyQt5")
        # 创建QPushButton
        button = QPushButton("Click Me!")
        button.setCheckable(True)
        # 连接clicked事件
        button.clicked.connect(self.the_button_was_clicked)
        
        self.setCentralWidget(button)

    def the_button_was_clicked(self):
        print("Clicked!")


app = QApplication(sys.argv)

window = MainWindow()
window.show()

app.exec()

运行代码,当点击QPushButton时,控制台将输出如下消息:

Clicked!
Clicked!
Clicked!
Clicked!

1.1 接收数据

信号支持发送数据,在前面的例子中,我们设置QPushButton的checkable属性设置为True,这意味着,在clicked信号触发时,会发送QPushbutton的checkable值。为了接收该状态值,需要重新连接clicked信号:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton


class MainWindow(QMainWindow):

    def __init__(self):
        super(MainWindow, self).__init__()

        self.setWindowTitle("PyQt5")
        # 创建QPushButton
        button = QPushButton("Click Me!")
        # 设置可以点击
        button.setCheckable(True)
        # 连接clicked事件
        button.clicked.connect(self.the_button_was_clicked)
        button.clicked.connect(self.the_button_was_toggled)
        self.setCentralWidget(button)

    def the_button_was_clicked(self):
        print("Clicked!")

    def the_button_was_toggled(self, checked):
        print("Checked?", checked)

app = QApplication(sys.argv)

window = MainWindow()
window.show()

app.exec()

运行代码,点击QPushButton将得到如下结果:

Clicked!
Checked? True
Clicked!
Checked? False

1.2 数据储存

将小部件的当前状态存储在 Python 变量中通常很有用。 可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值