QT 第三讲 --- 基础篇 初用信号槽与命名规范
前言:
欢迎来到《QT 第三讲——基础篇 初用信号槽与命名规范》!
在上一讲《QT 第二讲——基础篇 Qt的第一个程序》中,我们一起完成了第一个Qt窗口程序的创建,初步熟悉了Qt Creator的开发环境,并掌握了Qt项目的基本结构。通过简单的代码实践,大家已经能够感受到Qt框架的便捷性与跨平台特性。
从这一讲开始,我们将正式使用Qt的核心机制之一——信号与槽(Signals & Slots)。作为Qt框架区别于其他GUI库的重要特性,信号槽机制实现了对象间的高效通信,是Qt开发中不可或缺的“魔法工具”。本讲将通过实例演示如何初步使用信号槽,并深入探讨Qt开发中的命名规范,帮助大家从起步阶段养成规范编码的习惯,为后续复杂项目打下坚实基础。
让我们开始学习如何用信号槽连接界面与逻辑,同时掌握代码可读性与可维护性的关键技巧吧!
目录
前言:
一、hello world的其他写法
1.1 Line Edit 图形化编辑
1.2 Line Edit代码编程
二、初用信号槽
三、QT使用技巧与命名规范
3.1 快捷键
3.2 命名规范
3.3 查询文档
四、初识QT坐标系
总结:
一、hello world的其他写法
在上一讲当中我们使用了,label的图形化界面与代码方式编写,但是我们下面将要讲解另一个控件---Line Edit,它是我们在平常界面当中看到的编辑框
下面还有一个控件Text Edit 它同样是编辑框不过是更大的文本编辑框,但是我们hello world很明显不需要使用它,我们这里使用Line Edit来掩饰。
1.1 Line Edit 图形化编辑
这里很简单就不再浪费大家时间,操作流程是与上一讲的Label是一样的。
1.2 Line Edit代码编程
这里的操作与上一讲几乎是一致的,这里不在过多的介绍。
这里的使用的就不再介绍了。
二、初用信号槽
这里我们就要第一次接触了,QT的一个重要概念那---信号与槽,但是这里我们只是第一次使用一下信号槽但是正式的介绍QT还是要等到下一讲。
我们这里还是以Hello World程序为演示,我们这里再介绍一个控件button,他就是我们平常界面当中的按钮,而我们再QT当中选择Push Button,这是我们QT最常用的按钮,它就是一个普通的按钮。
2.1 button图形化编写
还是一样的,我们打开一个项目,然后再左边栏找到button图标就好。
预期效果图,然后我们正常编译一下就好了
效果图:
但是按钮与上面的QLineEdit与QLable不同,button按钮可以发出信号的,信号我们很熟悉嘛,毕竟信号也是进程间通信的一种方式,在Linux当一个进程接收到一个信号就可以根据提前设置好的信号处理函数,处理信号。
我们关于信号与槽,也可以这样认为,当用户与我们的界面交互的时候,会发个信号给我们,我们就可以根据信号来调整相关控件的表现。
如果大家听不懂,大家可以等到下节课。
这里我们以代码的形式第一次使用槽函数。
我们想要使用槽函数,我们就必须完成信号与槽函数的链接,使用的函数的是connect,但是这个函数与TCP套接字的connect函数没啥太大的联系。
这里我们使用的直接是图形化界面的方式编写的,我们想要使用这个控件建立槽函数,我们就必须知道这个控件的名字,在上一讲当中我们也介绍到了。
QT此时就会给这个控件分配一个objectName属性
这个属性的值,要求是在界面中得是唯一的.(不能和别人重复)会自动生成一个名称
而qmake在预处理.ui文件的时候,就会根据这里的objectName生成对应的
也可以手动修改成别的名称
该QPushButton对象的变量名字就是这里的objectName.
这个变量就是ui属性中的成员变量.。 后面我们想要connect的时候,使用的就是这个变量名。
当然具体的connect的讲解,还是要等到下一讲,大家这时候听个响就好。
现在我们正式编写pushButton的槽函数,目标是 这个函数:我们按一下按钮,就可以改变按钮的文字
最后的效果图
2.2 button代码编写
当然我们根据上面的初步使用,想要改变为代码。
但是也是有几个需要注意的地方,就像是我们上面使用了一个新的函数,但是我们的代码时通过new出一个新的变量,它是一个临时变量,是没法直接再另一个函数内使用,所以我们在使用之前必须提前为Widget提前声明一个变量。
然后再进行上面的操作,就可以看到了。
这里就不再详细演示了,直接展示代码。
//widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QPushButton>
#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void handleClick();private:Ui::Widget *ui;QPushButton* Button;
};//这个函数我们就是想要按一下按钮,就可以改变按钮的文字#endif // WIDGET_H
//widget.cpp#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//这里我们完成了初步的控件搭建//接下来我们使用槽函数Button=new QPushButton(this);Button->setText("hello world");connect(Button,&QPushButton::clicked,this,&Widget::handleClick);
// connect(ui->pushButton,&QPushButton::clicked,this,&Widget::handleClick);
}void Widget::handleClick()
{if(Button->text() == QString("hello world")){Button->setText("hello QT");}else{Button->setText("hello world");}
}Widget::~Widget()
{delete ui;
}
这是最后的效果图,本人不会动图不好演示,大家下来实践就好了。
三、QT使用技巧与命名规范
3.1 快捷键
这个部分主要是和大家分享一下在QT中,方便我们编写代码的快捷键。
• 注释:ctrl + /
• 运⾏:ctrl + R
• 编译:ctrl + B
• 字体缩放:ctrl + ⿏标滑轮
• 查找:ctrl + F
• 整⾏移动:ctrl + shift + ⬆/⬇
• 帮助⽂档:F1
• ⾃动对⻬:ctrl + i;
• 同名之间的 .h 和 .cpp 的切换:F4
• ⽣成函数声明的对应定义: alt + enter
•转到定义 :crtl+左键
•返回:alt+左方向键
3.2 命名规范
给变量/函数/文件/类起名字,非常有讲究的
1. 起的名字要有描述性,不要使用abc,xyz这种比较无规律的名字来描述。
2.如果名字比较长,由多个单词构成的,就需要使用适当的方式来进行区分不同单词,
之前的C/C++博客当中,偏好使用空格,来进行单词的分割
形如:
student count
unordered map
这种方法被称为蛇形命名法,如下图那样,横线就是我们的空格。
但是编程界也有其他比较流行的命名规范,如下面的那种。
priority_queue,这种命名方法被称为驼峰命名法。
,下划线就是峰顶。
在编程届,驼峰命名法的规则,使用程度比蛇形命名更广泛,
Qt中,偏好使用大写字母来进行单词分割的.
形如:studentCount 小驼峰
给变量/函数,主要就是 C/C++/Python 偏好蛇形命名.,而Java/JS/Go……偏好驼峰命名.
当然最好使用什么命名规范,只有一个要求:入乡随俗。
你公司中使用的项目,使用的是驼峰/蛇形/其他??照着公司的做就可以了。
3.3 查询文档
大家一定要有查询文档的意识!!
未来实际开发中,一定会用到很多的第三方库和框架的
很可能用到的库/框架,比较小众,网上很难找到一些相关资料,
最核心的参考资料,就是官方文档,(大概率是英文的)
打开帮助⽂档有三种⽅式. 实际编程中使⽤哪种都可以.
1、光标放到要查询的类名/⽅法名上, 直接按 F1
2、Qt Creator 左侧边栏中直接⽤⿏标单击 "帮助" 按钮:
3、找到 Qt Creator 的安装路径,在 "bin" ⽂件夹下找到 assistant.exe,双击打开;
四、初识QT坐标系
QT坐标系与我们中学数学的坐标系不同,它是左手坐标系,就是坐标体系:以左上⻆为原点(0,0),X向右增加,Y向下增加。
对于嵌套的控件来说,其坐标是相对于⽗窗⼝来说的。
⽰例:使⽤Qt中的坐标系设置控件的位置; 【通过move函数可以设置控件相对于原点的位置】
移动的单位是像素
总结:
通过本讲的学习,你已经掌握了Qt信号槽的基本用法,理解了其“松耦合”设计的优势,并学会了如何通过规范的命名让代码更加清晰易懂。现在,你不仅能够通过信号槽实现简单的界面交互,还能通过合理的命名让代码逻辑一目了然,这对团队协作和长期维护至关重要。
在下一讲《QT 第四讲——基础篇 信号和槽》中,我们将进一步深入信号槽的进阶用法,包括自定义信号与槽、信号槽的参数传递以及跨线程通信的注意事项。通过更复杂的案例,你将彻底掌握这一机制的精髓,并能灵活运用它解决实际开发中的各类交互问题。
我们下一讲见!