QT初始(1)

一、认识QT的一些初始代码

1. Q_OBJECT

如果类要使用信号槽 ,就需要引入这个

2. Widget(QWidget *parent = nullptr);

这个是引入对象树 的概念,即创建的 Qt 对象可以通过绑定父节点,从而加入对象树

3. Ui::Widget *ui 这个则是和 form file 密切相关的,也就是可视化界面代码的桥梁。

4. ui->setupUi(this); 设计文件准备好的界面,真正地"组装"并显示在窗口上。
1.对象树

对象树负责把内容组织起来,然后在合适的时机(如窗口关闭 )将对象统一释放 。因此推荐使用 来开辟空间;如果放在 上,对应的枝干可能会提前释放,导致界面中该控件消失

要点:

  1. 只有继承 QObject 的类才能加入对象树。

  2. 只有当对象需要被管理的时候,才应挂到对象树上。

  3. 父对象 被销毁时,它会自动销毁 其所有子对象(通过析构函数实现),无需手动释放。

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

相关推荐
小白不白1112 小时前
C# WinForm 与 VP 二次开发
开发语言·c#
程序猿乐锅2 小时前
【JAVASE | 第十七篇】Java 网络通信
java·开发语言
飞舞哲2 小时前
三维点云最小二乘拟合MATLAB程序
开发语言·算法·matlab
有点。2 小时前
C++(贪心算法二)
开发语言·c++·贪心算法
meilindehuzi_a2 小时前
透视 V8 底部:从物理内存到函数式哲学,重新解构 JavaScript 数组
开发语言·javascript·ecmascript
jllllyuz2 小时前
HVDC 高压直流输电系统 MATLAB/Simulink 仿真全集
开发语言·matlab
我命由我123452 小时前
Windows 操作系统 - Windows 查看防火墙是否开启、Windows 查看防火墙放行端口
java·运维·开发语言·windows·java-ee·操作系统·运维开发
天天进步20152 小时前
Python全栈项目--基于Python的数据库管理工具
开发语言·数据库·python
YHHLAI2 小时前
JavaScript 数据结构精讲:数组底层与实战避坑
开发语言·javascript·数据结构
有点。2 小时前
C++贪心算法一(练习题)
开发语言·c++·贪心算法