【教你学Qt桌面端开发】pt1:浅谈Qt:特色C++主义类库
还在为头脑简单看不懂代码而发愁吗?还在为思想浅薄只会人云亦云、拾人牙慧、鹦鹉学舌而遭人鄙夷吗?
《教你写代码》,从另一维度解读代码,让你成为见解独特的黑马观众。
教你学Qt桌面端开发栏目旨在帮助有一些基础,但仍停留在理论阶段、尚未入行或正在入行的同学如何快速高效地学习掌握Qt桌面端开发的关键技巧,既不适用于完全不懂C++的小白萌新,也不适用于完全懂了想要进一步提升自我。本栏目尽量少说或者不说具体模块,思考为主,实例为辅。
注:本文所有桌面端开发的教程都默认在Windows环境下使用Visual Studio开发。这是全宇宙最好的IDE,先相信,后相信。
【教你学Qt桌面端开发】pt1:浅谈Qt:特色C++主义类库
看到这里,C++学过的东西就不再重复了,只是聊聊在Qt中能给你在开发中带来哪些特点,和c++有什么不一样的地方,在后面的文章中就不再讨论这些了,默认看过都懂哈。
1.信号槽机制
信号槽机制是一个类似Windows消息机制的交互方案,比回调函数使用更简单方便,但效率不如回调函数的机制。我在实际的使用过程中感觉它更像是类似C#里的委托事件一样,效率虽比回调函数有几何倍的损失,但胜在调用方便,使用简洁灵活,不用在那种对时间精度要求较高或者并发量较大的软件系统内都是可以接受的。
Qt内部几乎所有的事件传递都是通过这个信号槽来进行的,比如Ui上的交互事件(比如点击按钮,文字改变等等)、网络事件(TCP连接等)、COM组件交互(COM事件)等等模块基本上都是这样的。
我们来看看信号槽的绑定方法:
//注:params指代参数组
QObject::connect(object1,SIGNAL(signal_object1(params)),object2,SLOT(slot_object2(params)));
信号槽是通过QObject的静态函数connect进行绑定的,也就是说信号槽只会在继承了QObject的类上生效,非QObject的类(Qt中会有一些非QObject的类)中是无法使用信号槽的,这点需要注意!后续不再使用这个形式,让我们回到函数
connect(object1,SIGNAL(signal_object1(params)),object2,SLOT(slot_object2(params)));
connect中,有四个参数,一般习惯上我们把触发方放在左边,把被接收方放在右边, 这段代码的意思就是:object1发出了信号signal_object(params),触发了object2的槽函数slot_object2(parmas)
信号函数和槽函数要怎么定义:
1.信号函数
只需要一个signals:关键字,不需要public private修饰,也不需要写函数实现,只需要声明出来。

在需要触发这个signals信号的地方通过emit signal_object1(int)的方式调用即可,如图所示

这样就可以把这个信号发送出去了,接下来说槽函数
2.槽函数
槽函数的话需要声明可见类型,比如public slots,private slots等等,这个仅代表可见类型。比如我们可以在头文件中这样声明:

注意,所有的槽函数一经声明就必须要写出实现,否则会出现LNK2019错误。
举个例子
比如我们写个例子,就拿按钮举例吧,

