Qt教程一

2023-10-28

文章目录

Qt是什么?

Qt(官方发音 [kju:t],音同 cute)是一个跨平台的 C++ 开发库,主要用来开发图形用户界面(Graphical User Interface,GUI)程序,当然也可以开发不带界面的命令行(Command User Interface,CUI)程序。

Qt 是纯 C++ 开发的,所以学好 C++ 非常有必要,Qt 还存在 Python、Ruby、Perl 等脚本语言的绑定, 也就是说可以使用脚本语言开发基于 Qt 的程序。开源社区就是这样,好东西就会被派生扩展,到处使用, 越来越壮大。

Qt 支持的操作系统有很多,例如通用操作系统 Windows、Linux、Unix,智能手机系统 Android、iOS、WinPhone, 嵌入式系统 QNX、VxWorks 等等。

在这里插入图片描述

Qt 可以做什么?

Qt 虽然经常被当做一个 GUI 库,用来开发图形界面应用程序,但这并不是 Qt 的全部;Qt 除了可以绘制漂亮的界面(包括控件、布局、交互),还包含很多其它功能,比如多线程、访问数据库、图像处理、音频视频处理、网络通信、文件操作等,这些 Qt 都已经内置了。

Qt 是应用程序开发的一站式解决方案,有了 Qt,你就可以高枕无忧了!Qt 本身包含的模块也日益丰富, 一直有新模块和第三方模块加入进来。

大部分应用程序都可以使用 Qt 实现,除了与计算机底层结合特别紧密的,例如驱动开发,它直接使用硬件提供的编程接口,而不能使用操作系统自带的函数库。

1997年,Qt 被用来开发 Linux 桌面环境 KDE,大获成功,使 Qt 成为 Linux 环境下开发 C++ GUI 程序的事实标准。

下面的程序都使用 Qt 开发:WPS、YY语音、Skype、豆瓣电台、虾米音乐、淘宝助理、千牛、暴雪的战网客户端、VirtualBox、Opera、咪咕音乐、Google地图、Adobe Photoshop Album 等。

Linux 也是嵌入式的主力军,广泛应用于消费类电子、工业控制、军工电子、电信/网络/通讯、航空航天、汽车电子、医疗设备、仪器仪表等相关行业。

Qt 虽然也支持手机操作系统,但是由于 Android 本身已经有 Java 和 Kotlin,iOS 本身已经有 Objective-C 和 Swift,所以 Qt 在移动端的市场份额几乎可以忽略。

总起来说,Qt 主要用于桌面程序开发和嵌入式开发。

Qt 的辛酸史

说到 Qt 的发展史,那真是一波三折,几经卖身。

Qt 最早是 1991 年由挪威的 Eirik Chambe-Eng 和 Haavard Nord 开发的, 他们随后于 1994 年 3 月 4 号正式成立奇趣科技公司(Trolltech)。Qt 原本是商业授权的跨平台开发库, 在 2000 年奇趣科技公司为开源社区发布了遵循 GPL(GNU General Public License)许可证的开源版本。

在 2008 年,诺基亚公司收购了奇趣科技公司,并增加了 LGPL(GNU Lesser General Public License)的授权模式。诺基亚联合英特尔利用 Qt 开发了全新的智能手机系统 MeeGo,可惜遭遇了微软木马屠城,诺基亚被迫放弃了 MeeGo, 而 Qt 商业授权业务也于 2011 年 3 月出售给了芬兰 IT 服务公司 Digia。

微软收购诺基亚

当然好消息是 Digia 于 2014 年 9 月宣布成立 Qt Company 全资子公司,独立运营 Qt 商业授权业务。目前 Qt 公司大力推广移动平台开发和商业应用, 总的来说 Qt 历经曲折,现在算是步入正轨了。

经过 30 多年的发展,Qt 已经成为最优秀的跨平台开发框架之一,在各行各业的项目开发中得到广泛应用。许多大型软件都是用 Qt 开发的,如 Autodesk Maya、Google Earth、Skype、WPS Office等。

永远不要忽视微软帝国的威胁,作为软件业的一代霸主,任何人都不要天真地试图和它做朋友,因为霸主不可能有朋友。微软的木马屠城是所有诺基亚人和芬兰人的痛,希望读者们都记牢这条。

Qt 和 KDE

之前提到 Qt 原本是商业授权软件,是怎么开源的呢?这就涉及 Qt 和 KDE 的纠葛了。

KDE 是 Linux 操作系统的桌面环境,与 GNOME 桌面是类似的,作为开源桌面它们竞争的情况更为多见。

KDE 是采用 GPL 许可证发布的开源软件,而最初 Qt 是商业授权的,存在商业侵权风险,GNOME 则是基于开源 GTK 库的,没有什么商业风险,这一度是 GNOME 优越于 KDE 的特性。

