0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

详细介绍Qt的信号与槽交流机制

OpenCV学堂 来源:OpenCV开发者联盟 2023-02-21 09:35 次阅读

引言

前面讲各种事件响应的时候说过一些关于信号与槽的绑定,实现相关的事件响应,但是并没有深入跟详细的介绍,之前的事件信号基本上都是QT的build-in信号,响应的槽函数基本上都是用户自定义的函数,本文将会详细介绍Qt的信号与槽交流机制。

元对象系统

PyQT5中QGUI中当用户改动一个QWidget的状态时,可以通过支持的信号触发相关的槽函数完成动作交互。其它的GUI库多数都是通过Callback(回调)实现消息传递与触发,QT的这种方法在更广泛的层面是它底层的元数据对象系统(Meta-Object System )。元数据对象系统提供了信号与槽机制在不同的对象内容交互数据与信息,元数据对象支持信号与槽机制主要依赖:

- 所有的QWidget对象都是QObject类都是元数据
- C++使用Q_OBJECT宏定义在私有变量中的类才是元数据
- 元数据对象编译器会提供QObject类子类完成必要的代码实现元对象特性

信号与槽

信号与槽机制中在GUI层面的信号主要是指靠用户触发特定事件产生,所以QWidget对象不同GUI组件预定义了大量的内置信号,开发者在使用这些QWidget组件时只要把这些信号绑定到自定义的槽函数即可实现特定事件的响应触发特定方法。任意一个绑定信号的响应函数都可以被称为槽函数,槽函数跟信号是松散耦合的关系,只有当槽函数被链接到特定信号的时候它才会响应特定事件。一个槽函数可以被链接到多个信号实现响应,同样一个信号可以被不同的槽函数链接。信号与槽是QT编程架构中最重要的组件之一。

信号

PyQT5中的信号分为两种一种是build-in的信号,主要是跟不同QWidget组件产生特定关联,比如valueChanged、toggled、clicked等这些信号;另外一类信号是开发者自定义信号,这些信号可以帮助开发者实现数据交互、特定界面刷新、在不同线程之间传递消息等等。builid-in的信号不需要开发者激发,开发者只要绑定到特定的槽函数即可实现在动作响应时自定激发;自定义信号必须通过显式调用的方式激发:

custom_signal.emit(parameters)

槽函数

任何一个正常的函数都可以成为槽函数,类的实例方法通过信号链接成为槽函数之后被直接调用而不需要开发者再初始类实例代码。相比直接通过接口回调的方式,信号与槽架构方式带来了很大的灵活性,但是同时也会带来更多的执行调用时间,QT官方文档指出这样方法相比回调响应过程会慢一点。

代码演示部分

代码演示部分只演示自定义信号跟自定义槽函数是如何工作的,build-in信号跟自定义槽函数在之前的文章中实际已经演示了很多次,这里不在重复代码演示。

数据类含有自定义信号

 1classMyTextData(QtCore.QObject):
 2fire_draw_text_signal=QtCore.pyqtSignal(str)
 3
 4def__init__(self):
 5super(MyTextData,self).__init__()
 6print("createmytext...")
 7self.text_content="OpenCV开发者联盟"
 8
 9deftext_changed(self,text):
10self.text_content=text
11self.fire_draw_text_signal.emit(self.text_content)
初始化,绑定自定义信号与自定义槽函数
1#初始化自定义数据类
2self.my_data=MyTextData()
3self.my_data.fire_draw_text_signal.connect(self.show_text)
4self.my_data.text_changed("自定义信号演示")
自定义槽函数
 1defshow_text(self,text):
 2painter=QtGui.QPainter(self.label.pixmap())
 3pen=QtGui.QPen(QtCore.Qt.green)
 4painter.setPen(pen)
 5font=QtGui.QFont()
 6font.setBold(True)
 7font.setPointSizeF(24)
 8painter.setFont(font)
 9painter.drawText(QtCore.QPoint(20,50),"OpenCV演示-"+text)
10painter.end()
触发与调用
 1defon_update_gray(self):
 2image=cv.imread("images/test5.png")
 3gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)
 4dst=cv.cvtColor(gray,cv.COLOR_GRAY2RGB)
 5height,width,channel=dst.shape
 6bytesPerLine=3*width
 7img=QtGui.QImage(dst.data,width,height,bytesPerLine,QtGui.QImage.Format_RGB888)
 8pixmap=QtGui.QPixmap(img)
 9pix=pixmap.scaled(QtCore.QSize(620,500),QtCore.Qt.KeepAspectRatio)
10self.label.setPixmap(pix)
11self.my_data.text_changed("图像灰度化")
会自动绘制指定文本到QLabel标签的图像上,代码运行结果如下:

41de6f62-b131-11ed-bfe3-dac502259ad0.png

42074ff4-b131-11ed-bfe3-dac502259ad0.png

42307f32-b131-11ed-bfe3-dac502259ad0.png






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • GUI
    GUI
    +关注

    关注

    3

    文章

    660

    浏览量

    39699
  • 回调函数
    +关注

    关注

    0

    文章

    87

    浏览量

    11566
  • pyqt5
    +关注

    关注

    0

    文章

    25

    浏览量

    3403

原文标题:PyQT5开发之自定义信号与槽函数详解

文章出处:【微信号:CVSCHOOL,微信公众号:OpenCV学堂】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Qt信号机制(一)

    一. 简介就我个人来理解,信号机制与Windows下消息机制类似,消息机制是基于回调函数,Qt
    发表于 11-07 15:06

    Qt信号例子(二)

    ))); } //实现用于接受pb点击信号void MyMainWindows::SlotTest(){label->setText("clicked");//发送自定义的信号,请注意信号
    发表于 11-07 15:13

    QT自动链接信号机制

    name中的信号signal name和这个void on__()链接起来。这是QT不需要connect语句就可以自动链接信号
    发表于 11-13 09:17

    【NanoPi M1 Plus试用体验】【结项】-基于Qt环境下的FTP服务工具开发

    Designer进行界面设计,由一个主界面和三个子界面组成。(3)添加代码 建立信号函数映射机制信号
    发表于 06-08 14:51

    请问Qt编程中信号信号处理程序的使用方法?

      信号作为Qt的和新机制,在Qt编程中有着非常广泛的应用。  事实上,我们在Qt开发中,要
    发表于 11-20 08:03

    信号是如何实现连接的呢

    1.的连接过程分析Unix Signal产生者(键盘) --> 绑定[signal(id,某函数())] --> 接受者(“.c文件中的函数处理”)Qt 信号产生者(按钮等
    发表于 01-18 09:48

    基于Qt的遥控式设备控制的设计与实现

    采用Qt 的一次编写多处编译运行机制和其强大的信号机制,首先基于Qt 设计了遥控式控制设备的
    发表于 08-17 08:37 14次下载

    Qt5主窗体的详细中文资料免费下载

    本文档的主要内容详细介绍的是Qt5主窗体的详细中文资料免费下载内容包括了:Qt 5主窗体构成,Qt
    发表于 08-01 08:00 0次下载
    <b class='flag-5'>Qt</b>5主窗体的<b class='flag-5'>详细</b>中文资料免费下载

    Qt5位置相关函数及图形与图片的详细资料免费下载

    本文档的主要内容详细介绍的是Qt5位置相关函数及图形与图片的详细资料免费下载内容包括了:Qt 5位置相关函数,
    发表于 08-01 08:00 0次下载
    <b class='flag-5'>Qt</b>5位置相关函数及图形与图片的<b class='flag-5'>详细</b>资料免费下载

    Qt Creator的详细资料简介

    本文档的主要内容详细介绍的是Qt Creator的详细资料简介包括了:1 Qt Creator的下载和安装2
    发表于 12-26 16:59 33次下载
    <b class='flag-5'>Qt</b> Creator的<b class='flag-5'>详细</b>资料简介

    Qt5 学习之路及嵌入式开发教程3:设计器Designer实现信号例子

    Qt5 学习之路及嵌入式开发教程3:设计器Designer实现信号例子一、界面设计1、单击运行Qt Creator,新建项目选择,出现“项目介绍
    发表于 11-03 19:06 1次下载
    <b class='flag-5'>Qt</b>5 学习之路及嵌入式开发教程3:设计器Designer实现<b class='flag-5'>信号</b><b class='flag-5'>槽</b>例子

    Qt编程基础之信号机制

    在使用信号的类中,必须在类的定义中加入宏Q_OBJECT。当一个信号被发射时,与其关联的函数会被立即执行,就像正常调用一个函数一样。只有当信号
    的头像 发表于 09-06 13:01 1091次阅读

    一文详解Qt信号函数机制

    信号用于多个对象之间的通信。信号机制Qt的核心特性,也是
    的头像 发表于 02-07 09:14 3272次阅读

    Qt“懒人写法”之一键破“

    在《Qt信号函数机制,此篇足矣》一文中已经描述了Qt信号
    的头像 发表于 02-09 17:23 1011次阅读

    Qt“灵魂”之Meta-Object系统

    Meta-Object即是Qt的元对象系统,下文都以元对象系统进行描述。在Qt中,具有标志性特征的则是信号函数机制,该
    的头像 发表于 02-10 13:50 1991次阅读