Qt学习之Qt基础入门(上)

1. 前言

上一篇博客,简单的介绍了一下C++的面向对象编程,这篇博客就主要是用来入门Qt,废话不多说,开干!

Qt入门系列:
Qt学习之C++基础
Qt学习之Qt安装
Qt学习之Qt基础入门(上)
Qt学习之Qt基础入门(中)
Qt学习之Qt基础入门(下)

本文原创,创作不易,转载请注明!!!
本文链接
个人博客:https://ronglin.fun/?p=217
PDF链接:见博客网站
CSDN: https://blog.csdn.net/RongLin02/article/details/120595809

2. 总述

Qt的学习过程我自己是,先观看视频,二倍速速刷快速过一遍大概的知识,然后就是给自己的提一个需求,然后用Qt完成项目
学习视频:最新QT从入门到实战完整版|传智教育
这个视频讲的很好,有很多常用方法,快速入门很合适。
然后做的前期小小小项目就是 写一个 基于Qt的串口调试助手

以下内容均只用来学习,大部分内容来自视频!
本博客内容原创,编辑不易,转载请注明!!!

3. 准备工作

3.1. Qt的安装

有关于Qt的安装可以看这个博客,比较详细,比较适合小白,如果是大佬的话,直接去官网下下载,然后下一步下一步安装就行了。
QT5.11下载与安装教程
在windows也没什么需要注意的,注意安装的时候中间有一步需要添加库,注意添加只需要的库就行了。

3.2. Qt的优点

首先Qt是一个跨平台图形界面引擎,适用于Windows也适用于Linux,我做的项目就是在两个系统下的一个小工具,当时也考虑过用Java,但是由于第二个设备的配置较低,造成软件性能不足,延迟不可接受,最后选择了用Qt开发。
同时,Qt相对于C++,有一个很好的机制是,他有自己的一套内存回收机制,在一定程度上简化了内存回收,不需要每每new申请之后总要想着delete了,同时Qt也有很多成功开发的案例,例如Linux桌面环境 KDE就是用Qt开发的。

3.3. 基础知识

3.3.1. Qt的坐标系

左上角为0,0 点
x以右为正方向
y以下为正方向
和我们平时的数学直角坐标系不太一样

3.3.2. 对象树

当创建的对象在堆区时候,如果指定的父亲是QObject派生下来的类或者QObject子类派生下来的类,可以不用管理释放的操作,将对象会放入到对象树中,回收的时候一并回收,一定程度上简化了内存回收机制
Qt学习之Qt基础入门(上)_第1张图片

3.3.3. 常用快捷键

命名规范
类名:首字母大写,单词和单词之间首字母大写
函数名:变量名称 首字母小写,单词和单词之间首字母大写

快捷键
注释 ctrl + /
运行 ctrl + r
编译 ctrl + b
字体缩放 ctrl + 鼠标滚轮
查找 ctrl + f
整行移动 ctrl + shift + ↑ 或者↓
帮助文档 F1
自动对齐 ctrl +i
同名之间的.h 和 .cpp切换 F4
帮助文档 第一种方式 F1

4. 创建项目

4.1. 创建一个新得项目

左上角文件,点击新建,然后会弹出来这个界面
Qt学习之Qt基础入门(上)_第2张图片
这个界面,左侧是选择新建的是工程还是单个文件,单个文件一般都是新建一个类或者新建一个ui界面等等用到, 我们新建一个工程,选择Application,然后中间的是选择样式,第一个是窗口程序,第二个是控制台程序,我们新建一个窗口程序。
选择完毕之后,输入项目名称,注意名称不能有中文,不能有空格,然后确定路径,注意路径不能有中文路径。
然后一直下一步,到这个界面.
Qt学习之Qt基础入门(上)_第3张图片
默认创建的窗口类是QMainWindow,可以选择的基类有: QWidget 、QMainWindow、QDialog,一个是单一的窗口,一个是主界面,一个是对话框,MainWindow比Widget多了一些常用的控件,例如菜单栏之类的。

4.2. 文件目录

Qt学习之Qt基础入门(上)_第4张图片
一个工程创建完成之后,会默认生成这些文件,分别简单说明

4.2.1. .pro文件

pro文件相当于一个配置清单

QT       += core gui   Qt包含的模块

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets  //大于4版本以上 包含 widget模块

TARGET = MyTest  //目标   生成的.exe程序的名称
TEMPLATE = app       	  //模板   应用程序模板  Application


SOURCES += \                //源文件
        main.cpp \
        mainwindow.cpp

HEADERS += \                //头文件
        mainwindow.h

FORMS += \                    //ui文件界面
        mainwindow.ui

4.2.2. main.cpp

    QApplication a(argc, argv);    //应用程序对象,有且仅有一个
    MainWindow w;    //实例化窗口对象
    w.show();    //调用show函数 显示窗口

    return a.exec();    //让应用程序对象进入消息循环机制中,代码阻塞到当前行

4.2.3. mainwindow.cpp

