| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> Qt 信号和槽的机制(超详细整理的Qt信号和槽) -> 正文阅读 |
|
[C++知识库]Qt 信号和槽的机制(超详细整理的Qt信号和槽) |
Qt 信号和槽的机制首先说声对不起,上次在PyQt5中写信号与槽,由于时间原因没有写完。有小伙伴留言说,希望把这章补全。所以,这是一篇迟来的文章,再次向大家说声抱歉。 一、桌面程序的结构Qt的使用场景,主要是应用于桌面程序来使用,不管你使用的操作系统平台是什么。对于桌面程序来说,最重要的就是交互了。既然有交互,就需要一个窗口系统了。 窗口系统实现了桌面程序的主要逻辑,并提供了一套基于事件驱动的编程框架。Qt同样也提供了这样的一套逻辑。 我们常见的桌面程序的结构,如下图所示: ?所以,我们可以看到,在桌面程序中我们需要对窗口系统的一些操作作出相应,也就是事件。 二、事件实现事件的机制通常有两种。 一种是事件处理类,是用回调函数来实现。 另一种叫委托,就是事件的处理不是收到事件的人自己来做,而是把它委托给了别人来做。Qt就提供了这样的一种机制:信号和槽。 三、信号和槽信号与槽是Qt特有的的消息传输机制,在Qt中信号与槽用得十分广泛。在编程的过程中,我们都会遇到消息传递的事情,本质上就是发出命令(信号、消息),执行命令(相应的执行)。 比如单击窗口上一个按钮然后弹出一个对话框,那么就可以将这个按钮的单击信号和自定义的槽关联起来,信号是按钮的单击信号,槽实现了创建一个对话框并显示的功能。 信号与槽就是实现对象之间通信的一种机制,在其他编程语言中也有通过回调机制来实现对象之间的通信。
信号槽是设计模式观察者模式的一种实现: A、一个信号就是一个能够被观察的事件,或者至少是事件已经发生的一种通知;
然后,实现信号和槽,就要说一下Qt的元对象系统。 四、Qt元对象系统Qt 的元对象系统叫 Mate-Object-System,提供了对象之间通信的信号与槽机制、运行时类型信息和动态属性系统。 但是,元对象是基于三个条件的: ?1、该类必须继承自Qobject类 ?2、必须在类的私有声明区声明Q_OBJECT宏(在类定义的时候,如果没有指定public, ?3、 元对象编译器Meta-Object Compiler(moc)为 QObject的子类实现元对象? 有了元对象系统后,我们就可以使用Qt的信号和槽了。 五、信号和槽的格式信号与槽关联是用 QObject::connect() 函数实现的,其基本格式是:
在Qt 5中提供了一种新的格式:
具体的使用哪种格式,就看个人的喜好了。 注:在日常的项目编程中,如果第一种的connect方式出现报错,你可以尝试使用第二种connect方式。 六、connect的第五个参数在connect函数中除了上面介绍的四个参数外,还有第五个参数,是缺省的参数。我们打开qobject.h文件可以看到它的定义,如下所示:
最后一个参数所表示的意思: Qt::AutoConnection:信号的发送者与信号的接收者在同一线程,则默认使用Qt::DirectConnection:如果不在同一线程,则默认 ?使用Qt::QueuedConnection。 介绍到这里,信号和槽的基本内容就写完了。但是,还是得说下Qt事件(你可以结合着上面第2节一起看)。 七、Qt事件无论是什么桌面操作系统,每个进程都有一个全局的事件队列(Event Queue)。当我们在键盘上按了一个键、移动或者点击鼠标、触摸屏幕等等,都会产生一个事件(Event),并由操作系统负责将它扔到进程的事件队列。 扔到事件队列后,它会等待以后的某一个时刻发送。分配器(dispatcher )会遍历事件队列,并且将入栈的事件发送到它们的目标对象当中,因此它们被称为事件循环(Event loop)。 Qt中是通过运行QCoreApplication::exec()来进入Qt的主体事件循环的;这会引发阻塞,直至QCoreApplication::exit() 或者 QCoreApplication::quit() 被调用,进而结束循环。 写到这里就先结束吧,再次向大家说声抱歉,这篇迟来的文章-关于信号和槽的,欢迎大家一起交流一起进步。 本文原创作者:冯一川(ifeng12358@163.com),未经作者授权同意,请勿转载。 |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 12:06:37- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |