一、认识QT的一些初始代码
1. Q_OBJECT
如果类要使用信号槽 ,就需要引入这个宏。
2. Widget(QWidget *parent = nullptr);
这个是引入对象树 的概念,即创建的 Qt 对象可以通过绑定父节点,从而加入对象树。
3. Ui::Widget *ui 这个则是和 form file 密切相关的,也就是可视化界面 和代码的桥梁。
4. ui->setupUi(this); 设计文件准备好的界面,真正地"组装"并显示在窗口上。
1.对象树对象树负责把内容组织起来,然后在合适的时机(如窗口关闭 )将对象统一释放 。因此推荐使用堆 来开辟空间;如果放在栈 上,对应的枝干可能会提前释放,导致界面中该控件消失。
要点:
只有继承
QObject的类才能加入对象树。只有当对象需要被管理的时候,才应挂到对象树上。
当父对象 被销毁时,它会自动销毁 其所有子对象(通过析构函数实现),无需手动释放。
2.字符集
在 Qt 中如果使用 cout 的方式打印中文,大概率会出现乱码 (因为
cout默认使用本地编码 ,如 Windows 下 GBK ,Linux 下 UTF-8 ;而 Qt 内部为 Unicode),因此可以采取 qDebug 来代替cout
二、信号槽和ui的简单了解
2.1 信号槽
1.介绍
通过
connect函数,可将一个对象发出的信号 (如按钮的点击事件)与另一个对象的槽函数(即普通成员函数)关联起来。当用户触发该事件(如点击按钮)时,对应的槽函数会被自动调用执行。
cpp
// bool QObject::connect(const QObject *sender, PointerToMemberFunction signal,
// const QObject *receiver, PointerToMemberFunction method);
// 功能:将一个对象发出的信号连接到另一个对象的槽函数(或信号),实现对象间通信
#include <QObject>
#include <QDebug>
// 参数说明:
// • sender :发出信号的对象指针(必须继承自 QObject)
// • signal :指向成员函数的指针,表示信号
// • receiver :接收信号并执行槽的对象指针
// • method :指向成员函数的指针,表示槽(或另一个信号)
// 返回值:
// • 成功连接返回 true,失败返回 false
注意:
信号必须由发送对象所属类定义,槽通常作为接收对象的成员函数实现 。例如,若使用一个按钮对象(如
QPushButton),则其发出的信号(如clicked())只能是该按钮类及其父类所声明的信号;若槽函数属于主窗口("桌面对象"),则该槽是窗口类的方法。
2.2 ui了解
在使用 Qt Designer 创建 UI 界面时,每个控件都会被赋予一个
objectName属性。当.ui文件被编译为 Python 代码后 ,生成的 UI 类会将控件以该objectName作为实例属性名 ,从而允许在代码中通过ui.objectName的方式直接访问对应控件。
三、QT坐标系
1.坐标种类
数学坐标系(通常为右手坐标系) :原点位于图形或空间的中心,x 轴向右为正,y 轴向上为正;
计算机图形坐标系(通常为左手坐标系) :原点位于父窗口或画布的左上角 ,x 轴向右为正,y 轴向下为正 。
2.move函数
cpp#include <QWidget> // void QWidget::move( // int x, // int y // ); // 功能: // 将窗口部件(widget)移动到其父窗口或屏幕坐标系中的指定位置 // 对于顶层窗口(无父窗口),坐标相对于屏幕左上角 // 对于子窗口部件,坐标相对于父窗口部件的客户区左上角 // 参数说明: // int x: // 新的 x 坐标(水平位置) // int y: // 新的 y 坐标(垂直位置)
四、信号(上)
1.信号三要素
信号源(Sender):发出信号的控件或对象;
信号类型(Signal):由特定用户操作或状态变化触发的、对象所支持的具体信号。
信号处理方式(Slot):用于响应信号的可调用对象(通常为函数或方法),本质上是一种回调机制。
2.槽和信号的图标
槽
信号
3.自定义槽
自定义槽在 Qt5 及之后版本中本质上就是普通函数或方法 ,无需特殊语法;但在 Qt4 及更早版本中,必须将槽显式声明在
public slots:、protected slots:或private slots:区域中,否则无法被元对象系统识别。若槽函数采用命名规范
on_<对象名>_<信号名>(),且对应的控件已通过setObjectName()设置了匹配的对象名,则可以借助QMetaObject::connectSlotsByName()实现自动连接 ,无需手动调用connect()。4.自定义信号
信号在语法上类似于函数声明,但其本质并非普通函数 ;它必须在类的
signals:(Qt5 起)或Q_SIGNALS:(兼容宏)访问控制段中声明,才能被 Qt 的元对象编译器识别为信号;信号的返回值必须为
void,可带有参数,且支持重载
connect()的作用只是建立信号与槽之间的连接关系 ,它本身不会执行槽函数 ;只有当信号被实际发射(emit)时 ,已连接的槽才会被调用。不过Qt5可以不写emit,因为全都装在信号函数里面了,但是为了可读性还是建议写。
然后如果信号充当槽,那么相当于emit 这个信号(不管是内置还是自定义的)。
五、信号(下)
1.参数
自定义信号和槽都可以携带参数,声明的时候可以不携带参数名,C++的规则;
在连接时,槽的参数个数不能多于信号的参数个数;
内置的信号有的也会携带参数,但是不是由我们传递。
2.信号槽的意义
信号与槽的解耦设计,核心目的是实现对象间的松耦合通信,并天然支持以下关系:
一对多:一个信号可连接多个槽(广播事件);
多对一:多个信号可连接同一个槽(统一处理);
多对多:复杂场景下任意组合(如多个发送者触发多个接收者的不同响应)。
3.disconnect
**作用:**取消信号和槽的关系
**参数:**和connect一样
4.lambda表达式
格式:【捕获列表】(函数参数){函数体}
【】:里面放要捕获的变量,如果是=则捕获上一层作用域的所有变量,&则是在=的基础上捕获所用变量的引用(Qt不推荐)
六、QT安装包
链接 :https://pan.baidu.com/s/1pwrYhDxSrjTa7GAQ9_NOQg
提取码:bite





