Qt知识点总结。。。持续更新

一、知识点总结

琐碎知识点总结

1)qt不能跨线程操作Ui界面,如在Qt子线程操作主线程下的UI控件,会发生无法预知的界面显示异常甚至崩溃。

2)定时器不能跨线程调用。

3)如果控件被设置为固定尺寸,则布局里的stretch属性(控制布局里控件的伸缩大小)就不能对布局里控件的大小进行自由伸缩,但会留出足够的伸缩空间给控件伸缩。

4)Qt中的布局函数setStretch,setSpacing,setMargin这三个函数的区别:

  • setStretch(int index, int stretch);//用于设置布局中的部件的拉伸因子,index表示布局中的部件索引,stretch表示拉伸因子;
  • setSpacing(int spacing);//用于设置布局中的部件之间的间距,spacing表示部件之间的间距大小,以像素为单位;
  • setMargin(int margin);//用于设置布局边缘与布局内部部件之间的边距,margin表示边距的大小,以像素为单位。

5)QTabWidget与QTabBar:QTabBar=每一个标签tab,QTabWidget=每一个标签tab+插入的QWidget。

6)QSlider(滑动条)、QScrollBar(滚动条)、QProgressBar(进度条)区别:滑动条(QSlider)主要是设置数值范围的,滚动条(QScrollBar)主要用于滚动内容的,进度条主要是用于显示任务进度的。

7)QScrollBar(滚动条)与QScrollArea(滚动区域)区别:QScrollBar(滚动条)是一个单独的滚动条组件,QScrollArea(滚动区域)是一个容器组件用于在一个矩形区域内显示并滚动内容,并且QScrollArea会自动根据内容的大小以及可见区域的大小提供滚动条。当内容的尺寸大于可见区域时,QScrollArea会显示相应的滚动条,以便用户可以滚动内容并查看超出可见区域的部分。

8)QStringList和QList的区别:

  • QStringList是Qt提供的专门存储字符串的容器类,其底层实现是基于QString的链表结构。使用QStringList时,可以直接进行字符串的操作和处理,例如追加、删除、查找等。
  • QList是模板类QList的一个特化版本,用于存储QString类型的元素。使用QList时,需要通过QList提供的成员函数来进行字符串的操作和处理,如append、remove、indexOf等。
  • 一般来说,如果需要处理字符串列表并进行一些特定的操作,使用QStringList会更为方便。如果需要通用的动态数组容器,并且元素为QString类型,可以选择使用QList。

9)QFileInfoList与QList两者是等价的,QFileInfoList 实际上是 QList 的别名,它们都表示一个包含 QFileInfo 对象的列表,QFileInfoList是用于获得指定目录下所有文件/文件夹的基本信息。

10)当前日期的格式化获取:调用QDate的静态函数currentDate,使用如下:QDate::currentDate().toString(“yyyy-MM-dd”)。

11)字符串类型:C—>char* C++—>std::String、char* Qt—QString、QByteArray。

12)QByteArray类可以将其看成c语言char*的升级版。我们可以在调用该类构造函数的时候申请一块动态内存,用来存放要处理的字符串数据,而QString也是封装了字符串,但是内部的编码是utf8,utf8属于Unicode字符集,它固定使用多个字节(window为2字节,linux为3字节)来表示一个字符,这样可以将世界上几乎所有语言的常用字符收录其中。

13)append和prepend属于Qt风格,push_back和push_front属于C++风格。

14)QByteArray QString::toutf8() const是QString类的成员函数,可以将其utf8格式的QByteArray,这是最常用的QString转换程QByteArray的方法,也最好用这个,不建议用下面的toLocal8bit()函数。

15)QString QString::fromUtf8(const QByteArray &str)是QString类的静态函数,可以将QByteArray 转换为QString 。

