C++与Qt开发入门

1 篇文章 0 订阅
个人公众号

个人博客:Sekyoro的博客小屋
个人网站:Proanimer的个人网站

C++与Qt开发入门

闲来无事,我玩玩Qt.不过我看网上说这东西有点过时,还提到了Futter

不过我已经无所谓了

下载镜像网址

http://download.qt.io/archive/qt/

安装可以参照http://download.qt.io/archive/qt/

我是vs2019+qt5.14

不过我在下载时遇到几个问题,在这里提出来

  1. 我用了visual studio搭配Qt,所以需要vsaddin这个插件.既可以在那个镜像网址里下载(速度较快),也可以在vs里下载(我试了试,翻墙速度快很多)
  2. 如果用vs的话需要msvc,一般情况用MinGW.UWP是windows平台,这些据情况安装
  3. 如果vscode是2018或以上,qt5.14只有msvc2017,如果没有装msvc2017的话,套件会出现警告,不过影响不大

image-20210708205605907

  1. 关于Qt for desktop,我之前记得应该有这个东西的,现在这版本没找到了。

当我想打包程序时需要用到windeployqt(Qt5程序打包发布(Windows版)(一)_my1324的博客-CSDN博客_qt打包发布windows),照这个教程不太行

不过只要把相应编译器下包含windeployqt的文件夹bin设为环境变量path就行

image-20210708210707199

这样就方便以后打包可执行程序了.

先入门大概写到这,后面慢慢琢磨

现在继续更新,现在主要介绍一下Qt大名鼎鼎的信号槽机制

image-20230713204335034

信号与槽是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进行信号和槽连接.有参和无参直接传函数,但现在最好不使用这种方式.

image-20230713233343496

image-20230713233351402

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://sourceforge.net/projects/astyle,下载后解压进行配置.

在Artistic style选项卡中配置可执行程序,同时使用自定义的风格.

image-20230713214552217

勾选最下免得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
个人网站与博客,欢迎交流

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

procoder338

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值