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子类派生下来的类,可以不用管理释放的操作,将对象会放入到对象树中,回收的时候一并回收,一定程度上简化了内存回收机制

3.3.3. 常用快捷键

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

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

4. 创建项目

4.1. 创建一个新得项目

左上角文件,点击新建,然后会弹出来这个界面

这个界面,左侧是选择新建的是工程还是单个文件,单个文件一般都是新建一个类或者新建一个ui界面等等用到, 我们新建一个工程,选择Application,然后中间的是选择样式,第一个是窗口程序,第二个是控制台程序,我们新建一个窗口程序。
选择完毕之后,输入项目名称,注意名称不能有中文,不能有空格,然后确定路径,注意路径不能有中文路径。
然后一直下一步,到这个界面.

默认创建的窗口类是QMainWindow,可以选择的基类有: QWidget 、QMainWindow、QDialog,一个是单一的窗口,一个是主界面,一个是对话框,MainWindow比Widget多了一些常用的控件,例如菜单栏之类的。

4.2. 文件目录


一个工程创建完成之后,会默认生成这些文件,分别简单说明

4.2.1. .pro文件

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

QT       += core gui   Qt包含的模块greaterThan(QT_MAJOR_VERSION, 4): QT += widgets  //大于4版本以上 包含 widget模块TARGET = MyTest  //目标   生成的.exe程序的名称
TEMPLATE = app           //模板   应用程序模板  ApplicationSOURCES += \                //源文件main.cpp \mainwindow.cppHEADERS += \                //头文件mainwindow.hFORMS += \                    //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. 内嵌帮助

第一个是点击左侧的帮助按钮,然后在上边选择查找,就可以查询自己的想知道的类的用法了。

5.2. Qt助手

第二个是在.....\Qt5.9.5\5.9.5\mingw53_32\bin目录下

这个方法的好处是,和开发工具是分离的,不用在开发工具中一直切换界面,以便查询。

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 <QMainWindow>
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 <QDebug>
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()<<"要打印的字符串是:"<<str;
}
MainWindow::~MainWindow()
{delete ui;
}

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

实现的功能是,点击按钮,按钮名称在一个普通的按钮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()<<p[1];    //输出 1

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. 一览图总结

7. 总结

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

