欢迎光临散文网 会员登陆 & 注册

信号和槽关联

2021-12-08 09:52 作者:海鸥之道  | 我要投稿

    信号(signal)和槽(slot)是Qt的核心机制。在创建事件循环之后,通过建立信号和槽的连接就可以实现对象之间的通信。当信号发射(emit)时,连接的槽函数将会自动执行。在 PyQt 5中,信号和槽通过QObject.signal.connectQ)连接。

    所有从 QObject类或其子类(如QWidget)派生的类都能够包含信号和槽。当对象改变其状态时,信号就由该对象发射出去。槽用于接收信号,但它们是普通的对象成员函数。多个信号可以与单个槽进行连接,单个信号也可以与多个槽进行连接。总之,信号和槽构建了一种强大的控件编程机制。

    在Qt编程中,通过Qt信号槽机制对鼠标或键盘在界面上的操作进行响应处理,例如对鼠标单击按钮的处理。Qt中的控件能够发射什么信号,以及在什么情况下发射信号,在Qt的文档中有说明,不同的控件能够发射的信号种类和触发时机也是不同的。

    那么如何为控件发射的信号指定对应的处理槽函数呢?一般有三种方法,第一种是在窗口的UI设计中操作添加信号和槽;第二种是通过代码连接信号和槽;第三种是通过Eric的“生成对话框代码”的功能产生信号和槽。

1、简单入门

    Qt Designer提供了基本的编辑信号槽方法。首先,新建一个模板名为“Widget”的简单窗口,该窗口文件名为MainWinsignalSlog01.ui。,它要实现的功能是,当单击关闭按钮后关闭窗口。

    在Qt Designer窗口左侧有一个 Buttons栏,找到QPushButton 控件,把它拖到窗体Form中。在属性编辑器中,找到按钮对应的 text属性,把属性值改为“关闭窗口”,并将objectName属性值改为“closeWinBtn”,如图所示。

单击工具栏上的“编辑信号/槽”(或者通过单击“Edit”(编辑)菜单→“编辑信号/槽”),进入信号槽编辑模式,可以直接在发射者(“关闭窗口”按钮)上按住鼠标左键不放,拖动到接收者(Form 窗体)上,这样就建立起了连接,如图

创建窗口设置

可以看到按钮控件会发射很多信号,只要选择一个信号,然后单击“OK”按钮,就会生成对应的槽函数对按钮发射的该信号进行处理。

由于要达到单击按钮关闭窗口的效果,所以这里勾选“显示从QWidget继承的信号和槽”复选框。在左侧的closeWinBtn 按钮的信号栏里选择clicked()信号,在右侧的Form槽函数中选择close(),这意味着对“关闭窗口”按钮单击会发射clicked信号,这个信号会被Form窗体的槽函数close()捕捉到,并触发该窗体的close行为(也就是关闭该窗体)。

连接信号和槽成功后,会发现在“编辑信号/槽”模式下,所创建的信号和槽关系的连线是红色的,如图所示。

设置完毕

此时,按esc键释放编辑信号和槽,恢复原来的状态。

将界面转换为python文件,自动生成的代码如下:

在使用pyuic5命令生成的Python代码中,是通过如下代码直接连接closeWinBtn按钮的 clicked()信号和槽函数Form.close()的。注意:使用 Q0bject.signal.connect()连接的槽函数不要加括号,否则会出错。

注意:通过pyuic5生成的代码中有这样一行代码:QtCore.QMetaObject.connectSlotsByName(closeWinBtn),这行代码属于信号与槽的高级应用,在这个案例中可有可无,第7章会对其进行重点解读。

其实现流程是:按钮是信号发射者,当单击按钮之后会发射一个信号,通过这行代码程序内部的通信机制知道这个按钮的单击事件被连接到窗体的关闭事件上,然后通知接收者窗体,可以运行槽函数close()。

为了使窗口的显示和业务逻辑分离,再新建一个调用窗口显示的文件CallMain WinsignalSlog01.py,其完整代码如下:

效果显示如图:

点击“关闭窗口”按键,则窗口关闭。


信号和槽关联的评论 (共 条)

分享到微博请遵守国家法律