Qt基础学习

一、Qt 快捷键:

Ctrl + /快速注释

Ctrl + r 允许

Ctrl + b 编译

Ctrl + shift + 向上的箭头整行移动

Ctrl + I 自动对齐

F4 同名文件切换

F1 /左侧按钮  帮助文档

 

二、Qt.pro文件

 

TARGET 指向的的名字可以修改,修改工程名

TEMPLATE 指向的是模板

 

SOURCE 指向的是源文件

HEADERS 指向的是头文件

当我们创建一个类时,.pro文件就会自动增加数据

 

如果需要添加一些模块,我们可以在这直接写

 

三、Qt类的结构

1、基类的关系

  1. QMainWindow 是主窗口类,主窗口具有主菜单栏、工具栏和状态栏,类似于一般的应用程序的主窗口;
  2. QWidget 是所有具有可视界面类的基类,选择 QWidget 创建的界面对各种界面组件都可以 支持;
  3. QDialog 是对话框类,可建立一个基于对话框的界面;

2、对象树

从上到下构造,从下到上析构,只要指定了父亲,对象便会被自动挂到对象树中,析构的时候就会自动释放堆

 

3、Qdebug()的打印顺序

我们验证析构的时候却发现,第一个打印的并不是子类,

这只是Qdebug()的问题,他是先从父到下打印再从下到上析构的

 

4、Qt坐标轴

四、Qt的一些宏以及元对象编译器

1、moc 

元对象编译器:

 只有继承了QObject类的类,才具有信号槽的能力。所以,为了使用信号槽,必须继承QObject。凡是QObject类(不管是直接子类还是间接子类),都应该在第一行代码写上Q_OBJECT。不管是不是使用信号槽,都应该添加这个宏。这个宏的展开将为我们的类提供信号槽机制、国际化机制以及 Qt 提供的不基于 C++ RTTI 的反射能力。因此,如果你觉得你的类不需要使用信号槽,就不添加这个宏,就是错误的。其它很多操作都会依赖于这个宏。

 

Qt的信号/槽和属性系统都基于其能在运行时刻对对象进行实时考察的功能。实时考察意味着即使在运行过程中也可以列出一个对象有哪些方法(成员函数)和属性,以及关于它们的各种信息(比如参数类型)。如果没有实时考察这个功能,QtScript 和 QML 就基本不可能实现了。

C++本身不提供对实时考察的支持,所以Qt就推出了一个工具来提供这个支持。这个工具就是MOC。注意,它是一个代码生成器,而不是很多人说的“预编译器”。

MOC会解析头文件并为每一个含有Q_OBJECT宏的头文件生成一个对应的C++文件(这个文件会跟工程中的其他代码一块参与编译)。这个生成的C++文件包含了实时考察功能所需的全部信息(文件一般被命名为moc_HeaderName。cpp)。

参考:

https://blog.51cto.com/u_14582976/2828696

https://www.cnblogs.com/lsgxeva/p/12153288.html

 

2、emit

Emit在

qobjectdefs.h头文件中是空的宏定义,没有任何实际意思(除了对开发者有提示作用)

 

3、Signals

Signal则是public的宏,在Qt4之前是protected的宏,QT5之后才是Public的宏

4、Slots

Slots也是空的宏定义

 

五、信号与槽

1、槽函数,就是信号的处理

2、自定义信号

3、自定义槽函数

必须先用信号建立消息映射,再调用执行

4、自定义的信号与槽发生重载问题的解决

(一)、如下图,一个是有参的。一个是无参的信号与槽,如果我门用之前的方法是指不到带参函数的

 

(二)、为了解决connect的重载问题,需要创建函数指针,来填充connect函数:

 

(三)、输出的时候我们发现,这个QStirng字符串自带引号,为了不带引号,我们需要把QString类型转化成Char *类型

5、信号连接信号

(一)、

就这样连接,没什么好说的...

6、断开信号

断开信号:discnnect

7、Qt4版本信号与槽函数连接的写法:

8、注意事项(小节)

注意信号与槽函数的参数问题

 

六、又遇Lambda表达式

1、Lambda直接作为函数使用

在Lambda表达式后面加(),这是直接将Lambda当函数使用了,之前学stl的时候只见过他作为回调函数使用,长见识了...

 

2、Lamdba表达式的各个组成

3、用Lambda当作函数使用

用Lambda实现判断素数:

4、Lambda设置connect连接

甚至可以省略原来第三个参数this

 

七、阶段性作业

1、要求

用Qt创建一个按钮,设置按钮的文本为"打开一个窗口",点击这个按钮,弹出一个窗口,同时按钮上的文本变为”关闭这个窗口”;再次点击按钮则关闭这个窗口

2、所用函数(包含之前上课时用到的常用函数)

Show()  //显示按钮

setParent() //设置父亲

setText()//设置文本

resize()  //重置窗口大小//

setFixedSize()  //固定窗口大小//

move()           //移动btn按钮//

setWindowTitle    //设置窗口标题//

3、代码

关键代码如下...

很简单,就不贴全码了

#include "work_widget.h" #include "ui_work_widget.h" #include "new_dialog.h" #include <QPushButton> #include <QDebug> Work_Widget::Work_Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Work_Widget) { ui->setupUi(this); new_Dialog* m = new new_Dialog; //创建按钮// QPushButton *btn = new QPushButton("打开一个新窗口",this); btn->move(100,0); QString qwe = "关闭这个新窗口"; connect(btn,&QPushButton::clicked,[=](){ qDebug()<<btn->text(); if(btn->text() == qwe) { btn->setText("打开一个新窗口"); m->close(); } else { m->show(); btn->setText("关闭这个新窗口"); } //new_Dialog m;//直接这样对象会被析构掉//应该定义在全局// }); } Work_Widget::~Work_Widget() { delete ui; }

 


__EOF__

本文作者_TLSN
本文链接https://www.cnblogs.com/lordtianqiyi/articles/15808206.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   TLSN  阅读(304)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示