由于 Qt 的商业授权,KDE 社区一度混乱纠结,与此同时 GNOME 则如火如荼发展起来了。 KDE 毕竟算是亲儿子,被另一波人欺负,奇趣科技公司当然看不下去了,最后是奇趣科技公司为了赢得开发者的支持,为 Qt 增加了 GPL 的开源授权, 对于开源社区而言,遵循 GPL 使用 Qt 就不需要付费,这为 KDE 解决了燃眉之急。

之后 KDE 桌面和 GNOME 都发展壮大起来,都做得越来越好了。

GPL 和 LGPL

除了商业授权,目前 Qt 的开源授权有两种,一种是 GPL 授权,另一种是 LGPL 授权(诺基亚收购后新增)。

对这两种开源授权,简单来说,使用 GPL 版本的软件一定还是 GPL 的开源软件,无论是使用了 Qt 的程序代码还是修改了 Qt 库代码,都必须按照 GPL 来发布,这是 GPL 的传染性。

GPL 是什么都要开源,这对商业软件应用是不利的,所以诺基亚增加了 LGPL 授权 (第一个 L 可以叫 Lesser 宽松版或 Library 开发库版)。使用 LGPL 授权就可以利用 Qt 官方动态链接库,而不必开放商业代码。只要不修改和定制 Qt 库,仅使用 Qt 官方发布的动态链接库就可以不开源,这是商业友好的授权模式。

其实只要不是做商业,就不太需要关注用什么授权,以 GPL 授权发布程序代码就可以了。

如何选择开源协议

世界上的开源协议有上百种,很少有人能彻底搞清它们之间的区别,即使在最流行的六种开源协议——GPL、BSD、MIT、Mozilla、Apache 和 LGPL——之中做选择,也很复杂。

乌克兰程序员 Paul Bagwell 画了一张分析图,说明应该怎么选择开源协议,大家看了一目了然,真是清爽。

如何选择开源协议

最后请认准 Qt 官方网站Qt官网

2.为什么用Qt?

用 Qt 来开发 Windows 桌面程序有以下优点:

  • 简单易学:Qt 封装的很好,几行代码就可以开发出一个简单的客户端,不需要了解 Windows API。
  • 资料丰富:资料丰富能够成倍降低学习成本,否则你只能去看源码,关于 DirectUI、Htmlayout、aardio 的资料就很少。
  • 漂亮的界面:Qt 很容易做出漂亮的界面和炫酷的动画,而 MFC、WTL、wxWidgets 比较麻烦。
  • 独立安装:Qt 程序最终会编译为本地代码,不需要其他库的支撑,而 Java 要安装虚拟机,C# 要安装 .NET Framework。
  • 跨平台:如果你的程序需要运行在多个平台下,同时又希望降低开发成本,Qt 几乎是必备的。

Qt 和 MFC

读者经常将 MFC 和 Qt 进行对比,MFC 只能应用在 Windows 平台,而 Qt 是跨平台的,一次编写,到处运行。

另外,Qt 已经封装了底层细节,学习 Qt 将会非常简单;而 MFC 只是给 Windows API 加了一层包装,不了解 Windows API 也学不好 MFC,大家普遍反映 MFC 难学。

我们不能简单地说 Qt 好还是 MFC 好,两者都有用武之地;但是初学者学习 Qt 会比较简单,不用应付那些烦人的 Windows API,很快就能开发出带有漂亮界面的应用程序。

3.Qt Creator

Qt是开源的库 Qt Creator是一个集成开发环境

安装文档教程

安装视频教程

安装之后添加组件

1,找到Qt安装目录中的维护工具MaintenanceTool.exe

image-20211118005956922

2,添加国内源