就像我们之前说的,UI中的很多交互是通过信号槽进行的,这里我可以告诉你这里按钮就提供了一些信号,比如这个按钮的点击事件就叫clicked,我们可以先记下,怎么找的我之后再说。
那我们来写个简单的槽函数,头文件里的声明就不写了。
void QtWidgetsApplication2::slot_object1()
{
//触发槽函数就会给textEdit中添加一行114514!
for(int i = 0;i<9;++i){
this->ui.textEdit->append("114514!");
}
}
ok,那么我们现在来绑定一下,我们就是要把这个按钮的点击信号绑定到这个槽函数slot_object1上,我们这样绑定:
connect(this->ui.pushButton,SIGNAL(clicked()),this,SLOT(slot_object1()));
ok那么现在这个点击按钮,也就是这个ui.pushButton的clicked信号也就和这个slot_object1绑定起来了,现在点击这个按钮的时候,这个slot_object就会触发了
如果没有触发,那么就要考虑一下你的connect是不是有问题了,可以尝试输出一下你的connect结果、检查一下你的槽函数格式是否正确,检查信号是否顺利发出。当然咯这个你都得自己去检查
ok那么简单的信号槽调用写完了,但是这样太麻烦了,有没有什么更简单的方法去调用呢?
UI控件的默认槽函数
我们知道像按钮有click,lineEdit有类似TextChanged等信号函数,那有没有什么比较方便的方法让我们直接调用呢?当然是有的。这就是qt提供的默认槽函数。格式是
void on_控件名_信号名(参数)
比如我们常用的:
public slots:
void on_pushButton_clicked(){
...
}
当我们点击这个按钮的时候,这个槽函数也会被触发,这是由编译器提供的方法,比较简单,在对空间的槽函数要求精度没有那么高的情况下,这样去调用UI控件是比较好的,至于你说别的事件和信号怎么找,部分靠积累,大部分在网上都可以搜得到,这里不过多细聊这个话题。
【教你学Qt桌面端开发】pt1:浅谈Qt:特色C++主义类库的更多相关文章
- 浅谈入行Qt桌面端开发程序员-从毕业到上岗(1):当我们说到桌面端开发时,我们在谈论什么?
谈谈我自己 大家好,我是轩先生,是一个刚入行的Qt桌面端开发程序员.我的本科是双非一本的数学专业,22年毕业,只是部分课程与计算机之间有所交叉,其实在我毕业的时候并没有想过会成为一名程序员,也没有想过 ...
- 一个简单的工具开发:从学生端更新程序部署工具说起,浅谈qt中自定义控件制作和调用、TCP协议下文件的收发 、以及可执行文件的打包
一个简单的工具开发:从学生端更新程序部署工具说起,浅谈qt中ui的使用和TCP协议下文件的收发.以及可执行文件的打包 写在前面,Qt Designer是一个非常操蛋的页面编辑器,它非常的...怎么说呢 ...
- 【大型软件开发】浅谈大型Qt软件开发(二)面向未来开发——来自未来的技术:COM组件。我如何做到让我们的教学模块像插件一样即插即用,以及为什么这么做。
前言 最近我们项目部的核心产品正在进行重构,然后又是年底了,除了开发工作之外项目并不紧急,加上加班时间混不够了....所以就忙里偷闲把整个项目的开发思路聊一下,以供参考. 鉴于接下来的一年我要进行这个 ...
- 【大型软件开发】浅谈大型Qt软件开发(三)QtActive Server如何通过COM口传递自定义结构体?如何通过一个COM口来获得所有COM接口?
前言 最近我们项目部的核心产品正在进行重构,然后又是年底了,除了开发工作之外项目并不紧急,加上加班时间混不够了....所以就忙里偷闲把整个项目的开发思路聊一下,以供参考. 鉴于接下来的一年我要进行这个 ...
- Android安全开发之浅谈密钥硬编码
Android安全开发之浅谈密钥硬编码 作者:伊樵.呆狐@阿里聚安全 1 简介 在阿里聚安全的漏洞扫描器中和人工APP安全审计中,经常发现有开发者将密钥硬编码在Java代码.文件中,这样做会引起很大风 ...
- Android应用安全开发之浅谈加密算法的坑
<Android应用安全开发之浅谈加密算法的坑> 作者:阿里移动安全@伊樵,@舟海 阿里聚安全,一站式解决应用开发安全问题 Android开发中,难免会遇到需要加解密一些数据内 ...
- 安卓开发_浅谈ListView(SimpleAdapter数组适配器)
安卓开发_浅谈ListView(ArrayAdapter数组适配器) 学习使用ListView组件和SimapleAdapter适配器实现一个带图标的ListView列表 总共3部分 一.MainAc ...
- 安卓开发_浅谈Android动画(四)
Property动画 概念:属性动画,即通过改变对象属性的动画. 特点:属性动画真正改变了一个UI控件,包括其事件触发焦点的位置 一.重要的动画类及属性值: 1. ValueAnimator 基本属 ...
- 安卓开发_浅谈ListView(自定义适配器)
ListView作为一个实际开发中使用率非常高的视图,一般的系统自带的适配器都无法满足开发中的需求,这时候就需要开发人员来自定义适配器使得ListView能够有一个不错的显示效果 有这样一个Demo ...
- 浅谈 Qt 布局那些事
Qt 布局那些事是本文介绍的内容,直接进入主题.GridLayout是一个非常强大的布局管理器,它可以实现很多复杂的布局,名字中暗示它将所有控件放置在类似网格的布局中.^__^GridLayout有两 ...
随机推荐
- 【YOLOv5】实现扑克牌的点数识别
前言 其实年初的时候,我也跟着别人的源码,用 Tensoflow 实现过扑克牌的目标检测.虽然也通过博文的方式记录了,但是那个项目使用的 TF 版本比较旧,自身对 TF 并不熟.后期如果说要升级或修改 ...
- Celery周期性任务定义beat
通过celery beat可以使用周期性任务的定义. https://docs.celeryq.dev/en/stable/userguide/periodic-tasks.html 周期性任务bea ...
- 【笔记整理】[案例]爱词霸翻译post请求
import json if __name__ == '__main__': import requests resp = requests.post( url="http://ifanyi ...
- ElasticSearch之Delete index API
删除指定的索引. 同时删除索引关联的数据.分片.元数据等相关的资源,因此执行前需要慎重. 命令样例如下: curl -X DELETE "https://localhost:9200/tes ...
- 神经网络优化篇:详解梯度消失/梯度爆炸(Vanishing / Exploding gradients)
梯度消失/梯度爆炸 训练神经网络,尤其是深度神经所面临的一个问题就是梯度消失或梯度爆炸,也就是训练神经网络的时候,导数或坡度有时会变得非常大,或者非常小,甚至于以指数方式变小,这加大了训练的难度. 接 ...
- 如何从零开始实现TDOA技术的 UWB 精确定位系统(1)
前言 这是一个系列文章,将向你介绍如何从零开始实现一个使用TDOA技术的 UWB 精确定位系统. 重要提示(劝退说明): Q:做这个定位系统需要基础么? A:文章不是写给小白看的,需要有电子技术和软件 ...
- Python——第五章:模块(Module)、自定义模块、第3方开源模块、包(Package)
什么是模块(Module)? 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多代码按功能分组,分别放到不同的文件里,这 ...
- 告别复杂排版:Markdown语法指南
导语:Markdown作为一种轻量级的标记语言,以其简洁.易学的语法和强大的兼容性赢得了广泛的应用.本文将为您详细介绍Markdown的起源.基本语法及其在写作.博客.项目管理等场景的应用,带您领略这 ...
- STM32CubeMX教程8 TIM 通用定时器 - 输出比较
1.准备材料 开发板(STM32F407G-DISC1) ST-LINK/V2驱动 STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) 逻 ...
- Flutter 中常用的视频播放器
Flutter 中常用的视频播放器有很多种,不同的播放器有着各自的优势和缺点.下面是一些常用的视频播放器,以及它们的优势.缺点和性能优化策略. video_player: 优势:Flutter 官方提 ...