16)QString QString::fromLocal8Bit(const QByteArray &str)是QString类的静态函数,可以将本地编码的QByteArray 转换为QString,一般windows系统的本地编码格式是ANSI码(也叫本地编码页编码),MSVC默认的就是ANSI格式。

17)QByteArray QString::toLocal8Bit() const是QString类的成员函数,可以将QString类对象转换为本地编码的QByteArray对象。

18)QString类做不到一步转换到char*,只有先通过QString调用QString的成员函数toutf8转换到QByteArray,再调用QByteArray的成员函数data才能转换程char*。

19)QString与QByteArray类的区别:1)同样的字符串串对象,其length有可能是不一样的,QString算的length是字符长度,一个汉字字符或其他特殊字符都算1个,而QByteArray算的是字符串占用的字节数,一个汉字占3个字节,一个英文占1个字节,1个特殊字符占1个;2)QByteArray就是对char*的浅层次包装,QString是内部做了深层次包装,重新对其做了utf8编码。

20)QCoreApplication用于非GUI的应用程序(不需要依赖QtGui库),QApplication用于包含GUI的应用程序(需要用到QtGui库),QApplication继承了QGuiApplication类,而QGuiApplication继承了QCoreApplication类,而QCoreApplication又继承QObject的,而QObject就是QT中最基本的基类,也就是QT的根基。

21)内存地址从左往右(低地址——>高地址) 字节从左往右(最高有效位——>最低有效位)

22)富文本:又称呼为格式化文本,具有风格、排版等信息,如颜色、式样(黑体、斜体等)、字体尺寸、特性(如超链接)等。

23)QBrush类是 Qt 框架中用于绘制图形对象的画刷类。它用于确定图形对象(如矩形或椭圆)的填充样式和颜色。

24)QSS设置常用:border: width style color;font: style weight size family。

25)QTableView和QTableWidget主要的区别:

  • 数据模型:QTableView使用QAbstractItemModel作为数据模型,而QTableWidget使用QTableWidgetItem列表来管理数据。
  • 灵活性:由于使用了自定义的数据模型,QTableView更加灵活。你可以根据需要实现自己的数据模型,并将其与QTableView关联,以便处理更复杂的数据结构和操作。而对于简单的表格显示,QTableWidget提供了一个简单的接口。
  • 单元格编辑:在QTableWidget中,可以直接在单元格内编辑内容。而在QTableView中,默认情况下不能直接编辑单元格内容,需要通过委托(Delegate)来实现编辑功能。
  • 布局管理:对于布局管理方面,QTableWidget具有内置的行列布局管理器,并且可以很容易地添加、删除和调整大小。而在QTableView中,你需要手动设置布局管理器,并进行更多的自定义布局操作。
  • 总体而言,如果你需要更高度定制化、灵活性较强以及处理大量数据时,请选择使用 QTableView。如果你只是需要简单地展示和编辑少量数据,并且不需要太多定制化操作,则可以选择 QTableWidget。

26)QStringLiteral是Qt框架提供的一个宏,用于创建静态的QString对象。它在编译时对字符串进行优化,避免了运行时的字符串拷贝操作,提高了性能。

27)QFile用于读取和写入文件的操作,QFileInfo用于获取文件和目录的信息,而QDir用于管理目录的操作。

28)Qt灰度图像的format格式:QImage::Format_Indexed8

29)".“表示当前目录,而”"表示父级目录或者说是上级目录。这两个目录是在每个目录中都存在的默认目录。当我们想要获取目录中的实际子目录和文件列表时,通常希望忽略这两个特殊目录。QDir类使用QDir类来遍历某个目录中所有目录和文件时,会调用枚举类型QDir::NoDotAndDotDot来过滤这两个目录。

30)QDir::entryInfoList函数且过滤器是QDir::Dirs返回的QFileInfoList(说明都是当前目录下的子目录),每一个FileInfo调用absoluteFilePath函数,返回的是当前目录下的一个子目录路径(此时子目录可以看成是一个文件),调用absolutePath函数返回的是当前目录路径,调用fileName函数是当前目录下的一个子目录名称。