手动添加储存库要定位一个储存有QT在线安装镜像的地址,这可难坏我了,但是经过不懈努力还是被我找到了(网址:http://download.qt.io/static/mirrorlist/)这个网站,显示了各国的qt镜像站点,中国有四个,我用的是中科大的站,点击HTTP会进入一个网络文件夹。

image-20211118010214312

然后依次进入/online/qtsdkrepository/windows_x86/root/qt/ 最终的文件夹显示如下,在这个界面复制一下当前地址框地址

编码问题

Qt Creator是跨平台的 Qt IDE, Qt Creator 是 Qt 被 Nokia收购后推出的一款新的轻量级集成开发环境(IDE)。此 IDE 能够跨平台运行,支持的系统包括 Linux(32 位及 64 位)、Mac OS X 以及 Windows。

  • 使用QtCreator创建的项目目录中不能包含中文和空格
  • QtCreator默认使用Utf8格式编码对文件字符进行编码

为了处理汉字,程序员设计了用于简体中文的GB2312和用于繁体中文的big5。GB2312 支持的汉字太少,1995年的汉字扩展规范GBK1.0,支持了更多的汉字。2000年的 GB18030取代了GBK1.0成为了正式的国家标准。Unicode 也是一种字符编码方法,不过它是由国际组织设计,可以容纳全世界所有语言文字的编码方案。

修改Qt Creator文件编码:菜单栏->工具->选项->文本编辑器->行为->文件编码

主界面

创建项目

  • 选择项目模板

image-20210401025945615

  • 填写项目名称和选择路径(不能包含中文和空格不能包含中文和空格不能包含中文和空格~)

image-20210401030344525

  • 定义编译系统(qmake即可)

    image-20210401031012239

  • 选择窗口类信息

image-20210401031350429

  • 选择编译套件(用Qt Creator开发请选择MinGW Minimalist GNU for Windows)

    image-20210401031609578

项目文件

main.cpp

主函数所在的文件

#include "widget.h"				//生成的窗口类头文件
#include <QApplication>			//引用程序类头文件

int main(int argc, char *argv[])
{
    //创建应用程序对象, 在一个Qt项目中实例对象有且仅有一个
    // 类的作用: 检测触发的事件, 进行事件循环并处理
    QApplication a(argc, argv);	
    //创建窗口对象
    Widget w;
    //显示窗口
    w.show();
    //应用程序对象开始事件循环,保证应用程序不退出
    return a.exec();
}

widget.h

窗口类头文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>			//Qt标准窗口类头文件

class Widget : public QWidget	//自己的类继承自Qwidget类
{
    Q_OBJECT					//使用信号与槽机制,必须包含该宏

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
};
#endif // WIDGET_H

widget.cpp

窗口类源文件

#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
}

Widget::~Widget()
{
}

HelloQt.pro

Qt项目文件,注释需要用#号

#项目编译时需要加载哪些模块
QT       += core gui

# 如果当前Qt版本大于4, 要添加一个额外的模块: widgets
# Qt 5中对gui模块进行了拆分, 将 widgets 独立出来了
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

# 让Qt支持c++11标准
CONFIG += c++11

#如果您使用任何已标记为不推荐使用的Qt功能,则以下定义使您的编译器发出警告(确切的警告取决于您的编译器)。 
#请参考不推荐使用的API的文档,以了解如何将您的代码移植远离它。
DEFINES += QT_DEPRECATED_WARNINGS

#如果使用过时的API,您还可以使代码无法编译。
#为此,请取消注释以下行。
#您也可以选择仅在特定版本的Qt之前禁用已弃用的API。
#DEFINES + = QT_DISABLE_DEPRECATED_BEFORE = 0x060000    #禁用所有在Qt 6.0.0之前弃用的API

# 项目中的源文件	删除后,项目里不会显示所有的源文件
SOURCES += \
    main.cpp \
    widget.cpp

# 项目中的头文件
HEADERS += \
    widget.h

#部署的默认规则
qnx: target.path = /tmp/$${TARGET}/bin					#嵌入式
else: unix:!android: target.path = /opt/$${TARGET}/bin	#unix
!isEmpty(target.path): INSTALLS += target

pro是Qt的工程文件,这个文件是给qmake用来生成Makefile用的。

如果了解makefile的人应该知道,Makefile的三个关键点就是目标依赖命令。这里也很类似。pro文件中可以指明这个Qt项目的头文件源文件链接的外部库目标文件名模板(生成什么样的Makefile)版本配置(debug/release)等。

常用qmake变量

.pro中变量 含义 示例
TEMPLATE 模板变量指定生成makefile(app:应用程序/lib:库) TEMPLATE = app
QT 指定加载的Qt模块(core/gui/widgets…) QT += widgtes
DESTDIR 指定生成的应用程序放置的目录 DESTDIR += …/bin
TARGET 指定生成的应用程序名 TARGET = hello
HEADERS 工程中包含的头文件 HEADERS += hello.h
FORMS 工程中包含的.ui设计文件 FORMS += hello.ui
SOURCES 工程中包含的源文件 SOURCES += main.cpp hello.cpp
RESOURCES 工程中包含的资源文件 RESOURCES += qrc/hello.qrc
LIBS 引入的lib文件的路径 -L:引入路径 LIBS += -L.
CONFIG 用来告诉qmake关于应用程序的配置信息 CONFIG+= qt warn_on release
UI_DIR 指定.ui文件转化成ui_*.h文件的存放目录 UI_DIR += forms
RCC_DIR 指定将.qrc文件转换成qrc_*.h文件的存放目录 RCC_DIR += …/tmp
MOC_DIR 指定将含Q_OBJECT的头文件转换成标准.h文件的存放目录 MOC_DIR += …/tmp
OBJECTS_DIR 指定目标文件(obj)的存放目录 OBJECTS_DIR += …/tmp
DEPENDPATH 程序编译时依赖的相关路径 DEPENDPATH += . forms include qrc sources
INCLUDEPATH 头文件包含路径 INCLUDEPATH += .
DEFINES 增加预处理器宏(gcc的-D选项)。 DEFINES += USE_MY_STUFF
QMAKE_CFLAGS 设置c编译器flag参数 QMAKE_CFLAGS += -g
QMAKE_CXXFLAGS 设置c++编译器flag参数 QMAKE_CXXFLAGS += -g
QMAKE_LFLAGS 设置链接器flag参数 QMAKE_LFLAGS += -rdynamic