Qt学习之Qt基础入门(上)相关推荐

  1. Qt学习之Qt基础入门(下)

    1. 前言 前两篇博客简单的阐述了一下Qt的入门用法,这篇博客继续跟着视频学习. Qt入门系列: Qt学习之C++基础 Qt学习之Qt安装 Qt学习之Qt基础入门(上) Qt学习之Qt基础入门(中) ...

  2. Qt学习之Qt基础入门(中)

    1. 前言 上一篇博客,总结了Qt的一些基础用法,这篇博客继续跟视频学习Qt的常用方法 Qt入门系列: Qt学习之C++基础 Qt学习之Qt安装 Qt学习之Qt基础入门(上) Qt学习之Qt基础入门( ...

  3. 视频教程-人人都会深度学习之Tensorflow基础入门-深度学习

    人人都会深度学习之Tensorflow基础入门 大数据工程师/算法工程师/大数据讲师,毕业于西华大学软件工程专业.在大数据领域有着丰富的实战经验. 擅长领域:Spark/Hadoop.算法设计及系统架 ...

  4. 1、Latex学习笔记之基础入门篇

    目录 一.Latex基础 1.架构 2.引用.脚注 3.单栏.双栏 4.常用快捷键 5.宏包 6.空格 7.换行.行间距 8.换段 9.下划线 10.引号 11.注释 12.字体 13.缩进 14.超 ...

  5. java基本语法心得_Java学习笔记(一)——基础语法(上)

    Java学习笔记(一)--基础语法(上) 软件构造 写在前面 编写Java程序时,应注意以下几点:大小写敏感:Java是大小写敏感的,这就意味着标识符Hello与hello是不同的. 类名:对于所有的 ...

  6. 阿里云天池学习赛-零基础入门数据分析-学术前沿趋势分析(task1)

    阿里云天池学习赛零基础入门数据分析-学术前沿趋势分析 前言 一.赛题描述及数据说明 1:数据集的格式如下: 2:数据集格式举例: 二.task1论文数量统计(数据统计任务):统计2019年全年,计算机 ...

  7. Spark大数据开发学习:Spark基础入门

    在诸多的大数据技术框架当中,Spark可以说是占据了非常重要的地位,继Hadoop之后,基于实时数据处理需求的不断上升,Spark开始占据越来越大的市场份额,而Spark,也成为大数据的必学知识点.今 ...

  8. 【Qt Quick】零基础入门系列之安装与卸载(一)

    [Qt Quick]概述 |本文大概阅读时间8分钟. |版权说明:原创文章,如需转载,请标明文章出处.https://blog.csdn.net/weixin_40192195/article/det ...

  9. C++后续:QT学习(Qt概述,创建QT项目)

    目录 声明 一. Qt概述 1.1 什么是Qt 1.2 Qt的发展史 1.3 Qt支持的平台 1.4 Qt版本 1.5 Qt的下载与安装 1.6 Qt的优点 二.创建 Qt项目 2.1 如何创建 2. ...

  10. Qt 学习(三) —— Qt 模块

    1. Qt 模块简介 Qt由许多模块组成,分别支持不同领域的功能,主要分为 Essentials 和 Add-On. Qt Essential 是基本模块,它们可以在所有受支持的开发平台和经过测试的目 ...

最新文章

  1. pandas将dataframe中的年、月、日数据列合并成完整日期字符串、并使用to_datetime将字符串格式转化为日期格式
  2. 关于win7禁止标准用户安装软件 AppLocker使用
  3. 使用QtService实现Qt后台服务程序
  4. PHP易混淆函数的区分方法及意义
  5. Axure原型制作规范
  6. linux rz批量上传
  7. ACM团队周赛题解(2)
  8. 【跃迁之路】【716天】程序员高效学习方法论探索系列(实验阶段473-2019.2.6)...
  9. 脉冲神经网络原理及应用pdf_CNN卷积神经网络原理讲解+图片识别应用(附源码)...
  10. Ubuntu 16.04安装Markdown编辑器MarkMyWords
  11. Hibernate入门案例
  12. 墨盒注墨后出现断线或堵头的处理方法
  13. 行列转换的SQL语句
  14. CIO40:IT人22-30岁职业规划
  15. 淘宝用户行为分析(四):行为聚类
  16. excel poi 实现图片导出
  17. Druid java.sql.SQLException: connection holder is null
  18. 鼠标垫测试软件,百款鼠标垫测试(项目)
  19. 如何恢复小强中被修改的软件包
  20. 编码(NRZ、NRZI、曼彻斯特、4B

热门文章

  1. 其他计算机找不到共享打印机驱动程序,win10连接共享打印机时“找不到驱动程序”怎么解决_win10连接共享打印机时“找不到驱动程序”处理方法...
  2. hadoop面试题以及答案
  3. 单片机胡汉才第四版答案_单片机课后习题答案--胡汉才编
  4. 【C51单片机】6-ESP8266——wifi模块联网、AT指令
  5. XAMPP最详细的安装及使用教程
  6. VMware ESXi 7.0 Update 3c SLIC 2.6 Unlocker (2022 U3 Refresh)
  7. e320/t420/w520等 qm67/hm65/hm67等 6系芯片组更新BIOS以安装三代酷睿cpu提升性能的想法
  8. 小米miui全机型代码对照与各机型发布时间表 了解小米机型发展历程
  9. 传输线理论 1/4波长阻抗变换器的分析匹配
  10. 信号完整性(SI)电源完整性(PI)学习笔记(十)传输线的物理基础(三)