31)$$PWD是一种特殊的变量,用来表示当前工作目录的路径。它是Qt预定义的一种变量,在.pro文件或.qmake文件中使用。

32)跨线程通过信号槽机制传输QImage图像时,信号函数的参数必须是QImage图像的深拷贝

33)在Qt的UI界面设计中,当你在设计界面中拖动一个QHBoxLayout(例如使用Qt Designer)时,它会自动生成一个QHBoxLayoutWidget对象。QHBoxLayoutWidget是一个特殊的QWidget子类,用于容纳QHBoxLayout布局。它提供了一个可视化的容器,使得在设计时可以直观地看到布局的效果。

34)在Qt中的MainWindow类的构造函数里调用mapToGlobal函数返回的坐标不是全局(屏幕)坐标的原因:窗口可能还没有完全创建和显示,因此得到的结果可能不准确。

何时使用值传递、引用传递、指针传递作为函数参数的总结

使用引用参数的两个原因:
1)程序员能够修改调用函数中的数据对象;
2)通过传递引用而不是整个数据对象,可以提高程序的运行效率。(当数据对象比较大时——结构或者类对象)

使用值传递、引用传递、指针传递原则:
原则选择:
1)数据对象很小,eg:内置数据类型、小型结构;使用按值传递;
2)数据对象是数组,则使用指针,这是唯一选择,并将指针声明指向const的指针;
3)数据对象是较大的结构,则使用const指针或者const引用,优点是提高程序的效率,节省复制结构所需的时间和空间;
4)数据对象是类对象,则使用const引用。传递类对象参数的标准方式是按引用传递。

对于修改调用函数中数据的函数:
1)数据对象是内置数据类型,则使用指针;
2)数据对象是数组,则只能使用指针;
3)数据对象是结构,则使用引用或指针;
4)数据对象是类对象,则使用引用。

个人经验总结三条方法使用(一看就会,一用就“废”,总之好用):
1)数组用指针,类用引用,结构体用指针或引用。
2)不想修改原始数据,用按值传递。
3)传递数据基本类型,又想修改原始数据,用指针。

信号和槽对值传递参数和引用传递参数:
在同一个线程,当信号和槽都在同一个线程中时,值传递参数和引用传递参数有区别:
1)值传递会复制对象; ( 测试时,打印传递前后的地址不同);
2)引用传递不会复制对象; ( 测试时,打印传递前后的地址相同);

不在同一个线程:当信号和槽不在同一个线程中时,分两种情况:
1)connect时使用AutoConnection (跨线程默认是QueuedConnection) :值传递参数和引用传递参数没有区别,都会复制对象; (测试时,打印传递前后的地址不同);
2)connect时使用DirectConnection ,测试结果和在同一线程中的结果相同。

各种编码UNICODE、UTF-8、ANSI、ASCII、GB2312、GBK、URL详解

ASCII:全称American Standard Code for Information Interchange,美国信息互换标准代码。主要用来保存英文字符。ASCII码一共规定了128个字符的编码,比如空格“SPACE”是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0。

GB2312:是对 ASCII 的中文扩展方案。GB2312规定:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(他称之为高字节)从0xA1用到0xF7,后面一个字节(低字节)从0xA1到0xFE,这样我们就可以组合出大约7000多个简体汉字了。在这些编码里,我们还把数学符号、罗马希腊的字母、日文的假名们都编进去了,连在 ASCII 里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的"全角"字符,而原来在127号以下的那些就叫"半角"字符了。这种汉字方案叫做 “GB2312”。

GBK:是对GB2312的再一次扩展。GBK 包括了 GB2312 的所有内容,同时又增加了近20000个新的汉字(包括繁体字)和符号。