项目操作

添加新文件

image-20210402035458903

打开Qt项目

image-20210402040640720

其他

image-20210402041310929

常用快捷键

  • 运行 Ctrl + r
  • 编译 Ctrl + b
  • 注释 Ctrl + /
  • 字体缩放 Ctrl + 鼠标滚轮
  • 查找/替换 Ctrl + f
  • 整行移动 Ctrl + Shift + ↑ 或 ↓
  • 自动对齐 Ctrl + i
  • 帮助文档
    • 第一种:Qt Creator 直接查看 F1
    • 第二种:打开独立的帮助文档程序 assistant
  • 同名.h 和 .cpp 之间的切换 F4
  • 快速添加函数的定义 Alt + Enter 鼠标移动到函数申明上
  • 修改变量名,并应用到所有用到该变量的地方 Ctrl + Shift +r
  • 快速打开输出窗口 Alt + 数字键(1-8)

image-20210811011302724

  • 书签功能,即在某行代码处进行标记,方便以后找到。书签也可以添加文字标注。

    • 按Ctrl + M 添加/删除书签

    • 按Ctrl + . 查找并移动到下一个标签

主题配置

萝卜白菜各有所爱,如何修改QtCreator的主题呢?

菜单栏->工具->选项->文本编辑器

image-20210824183755400

上面是选择系统自带的,当然也可以自己配置一个,我这配置了一个Vs白色主题的。

  • xml文件 Visual studio white(Qt creator代码样式).xml

  • 把该文件复制到Qt的安装目录下的->Qt\Qt5.14.2\Tools\QtCreator\share\qtcreator\styles目录中

  • 最后进入文本编辑器选择

4.Qt+VS2019

为什么用VS写Qt程序?

很多人在Qt上写代码时,感觉不是很舒服,所以想在Vs上写Qt程序,而且Vs具有强大的调试能力,所以咱们可以通过一些配置实现此目的。

image-20220305193719451

1.打开VS

选择菜单栏->扩展->管理扩展

图片

2.VS安装Qt插件

