上一篇博客,简单的介绍了一下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
Qt的学习过程我自己是,先观看视频,二倍速速刷快速过一遍大概的知识,然后就是给自己的提一个需求,然后用Qt完成项目
学习视频:最新QT从入门到实战完整版|传智教育
这个视频讲的很好,有很多常用方法,快速入门很合适。
然后做的前期小小小项目就是 写一个 基于Qt的串口调试助手
以下内容均只用来学习,大部分内容来自视频!
本博客内容原创,编辑不易,转载请注明!!!
有关于Qt的安装可以看这个博客,比较详细,比较适合小白,如果是大佬的话,直接去官网下下载,然后下一步下一步安装就行了。
QT5.11下载与安装教程
在windows也没什么需要注意的,注意安装的时候中间有一步需要添加库,注意添加只需要的库就行了。
首先Qt是一个跨平台图形界面引擎,适用于Windows也适用于Linux,我做的项目就是在两个系统下的一个小工具,当时也考虑过用Java,但是由于第二个设备的配置较低,造成软件性能不足,延迟不可接受,最后选择了用Qt开发。
同时,Qt相对于C++,有一个很好的机制是,他有自己的一套内存回收机制,在一定程度上简化了内存回收,不需要每每new申请之后总要想着delete了,同时Qt也有很多成功开发的案例,例如Linux桌面环境 KDE就是用Qt开发的。
左上角为0,0 点
x以右为正方向
y以下为正方向
和我们平时的数学直角坐标系不太一样
当创建的对象在堆区时候,如果指定的父亲是QObject派生下来的类或者QObject子类派生下来的类,可以不用管理释放的操作,将对象会放入到对象树中,回收的时候一并回收,一定程度上简化了内存回收机制
命名规范
类名:首字母大写,单词和单词之间首字母大写
函数名:变量名称 首字母小写,单词和单词之间首字母大写
快捷键
注释 ctrl + /
运行 ctrl + r
编译 ctrl + b
字体缩放 ctrl + 鼠标滚轮
查找 ctrl + f
整行移动 ctrl + shift + ↑ 或者↓
帮助文档 F1
自动对齐 ctrl +i
同名之间的.h 和 .cpp切换 F4
帮助文档 第一种方式 F1
左上角文件,点击新建,然后会弹出来这个界面
这个界面,左侧是选择新建的是工程还是单个文件,单个文件一般都是新建一个类或者新建一个ui界面等等用到, 我们新建一个工程,选择Application,然后中间的是选择样式,第一个是窗口程序,第二个是控制台程序,我们新建一个窗口程序。
选择完毕之后,输入项目名称,注意名称不能有中文,不能有空格,然后确定路径,注意路径不能有中文路径。
然后一直下一步,到这个界面.
默认创建的窗口类是QMainWindow,可以选择的基类有: QWidget 、QMainWindow、QDialog,一个是单一的窗口,一个是主界面,一个是对话框,MainWindow比Widget多了一些常用的控件,例如菜单栏之类的。
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
QApplication a(argc, argv); //应用程序对象,有且仅有一个
MainWindow w; //实例化窗口对象
w.show(); //调用show函数 显示窗口
return a.exec(); //让应用程序对象进入消息循环机制中,代码阻塞到当前行
这个就是用来书写逻辑代码的主要地方,和mainwindow.h
是一起的
ui文件,可视化界面拖动,可以做界面布局,很方便
学习一门语言,要经常查他的API文档,Qt的API文档写的十分详细了,两种方法:
第一个是点击左侧的帮助按钮,然后在上边选择查找,就可以查询自己的想知道的类的用法了。
第二个是在.....\Qt5.9.5\5.9.5\mingw53_32\bin
目录下
这个方法的好处是,和开发工具是分离的,不用在开发工具中一直切换界面,以便查询。
信号和槽是Qt的一个特色,当一个类运行的时候,调用信号,就会触发相应的槽函数,同时信号函数还可以传递参数给槽函数。
连接函数 :connect(参数1,参数2,参数3,参数4)
参数1 信号的发送者
参数2 发送的信号(函数地址)
参数3 信号的接受者
参数4 处理的槽函数 (函数的地址)
//实现点击按钮 关闭窗口的案例
connect(btn , &QPushButton::click,this,&QWidget::close );
有的时候,只用类自带的信号与槽比较局限,我们还可以用自己定义的信号和槽函数
自定义信号
自定义的信号要写到头文件下的 signals下,有时候项目没自动生成,自己写上,返回值为void,只需要声明,不需要实现。
可以有参数,同时也可以重载
自定义槽函数
自定义的槽函数,返回值为void,需要声明 ,也需要实现,可以有参数 ,可以重载,要写在头文件下的 public slot下 或者public 或者全局函数
直接看代码实现吧
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到主界面中。
实现的功能是,点击按钮,按钮名称在一个普通的按钮
和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)
函数
用起来还是很方便的。
信号和槽都是可以重载的,重载用法比较繁琐复杂。
当自定义信号和槽出现重载时,需要利用函数指针 明确指向函数的地址,来告诉编译器,到底连接的是哪一个。
例如:
void( Teacher:: * tSignal )( QString ) = &Teacher::hungry;
小tips
当需要将QString
转化为char *
时,
先用ToUtf8()
方法将其转化为QByteArray
,然后再用Data()
转为Char *
例如:
String str("0123456789");
char* p = str.toUtf8().data();
qDebug()<
如果需要断开连接的话,需要用到disconnect
函数
同时,一个信号也可以连接另一个信号,一个信号可以连接多个槽函数,多个信号可以连接同一个槽函数
信号和槽函数的参数 必须类型一一对应,但是 信号的参数个数 可以多于槽函数的参数个数
connect( 信号的发送者,发送的信号SIGNAL(信号),信号接受者,槽函数SLOT(槽函数))
优点是参数比较直观
缺点是编译器不会检测参数类型
Lambda表达式匿名函数的简便写法,如果想要深入了解,可以自行查询。
这里只是提供用法
connect(ui->pushButton,&QPushButton::clicked,[=](){
ui->pushButton->setText("Hello,World");
});
[]是匿名函数
[=]
是值传递
[&]
是引用传递
()是参数
{}是实现体
根据视频,这是第一天的学习任务,主要是熟悉Qt语法和Qt的基本知识。
未完待续 =w=