UNICODE:全称Universal Multiple-Octet Coded Character Set。包括了地球上所有文化、所有字母和符号的编码。规定必须用两个字节,也就是16位来统一表示所有的字符,对于ascii里的那些“半角”字符,UNICODE 包持其原编码不变,只是将其长度由原来的8位扩展为16位,而其他文化和语言的字符则全部重新统一编码。由于"半角"英文符号只需要用到低8位,所以其高8位永远是0,因此这种大气的方案在保存英文文本时会多浪费一倍的空间。Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。

UTF-8:UTF-8是Unicode的实现方式之一。UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
UTF-8的编码规则很简单,只有二条:
1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的
2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

ANSI:通常指的是平台的默认编码,例如英文操作系统中是 ISO-8859-1,中文系统是 GBK。(只针对Windows简体中文版,如果是繁体中文版会采用Big5码)。

URL:是全球资源定位符的英文(Uniform Resource Locator)所写,它是用于标识和定位互联网上资源(例如网页、文件、图像等)的地址。您平时上网时在IE浏览器中输入的那个地址就是URL。比如:网易 http://www.163.com就是一个URL。URL本质上就是网址,是一个链接地址
URL的格式由下列三部分组成:
第一部分是协议(或称为服务方式),例如http://或https://;
第二部分是存有该资源的主机IP地址(有时也包括端口号),例如www.example.com;
第三部分是主机资源的具体地址(如/directory/file.html)和可选的查询参数。

QLabel实现外部网页和本地路径超链接

1)外部网页超链接

Linklabel = new  QLabel(this);
Linklabel->setOpenExternalLinks(true);
Linklabel->setText("<a style ='color:green;text-decoration:none' href = https://blog.csdn.net/weixin_45832156/article/details/132162452> " + "网站");
//网站是显示文本,<>里是外部链接,此时点击显示文本—网站就可链接到对应的网站

2)本地路径超链接
在链接前面加上file:///协议,这样就能解决本地路径中含有中文而访问失败的问题。

Linklabel = new  QLabel(this);
Linklabel->setOpenExternalLinks(true);
Linklabel->setText("<a href=\"file:///" +picStr + "\">" + timeStr);
//  picStr是本地图片路径,timeStr是label标签文本要显示的字符串

在Qt中C++动态库lib和dll的生成与在项目中的配置及调用

1.C++外部库创建与生成
举例:创建untiled类,并生成动态库,步骤如下:

左上角:文件 —> 新建文件或项目 —>项目(选择Library)—> C++ Library —>choose —> 命名名称和创建路径 —> Type(选择Shared Library)—> 下一步。。。(最终创建动态库文件)

创建成功后,编写要链接的头文件和源文件,生成动态库即可。与VS一样。

2.C++外部库在Qt中的调用

在pro文件中包含外部库头文件和库文件即可,格式如下:

INCLUDEPATH += ./include
Debug:LIBS += ./bin/debug/untitled.lib
Release:LIBS += ./bin/release/untitled.lib

备注:
1)动态库的dll必须要与可执行文件exe在一起
2)在pro文件中包含外部库头文件和库文件后,需要qmake将修改后的pro文件生成新的Makefile文件,不然有可能会报错

Qt的pro文件变量配置

1)CONFIG—指定编译器选项和项目配置,值由qmake内部识别并具有特殊意义
常用如下:

CONFIG +=build_all //如果指定了debug_and_release,默认情况下,该项目会构建为debug和release模式

2)DESTDIR—指定在何处放置目标文件
列如:

Debug:DESTDIR = ../../../bin/debug
Release:DESTDIR = ../../../bin/release

3)MOC—指定来自moc的所有中间文件放置的目录(含Q_OBJECT宏的头文件转换成标准.h文件的存放目录)

Debug:MOC_DIR = $$PWD/../../../temp/debug/commom
Release:MOC_DIR = $$PWD/../../../temp/release/commom