选择菜单栏的 扩展->管理扩展,输入Qt搜索,然后下载Qt Visual Studio Tools(下载灰常的银杏,慢的死~还不一定能下载)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fDxZsEh1-1646484003126)(https://s2.loli.net/2022/03/05/p2bAk36K4M1jwzY.png)]

如果实在不能忍受这龟速,咱们来别的办法

先到Qt官网下载对于版本的插件,我这里是Vs2019:

Qt官网插件下载

微软拓展商店下载

图片

如果跳到如下页面,选择清华大学镜像源下载即可。

img

3.安装VSIX(即上面下载的那个插件)

如果是通过Vs下载的,会自动安装。

如果是手动下载的,需要双击自己安装。

打开安装包之后,点击Install等待安装完成即可。

图片

安装之前,请先关掉Vs没有关掉会出现如下界面,点击end tasks即可

图片

关闭Vs之后,一秒安装完成

图片

安装完成,关掉程序

4.设置插件

再次打开Vs,扩展->Qt VS Tools->Qt Options

图片

点击Qt Options之后会弹出如下界面

图片

如果在弹出上述界面的同时,还弹出如下这个错误界面,不要担心,这是由于安装插件的时候,会自动配置,但是自动配置的路径和实际的Qt安装路径不一致,我们自己再配置一下就ok了

图片

首先删掉自动配置好的路径,然后点击Add自己添加一个,如下是具体的路径选项,选择msvc2017_64文件夹,点击确定即可

图片

然后点击OK(Name是自己取的)

图片

5.VS创建Qt项目

在Vs中点击新建项目,搜索Qt找到Qt Widgets Application然后点击下一步。

图片

下一步之后,给项目取名称

图片

点击创建,然后点击Next

图片

然后从Debug和Release模式里选择一个即可(默认即可)

图片

然后点击完成

image-20220305203617139

最后,Ctrl+F5,大功告成

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sGxW180D-1646484003138)(https://s2.loli.net/2022/03/05/ShpdE8lJuyPVHRr.png)]

6,中文乱码

由于windows默认的编码方式为GB2312,而Qt使用的是Unicode,两种编码方式不一样导致了乱码产生。

我们需要把代码文件改为utf-8保存,可以手动修改,也可以借助插件自动修改。

1,手动修改

VS隐藏了高级保存功能,导致没办法直接去设置代码编码。那么我们直接把高级保存功能调用出来即可:

  1. 单击“工具”|“自定义”命令,弹出“自定义”对话框。

    image-20210504163414133

  2. 单击“命令”标签,进入“命令”选项卡;在“菜单栏”下拉列表中,选择“文件”选项;单击“添加命令”按钮,弹出“添加命令”对话框。

    image-20210504164213477
  3. 在“类别”列表中,选择“文件”选项;在“命令”列表中,选择“高级保存选项”选项。 单击“确定”。

    image-20210504163713084

…这个操作还是比较麻烦,使用下面的自动修改是最方便的

2,自动修改

打开 VS2019,依次点击 工具 -> 扩展和更新,搜索插件 “ForceUTF8”,安装后源码文件会强制保存为带 BOM 的 UTF-8。

image-20210504162322942

注意:修改之后,写C/C++代码会出现乱码,此时再进到插件->已安装吧Force UTF-8禁用掉,然后重启Vs即可

image-20210504162639221

7,Vs中修改应用程序图标

  • 1,备好一个.ico图标文件

  • 2,创建一个.rc文件(创建txt修改后缀即可),然后加入以下代码

    IDI_ICON1 ICON DISCARDABLE "zay.ico"
    
  • 3,将.rc文件和.ico文件都放在项目的文件夹中

  • 在VS中右击Source File筛选器选择添加||现有项,将logo.rczay.ico文件添加到项目中,重新生成即可

5.Qt Creator + MSVC

先安装好Qt Creator和visual studio,前者做编辑器,用后者的编译器,最后安装一个调试器。

通过windows SDK工具安装调试器(CDB)。

下载之后安装即可

img

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZTU7OuPv-1646484003141)(https://s2.loli.net/2022/03/05/1YE2uMzs7itgcyS.png)]

安装完成之后重新打开Qt Creator,会自动检测调试工具的路径。

image-20211015032759727

安装Vs之后,编译器也会自动检测到(我这是安装了2019与2021,所以有很多)
image-20211015032904988

最后需要自己选择一下,对应版本的编译器和调试器x64和x86都可以配置一下
image-20211015033016164

中文乱码

如果出现乱码可以在.pro文件中加入以下代码

msvc
{
	QMAKE_CFLAGS += /utf-8	#C语言编译器选项
	QMAKE_CXXFLAGS+=/utf-8	#C++编译器选项
}

6.需要的C++知识

1.什么是C++

C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。

2.如何定义一个类

class Animal
{
public:
    Animal(const std::string& name,int age)
        :name(name),age(age)
    {

    }
    void cry()
    {
        std::cout<<name<<" "<<age<<" "<<u8"Animal cry"<<std::endl;
    }
private:
    std::string name;
    int age;
};

3.什么是对象,如何定义?

  • 对象是类的实例化
Animal cat("猫",5);

Animal *dog = new Animal("dog",3);
delete dog;

4.如何访问类的成员变量

普通变量通过" . “,指针变量通过” -> "

cat.cry();
dog->cry();

5.类的函数成员

一:在类里面声明
二:实现这个函数,我们可以直接在类的里面写,也可以写在类的外面。

class Animal
{
public:
    Animal(const std::string& name,int age);
    void cry();
private:
    std::string name;
    int age;
};

Animal::Animal(const std::string& name,int age)
        :name(name),age(age)
{}
void Animal::cry()
{
    std::cout<<name<<" "<<age<<" "<<u8"Animal cry"<<std::endl;
}

6.类函数的重载特性

C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,这就是重载函数。重载函数常用来实现功能类似而所处理的数据类型不同的问题。不能只有函数返回值类型不同。

class Animal
{
public:
	...
    void cry()
    {
        std::cout<<name<<" "<<age<<" "<<u8"Animal cry"<<std::endl;
    }
    void cry(int count)
    {
        for(int i=0;i<count;i++)
        {
            std::cout<<i<<"->"<<name<<" "<<age<<" "<<u8"Animal cry"<<std::endl;
        }
    }
private:
	...
};

7.构造函数和析构函数

构造函数:定义对象时会调用构造函数

析构函数:生命周期结束或者释放对象时,会调用析构函数
特点

  • 构造函数和析构函数的函数名和类名一样,能够重载;没有返回类型申明
  • 析构函数在名字前面加~,析构函数不能被重载;没有返回类型申明

匿名对象

深、浅拷贝

移动语义

8.类的继承

类的继承允许我们在新的类里面继承父类的public和protected部分。

class Snake:public Animal
{
public:
    using Animal::Animal;
    Snake(int age)
        :Animal("snake",age)
    {

    }
};

9.虚函数和纯虚函数

虚函数:有实际定义的,允许派生类对他进行覆盖式的替换,virtual修饰。
纯虚函数:没有实际定义的虚函数就是纯虚函数,子类必须自己实现。

虚函数的优点是可以预留接口(API)。

10.lambda表达式

Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。

基本语法:

[capture list] (parameter list)mutable/noexcept -> return type { function body }
/*
capture list		参数捕获列表
parameter list 		形参列表(可省略)
mutable/noexcept	选项	  (可省略)
	·mutable	可以修改按值传递进来的拷贝(注意是能修改拷贝,而不是值本身)
	·noexcept	表示函数不抛异常
-> return type		尾置返回类型(可省略)
function body		函数体
*/
  • capture list 参数捕获列表
    • [] 不捕捉任何变量
    • [&] 捕获外部作用域中所有变量, 并作为引用在函数体内使用 (按引用捕获)
    • [=] 捕获外部作用域中所有变量, 并作为副本在函数体内使用 (按值捕获)
      • 拷贝的副本在匿名函数体内部是只读的
    • [=, &foo] 按值捕获外部作用域中所有变量, 并按照引用捕获外部变量 foo
    • [bar] 按值捕获 bar 变量, 同时不捕获其他变量
    • [&bar] 按值捕获 bar 变量, 同时不捕获其他变量
    • [this] 捕获当前类中的this指针
      • 让lambda表达式拥有和当前类成员函数同样的访问权限
      • 如果已经使用了 & 或者 =, 默认添加此选项
  • parameter list 形参列表(可省略)
  • mutable/noexcept 选项 (可省略)
    • mutable 可以修改按值传递进来的拷贝(注意是能修改拷贝,而不是值本身)
    • noexcept 表示函数不抛异常
  • -> return type 尾置返回类型(可省略)
  • function body 函数体
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt教程一 的相关文章

  • 为什么总是在 mouseDoubleClickEvent 之前调用 mousePressEvent

    请考虑以下代码 include
  • 如何在 Qt simple 上解密/加密某些字符串(例如密码)

    这是我得到的 Qt SDK版本4 6 2 视窗XP 问题 我怎样才能简单地加密和简单地加密QString价值 我需要它能够将一些加密的字符串保存到 INI 文件中 并在重新打开应用程序后将字符串加密为正常的密码字符串值 PS 我正在寻找简单
  • 包含 Qt 标头的正确方法是什么?

    到目前为止我知道几种方法 includeQt 类 include
  • QML改变图像颜色

    我搜索了如何对图像进行着色 格式为 svg 或 png 我尝试用一 个填充图像的矩形覆盖我的图像 但由于我的图像不是矩形 它会给整个矩形着色 而不仅仅是图像 可以用qml改变图像颜色吗 或者 是否可以使用 QPixmap 更改 qt 使用
  • 将 C++ 代码(本机客户端)移植到浏览器(Web 应用程序)

    我有一个使用 Qt creator SDK 编写的 C 模块 我想将此代码移植到任何网页上运行 而不会对最终用户损害源代码 用户应该能够在任何浏览器 Chrome Firefox Safari Explorer 上看到此模块的输出 而无需安
  • PyQt 和 QSignalMapper/lambdas - 多个信号,单槽

    我在 PyQt 的菜单上有一个操作列表 每个操作对应我想要显示的每个不同的提要 所以我有一个 Y 将活动源设置为 Y Z 将其设置为 Z 等等 对于网络漫画阅读程序 我的菜单上都有 并且觉得自动化方法可能更好 而不是每次都打字 类似于将其添
  • 如何在不同的QT线程中创建一个窗口?

    我有一个应用程序 其中每个线程 主线程除外 都需要创建自己的窗口 我尝试创建一个线程然后调用this gt exec in the run功能 然而 在我接到那个电话之前我就收到了一个错误 ASSERT failure in QWidget
  • 在Qt中,如何正确实现委托?

    我遵循模型 视图 控制器范例 我很确定模型和视图是正确的 但我认为我的代表做错了一些事情 一切都 有效 除了第一次单击控件只是 点亮控件 而第二次单击与之交互之外 这是代表通常的实施方式吗 我的实现需要大量的构造和销毁 由scoped pt
  • 在 Windows 上从源代码构建 PhantomJS-2

    我正在尝试基于这些在 Windows 8 1 x64 上从源代码构建 PhantomJS 2 的开发版本指示 https github com ariya phantomjs wiki PhantomJS 2 但是我收到以下错误 mingw
  • 如何重写(重新实现)QFileSystemModel 中的成员函数

    我已经为此苦苦挣扎了一段时间 Qt s QFileSystemModel由于图标获取算法非常糟糕 在获取数百个文件时速度非常慢 我想完全禁用图标 它们被提取到QFileSystemModel data方法不是虚拟的 QFileSystemM
  • 在 QtCreator 中调试时如何查看 qDebug 消息

    我正在从 Eclipse CDT 带有 Qt 集成插件 过渡到 QtCreator 2 0 但仍有一件事困扰着我 QtCreator 当我在 QtCreator 中调试时 我在Application output tab直到我停止正在调试的
  • qvariant 作为 qhash 中的键

    我想创建一个带有 QVariants 键的数据结构 它看起来像这样 QHash
  • 构建qt程序时未定义的符号:找不到qt_version_tag

    我正在学习Qt5 6 我正在使用 Ubuntu 14 4 当我链接我的程序时 出现以下错误 undefined reference to qt version tag 在 CMakeLists txt 中 link libraries Qt
  • 如何从键盘为 QTableWidget 创建信号?

    我有一张桌子 可以通过左 右 上 下按钮在里面移动 现在 当我停留在某个单元格并按空格键时 我需要创建一个信号 该信号还应该带来该单元格的坐标 我尝试使用 QTableWidget 的标准信号 但它不起作用 我该如何解决这个问题 创建一个单
  • 我如何告诉 QTableWidget 结束编辑单元格?

    我正在显示一个弹出菜单来选择 QTableWidget 中的某些值 最下面的项目是 修改列表 条目 当我选择它时 应自动出现一个新窗口 并且 QComboBox 应消失 并且单元格返回到 Qt DisplayRole 状态 现在 Qt 拥有
  • 在 Windows 上静默安装 Qt55 Enterprise

    编辑 在 Qt 支持的帮助下 我已经解决了如何自动化 Qt 企业安装程序的这两个部分 下面是脚本调用 我正在尝试在 Windows 8 1 和 Windows 10 上静默安装 Qt 5 5 1 Enterprise 使用 script 开
  • 在 Qt 中创建/写入新文件

    我正在尝试写入文件 如果该文件不存在 则创建它 我在互联网上搜索过 但没有任何效果 我的代码目前看起来像这样 QString filename Data txt QFile file filename if file open QIODev
  • 使用信号和槽更新指针

    我对 Qt 很陌生 请帮我解决这个问题 我正在使用线程在后台执行密集操作 同时我想更新 UI 所以我使用 SIGNALS 和 SLOTS 为了更新 UI 我发出一个信号并更新 UI 让我们考虑下面的示例代码 struct sample QS
  • 如何阻止 Qt Creator 将可执行文件放置在“调试”子目录中?

    我正在 Qt Creator 中构建一个项目 虽然我不关心中间 obj 文件去哪里 但重要的是最终的可执行文件应放入 并运行 许多依赖项 DLL 等所在的特定目录中 被发现 因此 在 Qt Creator 中 我选择 Shadow Buil
  • 如何从 ffmpeg 中打开的文件获取流信息?

    我正在尝试使用 ffmpeg 读取视频文件 我有与其旧版本相对应的工作代码 并开始尝试升级到最新的构建版本 将所有这些已弃用的函数替换为其实际的类似函数 但是我遇到了问题 似乎没有检索到任何流 并且视频负载停止在轨道中 这是我正在使用的代码

随机推荐

  • stackgan

    使用pix2pix网络进行stackgan的叠加 pix2pix来自github上一位日本同学的代码 stackgan https github com hanzhanggit StackGAN Pytorch blob master co
  • LC-6248. 统计中位数为 K 的子数组(回文:中心扩散+哈希、等价转换)【周赛321】

    6248 统计中位数为 K 的子数组 难度困难15 给你一个长度为 n 的数组 nums 该数组由从 1 到 n 的 不同 整数组成 另给你一个正整数 k 统计并返回 num 中的 中位数 等于 k 的非空子数组的数目 注意 数组的中位数是
  • 使用Matlab实现模拟退火算法求解函数极值问题

    使用Matlab实现模拟退火算法求解函数极值问题 模拟退火算法 Simulated Annealing 是一种启发式优化算法 常用于求解函数的极值问题 该算法的灵感来源于固体退火过程中的原子运动规律 通过模拟物质的退火过程来搜索最优解 在本
  • java代码走查审查规范

    分类 重要性 检查项 备注 命名 重要 命名规则是否与所采用的规范保持一致 成员变量 方法参数等需要使用首字母小写 其余单词首字母大写的命名方式 禁止使用下划线 数字等方式命名不要出现局部变量 成员变量大写字母开头等问题 一般 是否遵循了最
  • 计算机图形学games101作业二 ---- 三角形光栅化 超采样抗锯齿 黑边处理

    games101作业二 三角形光栅化 超采样抗锯齿 黑边处理 本文是在学习计算机图形学时根据课程作业进行整理的笔记 有错误请指出 如果是同课程 请勿复制粘贴 谢谢 文章目录 CG homework1 0 本次作业 实现函数及简单描述 详细
  • WSL通过WINDOWS走代理

    WSL如何与WINDOWS端口通信 由于项目需求想让WSL和桌面的端口通信 看了网上大量的帖子很是糟乱 浪费了大量的时间 于是本人写此博客来帮助到有需要的人 软件配置 勾选软件的局域网的连接 开启MUX多路复用 需要通信的端口信息如下图所示
  • centos8解决yum安装报错

    Error Failed to download metadata for repo appstream Cannot prepare internal mirrorlist No URLs in mirrorlist 在学习使用 dock
  • SQL基础知识整理

    SQL基础知识整理 常见的SQL面试题 经典50题 三 50道面试题 2 汇总统计分组分析 3 复杂查询 sql面试题 topN问题 4 多表查询 面试题类型总结 这类题目属于行列如何互换 解题思路如下 其他面试题 SQL基础知识整理 se
  • html点击收缩展开菜单栏,jquery实现可点击伸缩与展开的菜单效果代码

    本文实例讲述了jquery实现可点击伸缩与展开的菜单效果代码 分享给大家供大家参考 具体如下 这是一款jquery实现的点击伸缩与展开的菜单代码 操作方式大家都知道吧 点击一下展开二级菜单的内容 再次点击则合拢 很经典的折叠菜单 运行效果截
  • Spark一路火花带闪电——Pair RDD常用算子(参数及其返回值)探究

    文章目录 转化算子 行动算子 转化算子 以键值对集合 1 2 3 4 3 6 为例 RDD U T 注意下面的函数 对应U和T reduceByKey f T T gt T RDD U T 合并具有相同值的键 rdd reduceByKey
  • 学生信息管理系统(c语言版)

    大一下C语言要交课程设计 于是就写了一个学生信息管理系统 仅供参考 学生信息包括姓名 学号 性别 年龄和各科成绩 可根据需要自行修改添加 包括增 删 改查 查看所有 保存 清空7个功能 每个功能都封装成一个函数 保存功能是将所添加的信息保存
  • 使用 js 实现 队列

    队列是一种特殊的列表 队列只能在队尾插入元素 在队首删除元素 队列用于存储按顺序排列的数据 先进先出 参数 接收的参数为数组类型 属性及方法 栈的抽象数据类型定义 列表 属性或方法 描述 enqueue 方法 向队尾加入一个元素 deque
  • 【计算机网络】计网知识点

    T1 互联网两大组成部分的特点是什么 它们的工作方式各有什么特点 因特网两大组成部分 边缘部分 核心部分 1 特点 边缘部分 由各主机构成 核心部分 由各路由器连网组成 2 工作方式特点 边缘部分 用户直接进行信息处理和信息共享 低速连入核
  • 使用 MATLAB 进行气象激光雷达图像分析(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 在经济高速发展的当下 环境保护是人类不可避
  • SpringCloud 中pom文件的解析

    本文仅为笔者笔记 欢迎指正 探讨
  • ClassNotFoundException: com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator

    测试类启动访问数据库报错 详细报错信息如下 java lang IllegalStateException Failed to load ApplicationContext at org springframework test cont
  • RedLock加锁源码分析

    目录 Redis获取锁 加锁操作 lockInterruptibly unLock Redis获取锁 首先了解下Redisson 获取RLock RedissionLock public RLock getLock String name
  • 《高质量程序设计指南--C/C++语言》学习笔记

    高质量程序设计指南 C C 语言 学习笔记 高质量软件开发之道 程序设计入门 内部名称 连接规范 变量及其初始化 浮点变量与零值比较 C C常量 正确定义符号常量 类中的常量 实际应用中如何定义常量 在C程序中定义多个编译单元或模块公用的常
  • whl文件安装方法

    whl格式本质上是一个压缩包 里面包含了py文件 以及经过编译的pyd文件 使得可以在不具备编译环境的情况下 选择合适自己的python环境进行安装 问题描述 whl下载了后不会安装 解决方法 1 把下载的文件拖到桌面 2 进入cmd命令行
  • Qt教程一

    文章目录 Qt是什么 Qt 可以做什么 Qt 的辛酸史 Qt 和 KDE GPL 和 LGPL 如何选择开源协议 2 为什么用Qt Qt 和 MFC 3 Qt Creator 安装之后添加组件 编码问题 主界面 创建项目 项目文件 main