这个就是用来书写逻辑代码的主要地方,和mainwindow.h是一起的

4.2.4. mainwindow.ui

ui文件,可视化界面拖动,可以做界面布局,很方便

5. API

学习一门语言,要经常查他的API文档,Qt的API文档写的十分详细了,两种方法:

5.1. 内嵌帮助

第一个是点击左侧的帮助按钮,然后在上边选择查找,就可以查询自己的想知道的类的用法了。
Qt学习之Qt基础入门(上)_第5张图片

5.2. Qt助手

第二个是在.....\Qt5.9.5\5.9.5\mingw53_32\bin目录下
Qt学习之Qt基础入门(上)_第6张图片
这个方法的好处是,和开发工具是分离的,不用在开发工具中一直切换界面,以便查询。

6. 信号和槽

信号和槽是Qt的一个特色,当一个类运行的时候,调用信号,就会触发相应的槽函数,同时信号函数还可以传递参数给槽函数。

6.1. 用法

连接函数 :connect(参数1,参数2,参数3,参数4)
参数1 信号的发送者
参数2 发送的信号(函数地址)
参数3 信号的接受者
参数4 处理的槽函数 (函数的地址)

//实现点击按钮 关闭窗口的案例
connect(btn , &QPushButton::click,this,&QWidget::close );

6.2. 自定义信号与槽函数

有的时候,只用类自带的信号与槽比较局限,我们还可以用自己定义的信号和槽函数
自定义信号
自定义的信号要写到头文件下的 signals下,有时候项目没自动生成,自己写上,返回值为void,只需要声明,不需要实现。
可以有参数,同时也可以重载
自定义槽函数
自定义的槽函数,返回值为void,需要声明 ,也需要实现,可以有参数 ,可以重载,要写在头文件下的 public slot下 或者public 或者全局函数

6.2.1. 代码

直接看代码实现吧
mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include 
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private:
    Ui::MainWindow *ui;
signals:    //信号
    void print(QString str);
public slots:    //槽函数
    void onClicked();
    void printString(QString str);
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(ui->pushButton,&QPushButton::clicked,this,&MainWindow::onClicked);
    connect(this,&MainWindow::print,this,&MainWindow::printString);
}
void MainWindow::onClicked()
{
    if(ui->pushButton->text() == "Hello,World")
    {
        ui->pushButton->setText("一个普通的按钮");
    }
    else
    {
        ui->pushButton->setText("Hello,World");
        emit this->print("Hello,World");
    }
}
void MainWindow::printString(QString str)
{
    qDebug()<<"要打印的字符串是:"<

mainwindow.ui
在ui界面,直接拖拽一个pushButton到主界面中。

Qt学习之Qt基础入门(上)_第7张图片

实现的功能是,点击按钮,按钮名称在一个普通的按钮Hello,World之前转化,同时当名称是Hello,World时,控制台打印一次Hello,World

同时简单的解释以下:
这句代码,是将按钮点击事件和onClicked函数绑定在一起

connect(ui->pushButton,&QPushButton::clicked,this,&MainWindow::onClicked);

这句代码,是将类中的print信号和类中的槽函数printString绑定在一起

connect(this,&MainWindow::print,this,&MainWindow::printString);

调用的时候,用emit this->print("Hello,World");就可以实现,触发void printString(QString str)函数
用起来还是很方便的。

6.3. 扩展

6.3.1. 重载

信号和槽都是可以重载的,重载用法比较繁琐复杂。
当自定义信号和槽出现重载时,需要利用函数指针 明确指向函数的地址,来告诉编译器,到底连接的是哪一个。
例如:

void( Teacher:: * tSignal )( QString ) = &Teacher::hungry;

小tips
当需要将QString转化为char *时,
先用ToUtf8()方法将其转化为QByteArray,然后再用Data()转为Char *
例如:

String str("0123456789");
char* p = str.toUtf8().data();
qDebug()<

6.3.2. 其他

如果需要断开连接的话,需要用到disconnect函数
同时,一个信号也可以连接另一个信号,一个信号可以连接多个槽函数,多个信号可以连接同一个槽函数
信号和槽函数的参数 必须类型一一对应,但是 信号的参数个数 可以多于槽函数的参数个数

6.3.3. Qt4版本写法

 connect( 信号的发送者,发送的信号SIGNAL(信号),信号接受者,槽函数SLOT(槽函数))

优点是参数比较直观
缺点是编译器不会检测参数类型

6.4. Lambda表达式

Lambda表达式匿名函数的简便写法,如果想要深入了解,可以自行查询。
这里只是提供用法

connect(ui->pushButton,&QPushButton::clicked,[=](){
        ui->pushButton->setText("Hello,World");
    });

[]是匿名函数
[=] 是值传递
[&] 是引用传递
()是参数
{}是实现体

6.5. 一览图总结

Qt学习之Qt基础入门(上)_第8张图片

7. 总结

根据视频,这是第一天的学习任务,主要是熟悉Qt语法和Qt的基本知识。
未完待续 =w=

你可能感兴趣的:(Qt,qt)