4)RCC_DIR—指定Qt资源编译器输出文件的目录(.qrc文件转换成qrc_*.h文件的存放目录)
列如:

Debug:RCC_DIR = $$PWD/../../../temp/debug/commom
Release:RCC_DIR = $$PWD/../../../temp/release/commom

5)UI_DIR—指定来自uic的所有中间文件放置的目录(.ui文件转化成ui_*.h文件的存放目录)

Debug:UI_DIR = $$PWD/../../../temp/debug/commom
Release:UI_DIR = $$PWD/../../../temp/release/commom

6)OBJECTS_DIR—指定所有中间文件.o(.obj)放置的目录。

Debug:OBJECTS_DIR = $$PWD/../../../temp/debug/commom
Release:OBJECTS_DIR = $$PWD/../../../temp/release/commom

7)LIBS—指定链接到项目中的库列表

Debug:LIBS += ../../../bin/debug/XVLog.lib
Release:LIBS += ../../../bin/release/XVLog.lib

8)INCLUDEPATH—指定编译项目时应该被搜索的#include目录

INCLUDEPATH += ../../include

9)RC_ICONS—仅适用于Windows,指定的图标应该包含在一个生成的.rc文件里。如果RC_FILE 和RES_FILE变量都没有设置这才可利用。

RC_ICONS = ivision.ico

10)TARGET—指定目标文件的名称

TARGET = warper

11)TEMPLATE—模板变量告诉qmake为这个应用程序生成哪种makefile
app—创建一个用于构建应用程序的Makefile(默认)
lib—创建一个用于构建库的Makefile

Qt Creator(集成开发环境IDE) + MSVC(编译器)软件版本发布流程

1)生成release或者debug版本的exe可执行文件(x64或x86);

2)在左下角开始菜单栏找到QT的命令交互对话框,如Qt 5.8 32-bit for Desktop (MSVC 2013),双击打开,进入命令对话框;

3)加入指令windeployqt XXX.exe即可,后面的XXX.exe可以是将生成的可执行文件直接拖入即可,会包含exe的文件路径,生成的Qt的dll也会在可执行文件目录里。

Qt编译项目时的指令总结(qmake、构建、重新构建等)

qmake根据pro文件生成MakeFile文件,但此时还未生成.exe。什么情况下需要执行qmake呢,项目创建时,引入外部库及项目文件结构发生变化,也就是增删文件时。

构建:构建是增量编译,只编译有变化的部分,同时生成.exe,还有许多.o目标文件。

重新构建:是把所有部分都重新编译

运行: 如果有改动则根据已有的MakeFile进行重新编译、执行,否则就直接运行已有的.exe文件

清理:只留下.exe文件,构建时生成的文件被删除掉

注意:构建和重新构建时,如果没有MakeFile文件,会根据pro文件等生成MakeFile后,再进行编译。

有时会出现,明明自己代码里修改了某个地方,但是生成的版本未发生改变这样让人郁闷的问题,还有一个项目拷贝到另一台设备时,需要重新qmake,重新构建,运行,否则也有可能会报错

所以项目编译顺序应该是:qmake-构建-运行

MakeFile文件作用总结:

  • 构建QT项目:QT应用程序通常由多个源文件组成,包括源代码文件、头文件、以及QT资源文件等。MakeFile定义了如何编译、链接和构建这些文件,以生成最终的可执行文件或库文件
  • 编译源代码:MakeFile文件用来描述源代码的编译规则,包括指定编译器、编译选项和相关的依赖文件等。通过MakeFile,可以确保只有修改的文件被重新编译,提高编译效率。
  • 链接可执行文件或库文件:MakeFile还定义了如何将编译后的目标文件链接成可执行文件或库文件。它指定了链接器、库文件的位置和选项,确保正确地将各个目标文件组合在一起,生成可执行文件或库文件。
  • 管理依赖关系:在QT项目中,源代码之间存在着依赖关系。MakeFile可以检测这些依赖关系,并自动决定需要重新编译的文件。这样,只有收到影响的文件被重新编译,避免了不必要的编译过程。
  • 跨平台构建:MakeFile是一种通用的构建工具,能够在不同的操作系统和平台上使用。QT项目可以通过MakeFile实现跨平台构建,方便在不同的开发环境中进行开发和部署。

