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;
}

 

posted @ 2022-01-15 21:44  TLSN  阅读(285)  评论(0编辑  收藏  举报