个人公众号
个人博客:Sekyoro的博客小屋
个人网站:Proanimer的个人网站
C++与Qt开发入门
闲来无事,我玩玩Qt.不过我看网上说这东西有点过时,还提到了Futter
不过我已经无所谓了
下载镜像网址
http://download.qt.io/archive/qt/
安装可以参照http://download.qt.io/archive/qt/
我是vs2019+qt5.14
不过我在下载时遇到几个问题,在这里提出来
- 我用了visual studio搭配Qt,所以需要vsaddin这个插件.既可以在那个镜像网址里下载(速度较快),也可以在vs里下载(我试了试,翻墙速度快很多)
- 如果用vs的话需要msvc,一般情况用MinGW.UWP是windows平台,这些据情况安装
- 如果vscode是2018或以上,qt5.14只有msvc2017,如果没有装msvc2017的话,套件会出现警告,不过影响不大
- 关于Qt for desktop,我之前记得应该有这个东西的,现在这版本没找到了。
当我想打包程序时需要用到windeployqt(Qt5程序打包发布(Windows版)(一)_my1324的博客-CSDN博客_qt打包发布windows),照这个教程不太行
不过只要把相应编译器下包含windeployqt的文件夹bin设为环境变量path就行
![image-20210708210707199](https://i-blog.csdnimg.cn/blog_migrate/3dd4ee7932447ca79d08738e3abf1b8a.png)
这样就方便以后打包可执行程序了.
先入门大概写到这,后面慢慢琢磨
现在继续更新,现在主要介绍一下Qt大名鼎鼎的信号槽机制
信号与槽是Qt特有的的消息传输机制,在Qt中信号与槽用得十分广泛。在编程的过程中,我们都会遇到消息传递的事情,本质上就是发出命令(信号、消息),执行命令(相应的执行)。
比如单击窗口上一个按钮然后弹出一个对话框,那么就可以将这个按钮的单击信号和自定义的槽关联起来,信号是按钮的单击信号,槽实现了创建一个对话框并显示的功能。
信号与槽就是实现对象之间通信的一种机制,在其他编程语言中也有通过回调机制来实现对象之间的通信。
信号:当对象改变其状态时,信号就由该对象发射 (emit) 出去,而且对象只负责发送信号,它不知道另一端是谁在接收这个信号。
槽:用于接收信号,而且槽只是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。
例子
//"teacher.h"
class teacher : public QObject
{
Q_OBJECT
public:
explicit teacher(QObject *parent = nullptr);
signals:
// 只需要声明 可以重载 可以有参数
void hungry();
// void hungry(int);
public slots:
};
#include "teacher.h"
teacher::teacher(QObject *parent) : QObject(parent)
{
emit hungry();
}
//"student.h"
class student : public QObject
{
Q_OBJECT
public:
student(QObject *parent = nullptr);
public slots: //可以写到public下
void treat();
// void treat(int);
};
#include "student.h"
#include <QDebug>
student::student(QObject *parent ):QObject(parent){
}
void student::treat() {
qDebug()<<"你好"<<endl;
}
在主程序mainwindow.cpp中创建上面两个对象,并使用connect连接.
在Qt4中使用SIGNAL和SLOT进行信号和槽连接.有参和无参直接传函数,但现在最好不使用这种方式.
teacher* t = new teacher(this);
student* s = new student(this);
connect(btn,&QPushButton::clicked,this,&MainWindow::showmsg);
// connect(t,SIGNAL(hungry()),s,SLOT(treat()));
connect(t,&teacher::hungry,s,&student::treat);
classIsOver(t);
然后使用emit可以发出这个信号
void MainWindow::classIsOver(teacher* t){
emit t->hungry();
}
现在常用的连接方式是后者也就是使用函数地址,使用SIGNAL和SLOT的缺点因为使用宏,编译时不做类型检查,如果有问题的话,在运行的时候才会发现
Qt 5 推出的新 connect 函数,不需要使用 SIGNAL() 和 SLOT() 宏,可以在编译时做类型检查
connect(t,&teacher::hungry,s,&student::treat);
上面是一个简单例子,槽函数和信号都将没有进行重载,但是实际也常使用参数,这也是重点.
当信号发生重载时,需要使用额外的步骤.
例如使用函数指针的方法.
函数指针
比如修改信号和槽函数
// teacher 头文件中声明多个重载信号
signals:
// 只需要声明 可以重载 可以有参数
void hungry();
void hungry(int);
void hungry(QString foodName);
//student cpp文件中声明并实现槽函数
void student::treat(QString s) {
qDebug() << s << endl;
}
也就是说重载了类的成员函数,在进行信号和槽函数连接时,需要获取成员函数地址并将其转为需要的指针。
在mainwindow.cpp中实现连接,注意连接的两个信号和槽函数对应关系是,如果信号有参数,槽函数可以没有参数,但如果槽函数有参数,就要与声明的信号一致;而如果信号没有参数,那么槽函数也没有参数.也就是信号个数可以多于槽函数,但
void(teacher::*mysignal)(QString) = &teacher::hungry;
void(student::*studentSignal)(QString) = &student::treat;
connect(t, mysignal, s, studentSlot);
此外还有信号连接信号,比如下面按钮的点击的信号连接了自定义的信号.
connect(btn, &QPushButton::clicked, t, mysignal);
断开信号
disconnect(btn, &QPushButton::clicked, t, mysignal);
此外,信号可以连接多个槽函数或者信号,多个信号也可以连接同一个槽函数.所以可以看出在数量方面,槽函数和信号没有什么连接限制.
lamda表达式
[ capture ] ( params ) opt -> ret { body; };
***captures* 捕获列表,**lambda可以把上下文变量以值或引用的方式捕获,在body中直接使用。具体如下:
- [] 不捕获任何变量。
- [&] 捕获外部作用域中所有变量,并作为引用在函数体中使用(按引用捕获)。
- [=] 捕获外部作用域中所有变量,并作为副本在函数体中使用(按值捕获)。
- [=,&foo] 按值捕获外部作用域中所有变量,并按引用捕获 foo 变量。
- [bar] 按值捕获 bar 变量,同时不捕获其他变量。
- [this] 捕获当前类中的 this 指针,让 lambda 表达式拥有和当前类成员函数同样的访问权限。如果已经使用了 & 或者 =,就默认添加此选项。捕获 this 的目的是可以在 lamda 中使用当前类的成员函数和成员变量。
*tparams* 模板参数列表(c++20引入),让lambda可以像模板函数一样被调用。暂时忽略
*params* 参数列表,有一点需要注意,在c++14之后允许使用auto左右参数类型。
lambda-specifiers* lambda说明符, 一些可选的参数,这里不多介绍了,有兴趣的读者可以去官方文档上看。这里比较常用的参数就是mutable和exception。其中,表达式(1)中没有trailing-return-type,是因为包含在这一项里面的。
int a = 0;
auto f1 = [=]{ return a++; }; // error,修改按值捕获的外部变量
auto f2 = [=]() mutable { return a++; }; // OK,mutable
*trailing-return-type* 返回值类型,一般可以省略掉,由编译器来推导。
*body* 函数体,函数的具体逻辑。
Qt creator格式化配置
用惯了自动格式化的IDE,Qt并没有自带,这里设置一下.
在帮助->关于插件里搜索Beautifier插件,这个插件会使用不同种格式化的软件,包括Artistic style,calng format以及uncrustify. 这里以Artistic style演示一下.
![image-20230713214334894](https://i.imgur.com/nIsYVMM.png)
首先需要下载这个格式化的软件https://sourceforge.net/projects/astyle,下载后解压进行配置.
在Artistic style选项卡中配置可执行程序,同时使用自定义的风格.
勾选最下免得use customized style,自己添加一种风格.google风格可以这样设置
--style=google -p
delete-empty-lines
indent=spaces=2
参考资料:QtCreator设置代码美化astyle之Artistic_qtcreator美化_偕臧x的博客-CSDN博客
Artistic Style (sourceforge.net)
Qt常出现的中文编码问题
我觉得比较好的解决方案
QT与QString 中文乱码问题解决方法_haiyangdaozhang的博客-CSDN博客
具体的可以看看这一篇 彻底解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)_qt 乱码_利白的博客-CSDN博客
如有疑问,欢迎各位交流!
服务器配置
宝塔:宝塔服务器面板,一键全能部署及管理,送你10850元礼包,点我领取https://www.bt.cn/?invite_code=M19ldHltaXk=
云服务器:https://www.aliyun.com/activity/new/index?userCode=oytu0f6h