Qt枚举常用宏

1)Q_FLAG宏
宏Q_FLAG会向元对象系统注册一个单一的标志类型。

使用宏Q_FLAG声明的枚举,其枚举值可以作为标志,并使用位或操作符(|)进行组合。

2)Q_DECLARE_FLAGS()宏
Q_DECLARE_FLAGS(Flags, Enum)宏展开为:typedef QFlags Flags。QFlags是一个模板类,其中Enum是枚举类型,QFlags用于存储枚举值的组合。

传统的 C++ 编程中,通常使用整数来保存 enum 的逻辑运算结果 (与、或、非、异或等),在进行逻辑运算的时候没有进行类型检查,一个枚举类型可以和其他的枚举类型进行逻辑运算,运算的结果可以直接传递给接收参数为整数的函数。在Qt 中,模板类 QFlags 提供了类型安全的方式保存 enum 的逻辑运算结果,来解决上面的问题,即进行了安全检查。

总之,Q_DECLARE_FLAGS(Flags, Enum)宏将普通结构体Enum重新定义成了一个可以自由进行位或操作的安全的结构体Flags

3)Q_DECLARE_OPERATORS_FOR_FLAGS()宏
Q_DECLARE_OPERATORS_FOR_FLAGS(Flags)赋予了Flags一个全局操作符“|”,没有这个宏语句,Flags量之间进行与操作后的结果将是一个int值,而不是Flags值。这点特别重要。

Q_DECLARE_OPERATORS_FOR_FLAGS必须定义在类外。

Q_DECLARE_OPERATORS_FOR_FLAGS只提供了“或”操作,没有提供“与”“非”操作。

**Q_DECLARE_FLAGS和Q_DECLARE_OPERATORS_FOR_FLAGS都是和元对象系统无关的,可以脱离Q_FLAG单独使用,事实上这两个宏在Qt4就已经存在(不确定更早是否存在),而Q_FLAG是在Qt5.5版本才加入的。**下面是Q_DECLARE_FLAGS和Q_DECLARE_OPERATORS_FOR_FLAGS的搭配举例:

#include <QFLags>
class LogOutput : public QObject
{
   
	Q_OBJECT
public:
	enum MyMsgType
	{
   
		DebugMsg = 1,//备注:要想使用组合枚举值,枚举值的赋值最好使用2的幂次方
		WarningMsg = 2,
		CriticalMsg = 4,
		FatalMsg = 8,
		InfoMsg = 16
	};	
	Q_DECLARE_FLAGS(MyMsgTypes,MyMsgType)
}
Q_DECLARE_OPERATORS_FOR_FLAGS(LogOutput::MyMsgTypes)

备注:若想知道组合的枚举值有没有包含所需要的枚举值,需调用testFlag函数,举例(测试上面的MyMsgTypes是否包含DebugMsg 枚举值)如下:

LogOutput::MyMsgTypes filter = LogOutput::DebugMsg | LogOutput::WarningMsg | LogOutput::CriticalMsg ;
bool bRes = filter.testFlag(LogOutput::DebugMsg);//看filter变量中包不包含LogOutput::DebugMsg枚举值,如果包含返回true

Qt中Debug和Release条件下同一个函数分别执行不同的代码

使用QT_DEBUG宏,可以使同一个函数在Debug和Release条件下分别执行不同的代码。

QT_DEBUG宏:当你使用Qt的Debug构建时,QT_DEBUG宏会被定义,可以用于在代码中执行特定的调试操作。

举例函数如下(debug下是加法运算,release情况下是乘法运算):


                
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值