Linux环境下QT开发(三)——QT编程基础

2023-05-16

Linux环境下QT开发(三)——QT编程基础

在上一篇文章中,我们完成了第一个程序——HelloWorld。在这篇文章中,我将介绍一些QT编程基础知识,让我们由此进入QT的世界!
本系列文章主要参考自《Qt 5.9 C++开发指南》,一本很适合初学者的书,此外,该文章还需要你有一定的C++基础哟
Qt5.9C++开发指南
本篇文章对应为该书中的第三章,但只介绍最基础部分,目前掌握这些就可以了

一、QT中的数据类型

QT为了统一不同平台上变量占用内存的大小,对一些常用变量进行了封装,在<QtGloabl>中都有定义,具体可参照下表

QT数据类型等效定义字节数
qint8signed char1
qint16signed short2
qint32signed int4
qint64long long int8
qlonglonglong long int8
quint8unsigned char1
quint16unsigned short2
quint32unsigned int4
quint64unsigned long long8
qulonglongunsigned long long int8
ucharunsigned char1
ushortunsigned short2
uintunsigned int4
ulongunsigned long8
qrealdouble8
qfloat2

另外,QT还对string类进行了封装,可以使用QString类。
当然,在QT中也可以使用C++本身的int之类的数据类型,但使用这些数据不但符合QT的代码风格,而且更可以保证跨平台通用性,那为什么不入乡随俗呢?

二、函数

<QtGlobal>中定义了一些常用函数,这些函数多以模板作为传入参数,也返回对应的模板类型

函数功能
T qAbs(const T &value)返回变量value的绝对值
const T &qBound(const T &min,const T &value,const T &max)返回value限定在min至max范围之内的值
bool qFuzzyCompare(double p1,double p2)若p1和p2近似相等,返回true
bool qFuzzyIsNull(double d)如果参数d约等于0,返回true
double qInf()返回无穷大的数
bool qIsFinite(double d)若d是一个有限的数,返回true
bool qIsInf(double d)若d是一个无限大的数,返回true
bool qIsNaN(double d)若d不是一个数,返回true
const T &qMax(const T &value1,const T &value2)返回value1和value2中较大的值
const T &qMin(const T &value1,const T &value2)返回value1和value2中较小的值
qint64 qRound64(double value)将value近似为最接近qint64整数
int qRound(double value)将value近似为最接近的int整数
int qrand()标准C++中rand()函数的线程安全型版本,返回0至RAND_MAX之间的伪随机数
void qrand(uint seed)标准C++中srand()函数的线程安全型版本,使用种子seed对伪随机数序列初始化

三、容器类

QT的容器类比标准模板库(STL)中的容器类更轻巧、安全和易于使用。
此外,它们还是线程安全的,也就是说它们作为只读容器时可以被多个线程访问。

容器类是基于模板的类,如常用的QList<T>,T是一个具体类型,可以使int、float等简单类型,也可以是QString、QDate等类,但不能是QObject或任何其子类。T必须是一个可赋值的类型,即T必须提供一个缺省的构造函数,一个可复制的构造函数和一个赋值运算符。

总的来说就是普通数据类型都可以作为模板的具体类型来构建容器,具体QObject类是什么,哪些是它的子类,我们后面再说。
QT的容器类分为顺序容器和关联容器。

(一)顺序容器类

顺序容器类包括QList、QLinkedList、QVector、QStack和QQueue。

  1. QList
    常用函数
函数功能
insert()插入
replace()替换
removeAt()删除
move()移动
swap()交换
append()添加
prepend()添加
removeFirst()移除
removeLast()移除
isEmpty()判断是否为空
size()返回元素个数

QList还提供像数组一样的下标访问方式
例如:

QList<QString> list;
list<<"one"<<"two"<<"three";
QString str1=list[1];
QString str0=list.at(0);
  1. QLinkedList
    QLinkedList<T>除了不提供基于下标索引的数据项访问外,其他接口函数与QList基本相同
  2. QVector
    QVector支持下标访问,性能比QList更高
  3. QStack
    QStack<T>是提供类似于队列先入先出(FIFO)操作的容器类。enqueue()dequeue()是主要的操作函数。
    例如:
QQueue<int> queue;
queue.enqueue(10);
queue.enqueue(20);
while(!queue.isEmpty())
	cout<<queue.dequeue()<<endl;
结果:1020

(二)关联容器类

关联容器类包括QMap、QMultiMap、QHash、QMultiHash、QSet。

  1. QSet
    例如:
QSet<QString> set;
set<<"dog"<<"cat";
if(!set.contains("mouse")
	set<<"mouse";
  1. QMap
    QMap<Key,T>提供一个字典(关联数组),一个键映射到一个值。
    例如:
QMap<QString,int> map;
map["one"]=1;
map["two"]=2;
map.insert("three",3);
map.remove("two");
int num1 =map["one"];
int num2 =map.value("two");

如果在映射表中没有找到指定的键,会返回一个缺省的构造值。使用value()函数查找时,还可以指定一个缺省值

int num = map.value("my_num",10);
  1. QMultiMap
    QMultiMap是QMap的子类,是用于处理多值映射的便利类。QMap正常情况下不允许多值映射,除非使用QMap::insertMulti()添加键值对。
    QMultiMap::insert()等效于QMap::insertMulti(),QMultiMap::replace()等效于QMap::insert()
    例如:
QMultiMap<QString,int> map1,map2,map3;
map1.insert("num",100);
map1.insert("num",200);
map2.insert("num",300);
map3=map1+map2; //map3.size()==3

QMultiMap不提供"[ ]"操作符,使用value()函数访问最新插入的键的单个值。如果要获取一个键对应的所有值,使用values()函数,返回值是QList<T>类型。
例如:

QList<int> values =map.values("num");
for(int i=0;i<values.size();i++)
	cout<<values.at(i)<<endl;
  1. QHash
    QHash<Key,T>和QMap功能和用法相似,但QMap的键必须提供<运算符,QHash的键必须提供==运算符和一个名称为qHash()的全局散列函数。
  2. QMultiHash
    与QMultiMap相似

四、容器类的迭代

QT有两种迭代器类:Java类型的迭代器和STL类型的迭代器。
Java类型的迭代器更易于使用,且提供一些高级功能,而STL类型的迭代器效率更高。

(一)Java类型的迭代器

容器类只读迭代器读写迭代器
QList<T>,QQueue<T>QListIterator<T>QMutableListIterator<T>
QLinkedList<T>QLinkedListIterator<T>QMutableLinkedListeIterator<T>
QVevtor<T>,QStack<T>QVectorIterator<T>QMutableVectorIterator<T>
QSet<T>QSetIterator<T>QSetIterator<T>
QMap<Key,T>,QMultiMap<Key,T>QMapIterator<Key,T>QMutableMapIterator<Key,T>
QHash<Key,T>,QMultiHash<Key,T>QHashIterator<Key,T>QMutableHashIterator<Key,T>
  1. 顺序容器类的迭代器使用
    Java类型迭代器的指针不是指向一个数据项,而是在数据项之间。
    QListIterator<T>为例说明顺序容器类的迭代器常用方法
函数名功能
void toFront()迭代器移动到列表的最前面(第一个数据项之前)
void toBack()迭代器移动到列表的最后面(最后一个数据项之后)
bool hasNext()如果迭代器不是位于列表最后位置,返回true
const T &next()返回下一个数据项,并且迭代器后移一个位置
const T &peekNext()返回下一个数据项,但是不移动迭代器位置
bool hasPrevious()如果迭代器不是位于列表的最前面,返回true
const T &previous()返回前一个数据项,并且迭代器前移一个位置
const T &peekPrevious()返回前一个数据项,但是不已的迭代器指针

例如:

QList<int> list;
list<<1<<2<<3<<4<<5;
QMutableListIterator<int> i(list);
while(i.hasNext()){
	if(i.next()%2!=0)
		i.remove();
}

remove()函数移除next()函数刚刚跳过的一个数据项,不会使迭代器失效。
setValue()函数可以改变数据项的值。
2. 关联容器类的迭代器使用
关联容器类迭代器具有和上表一样的函数,主要是增加了key()和value()函数用于获取刚刚跳过的数据项的键和值。
在多值容器类里遍历,可以使用findNext()或findPrevious()查找下一个或上一个值,例如:

while(i.findNext("USA"))
	i.remove();

(二)STL类型迭代器

与Java类型迭代器不同,STL类型迭代器直接指向数据项。

  1. 顺序容器类的迭代器
容器类只读迭代器读写迭代器
QList<T>,QQueue<T>QList<T>::const_iteratorQList<T>::iterator
QLinkedList<T>QLinkedList<T>::const_iteratorQLinkedList<T>::iterator
QVevtor<T>,QStack<T>QVector<T>::const_iteratorQVector<T>::iterator
QSet<T>QSet<T>::const_iteratorQSet<T>::iterator
QMap<Key,T>,QMultiMap<Key,T>QMap<Key,T>::const_iteratorQMap<Key,T>::iterator
QHash<Key,T>,QMultiHash<Key,T>QHash<Key,T>::const_iteratorQHash<Key,T>::iterator

例如:

QList<QString> list;
list <<"A"<<"B"<<"C"<<"D";
QList<QString>::const_iterator i;
for(i=list.constBegin();i!=list.constEnd();i++)
	qDebug()<<*i;

constBegin()和constEnd()用于只读迭代器,表示其实和结束位置。

  1. 关联容器类的迭代器
    如果想返回键,使用key()函数,对应的,用value()函数返回一个项的值。
  2. QT很多函数返回值为QList或QStringList,但因为QT使用了隐式共享,所以并不费事。隐式共享简单的就是只读的时候共享内存,修改的时候再拷贝一份新的。
    因为有隐式共享,所以当有一个迭代器在操作容器变量时,不要复制这个容器变量。

五、QT宏定义之foreach

QT有很多宏定义,但这里只介绍这个foreach。
foreach(变量,容器)
例如:

QLinkedList<QString> list;
...
QString str;
foreach(str,list)
	qDebug()<<str;

foreach也可以使用大括号,使语句更复杂
对于QMap和QHash,foreach会自动访问键值对里得值,例如:

foreach(str,map.keys())
	qDebug()<<str<<":"<<map.value(str);

对于多值映射,可以使用双重foreach
请注意:foreach不能修改原来容器中的数据项

六、总结

好啦,看到这里希望你能学会这些基础知识,这些基础知识就能满足很多开发需求了,你已经不再是一个QT小白了。
我辛苦的搬运了一天书上的内容,才有了这篇文章,哈哈!当初学QT的时候我都没那么认真,不过这样做还是很值得的,现在为了写博客也为了兴趣想好好学一学,很有收获了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux环境下QT开发(三)——QT编程基础 的相关文章

  • kaili下载教程

    kaili下载 不经意在社区看了一下好像没有最新的kaili下载教程 xff0c 所以就想着做一个 kaili下载 xff1a https docs kali org 1 进入官网首页 xff0c 最下面的两个箭头可以直接跳过第2步 xff
  • 2018.9.14-Asp.net实现动态主题(皮肤)更改

    Asp net实现动态主题 xff08 皮肤 xff09 更改 使用 xff1a Microsoft Visual Studio 2010 系统 xff1a win10 项目结构图 xff1a 第三个按钮 xff1a 更改项目目录显示方式
  • LVM——linux缩小逻辑卷(xfs)

    在这里 xff0c 我们将向您展示如何在Linux中收缩LVM卷或分区 xff0c 方法是首先调整文件系统的大小 xff0c 然后调整逻辑卷的大小 如果您尝试执行相反操作请看 xff1a LVM linux增加LVM分区 注意 xff1a
  • Linux——重启服务器后磁盘名称错乱

    背景 某台服务器有如下文件系统 xff0c fwork1 挂载在 dev sda1 xff0c fwork2挂载在 dev sdb1 某次添加新硬盘重启后 xff0c 变成了fowrk1挂载在 dev sdb1 xff0c fwork2挂载
  • linux卡住freeze解决办法

    状况 踢出用户后启动服务器 xff0c 在机房点击键盘没有反应 xff0c 等待一个小时服务器一直卡在下面界面 一些底层软件的 bug 也可能导致一些奇怪的死机问题 Linux 运行过程中 xff08 为了提高性能 xff09 会把大量的数
  • 鸟哥私房菜-Linux文件格式化处理 grep|egrep|awk|sed|diff|cut|sort|uniq|wc|xargs

    grep grep基础用法 文件中搜索特定字符串 grep 39 query 39 file 或者 cat file grep 39 query 39 查询包含特定字符串的文件 sudo grep r 字符串 目录 同时 xff0c fin
  • Linux——磁盘分区与挂载

    Step 1查看当前磁盘的分割表类型 sudo parted dev sda print Error dev sda unrecognised disk label Model LENOVO ST2400MM0129 scsi nbsp n
  • 鸟哥私房菜—Vim编辑器的常用快捷键

    一 移动游标的方法 页面级别 Ctrl 43 b Ctrl 43 PgUp 向上移动一页 Ctrl 43 f Ctrl 43 PgDn 向下移动一页 Ctrl 43 u 向上移动半页 Ctrl 43 d 向下移动半页 行级别 G 移动到这个
  • Linux—yum/apt-get软件安装

    yum用法 yum的查询 yum option 查询工作目录 相关参数 option xff1a y 当yum要等待使用者输入时 xff0c y自动提供yes的回应 installroot 61 some path 将该软件安装在指定目录
  • SCM和NVM是什么鬼,与NVMe是什么关系?

    SSD存储介质和接口技术一直处于不断向前发展和演进的过程 SSD分为几个阶段 xff0c 第一个阶段是SATA SSD或者SATA SAS SSD为主导 xff0c 这个阶段介质以SLC和eMLC为主 第二个阶段是PCIe SSD xff0
  • Java笔记之Maven,import找不到jar包(Cannot resolve symbol ‘fastjson‘)

    Spring Boot默认是没有阿里巴巴的jar包的 xff08 如果这里有fastjsonjar包 xff0c 应该多一行Maven com alibaba fastjsonjar 1 2 38 xff09 此时在类文件中使用下面的语句该
  • 快速掌握一个语言最常用的50%

    现在的开发工作要求我们能够快速掌握一门语言 一般来说应对这种挑战有两种态度 xff1a 其一 xff0c 粗粗看看语法 xff0c 就撸起袖子开干 xff0c 边查Google边学习 xff1b 其二是花很多时间完整地把整个语言学习一遍 x
  • Linux卡死的解决方法 solution of server stuck or freezes

    如果整个系统都死机了 xff0c 可以尝试使用SysReq 解决 检查Sysrq是否开启 在大多数发行版中 xff0c 默认情况下已编译并启用 xff0c 要确认该选项是否开启 xff0c 请使用 sysctl kernel sysrq 如
  • Error while extracting response for type [class cn.hutool.json.JSONArray] and content type [applicat

    在使用restTemplate调用get方法时 xff0c 报错 xff1a Error while extracting response for type class cn hutool json JSONArray and conte
  • Linux如何设置SUDO_ASKPASS

    什么是SUDO ASKPASS 你是否遇到过这种场景 xff0c 需要通过某个程序调用linux命令 xff0c 如果命令中存在sudo xff0c 那么程序将无法执行 xff0c 因为sudo命令需要等待输入密码才能继续执行 SUDO A
  • linux权限管理之SetUID&SetGID

    关于facl权限 xff0c 请看 xff1a linux权限管理之ACL权限管理 Rocket MAN的博客 CSDN博客 SetUID SUID 特殊权限仅适用于可执行文件 xff0c 所具有的功能是 xff0c 只要用户对设有 SUI
  • Linux mv被ctrl+c中断的解决方法

    我需要从 fwork6 jenkins迁移到 fwork5 jenkins xff0c 中间手滑ctrl 43 c取消了 由于新目录中资料较少 xff0c 我采用了将新目录的内容迁移到原目录中还原原来老目录中的内容 如果已经迁移了大部分内容
  • 如何使用ssh连接windows?

    windows安装并openssh server A 对于新版的Windows10 或 Windows 2019 xff0c 自带SSH Server 可以开启它即可 开启方法 xff1a 安装openssh 设置 应用 应用和功能 可选功
  • 查询mysql数据库里的某字段值所对应的表名与字段名

    应用场景 xff1a 比如在系统的web页面上输入某些值 xff0c 然后想知道是否正确保存了 xff0c 但不知道数据是存到哪个表里 xff0c 除了直接问相关开发人员外 xff0c 还可以通过运行该查询 xff0c 来找到数据对应的表以
  • Linux设置时间格式为yyyy-MM-dd HH:mm:ss

    临时更改显示样式 export TIME STYLE 61 39 43 Y m d H M S 39 永久改变显示样式 vim etc profile export TIME STYLE 61 39 43 Y m d H M S 39 so

随机推荐

  • 树莓派(ubuntu系统)连接后使用HDMI-VGA,VGA无信号

    与系统无关 xff0c 主要修改config txt文件 详细配置参数见 xff1a http blog lxx1 com 1706
  • Ubuntu 20 按ESC进入单用户模式 single user mode

    步骤 xff1a 1 开机重启 2 常按ESC xff0c 此时会进入BIOS选项 xff0c 直接回车就行 3 回车后按一下ESC即可进入Grub启动菜单 xff0c 如果按多了进入Grub命令行 xff0c 那么重新来一遍 4 选择Ub
  • ubuntu设置swap step by step

    在服务器中通过free h可以看到有一个叫做swap的东西 xff0c 这是服务器用硬盘制作的交换空间 在服务器内存不够时 xff0c 将会使用这部分空间 xff0c 但是如果swap空间不足很容易导致被使用的swap占swap总量变大 x
  • python便携包安装pip,pip --version报错“ModuleNotFoundError: No module named ‘pip‘“

    安装python安装包 windows python便携包 python版本界面 xff1a Python Release Python 3 11 3 Python org 下载嵌入式版本 xff1a https www python or
  • Spark-MLlib之分类和回归算法

    分类 逻辑回归 逻辑回归是预测分类响应的常用方法 广义线性模型的一个特例是预测结果的概率 在spark ml逻辑回归中 xff0c 可以使用二项Logistic回归来预测二元结果 xff0c 或者可以使用多项Logistic回归来预测多类结
  • Java中的Collections类

    Java中的Collections类 Collections概述Collections类的常用方法1 将指定列表按升序排列2 反转指定列表中元素的顺序3 使用默认的随机源随机排列指定的列表常用方法的具体使用 xff1a 案例 xff1a A
  • StartlsBack 导致屏幕闪烁的解决方法

    情况 xff1a 两个显示器中的旧显示器出现闪烁情况 xff0c 即重新加载桌面 刷新桌面图标 加载任务栏 xff0c 且每隔几秒就会刷新 xff0c 多次重启无果 如果单连新显示器不会有问题 xff0c 单连旧显示器或者两个同时使用都会出
  • Zabbix-----(六)proxy的搭建

    这里写目录标题 1 Zabbix proxy概述1 1 Zabbix proxy的作用1 2 Zabbix proxy工作过程 3 zabbix proxy的部署3 1 实验环境3 2 zabbix server端 server1 3 3
  • ubuntu查看当前目录大小

    du sh查看当前所在目录的内存大小 du sh 查看当前所在目录中各个文件的大小
  • 达梦数据库字符集

    初次接触达梦 xff0c 记录一些小知识 达梦数据库采用的字符集是在初始化数据库时指定的 xff0c 属于全局性的参数 xff0c 后续不能更改 其支持的字符集选项有 0表示GB18030 xff0c 1表示UTF 8 xff0c 2代表韩
  • efi variables are not supported on this system-(已解决)

    1 如果用的是VMware 则在虚拟机里设置这个选项 2 如果是实体机执行 ls sys firmware efi efivars 查看电脑是否支持efi 并看能不能在bios里修改一下
  • IDEA拉取远程分支(获取最新分支)

    第一步 xff1a 第二步 xff1a
  • 【ChatGPT】帮你写周报,这是实在太干货了,老板都看不下去了

    说到写周报不少小伙伴会觉得是一件头疼的事情 xff0c 一周摸鱼了不到7天 xff0c 周报咋写 xff0c 掰指头都能数清的事在邮件中更是寥寥数字 xff0c 自己看着不舒服 xff0c 老板看着更是头大 xff0c 要不要搞掉他的想法油
  • Archlinux中普通用户无法使用root设置的zsh主题样式

    Archlinux中普通用户无法使用root设置的zsh主题样式 问题分析解决方法1 使用git到github上下载 注意要在普通用户下 2 查看当前主题3 查看可用主题 xff0c 选取下想用的主题4 编辑配置文件 xff0c 更换你想用
  • ArchLinux安装完成登陆时出现login incorrect错误

    汇总下来出现该错误有以下几种原因 1 输入密码时 xff0c 检查numlock是否开启 xff1b 使用字母上方的数字键进行输入 由于安装的linux键盘布局为us键盘布局 xff0c 小键盘在开机时 xff0c 默认为关闭状态 2 有人
  • VirtualBox中如何释放鼠标

    相信在使用VritualBox的小伙伴中 xff0c 有发现他释放鼠标的方式和VMware不一样 xff0c 其实也很简单 xff0c 并且VritualBox也有说明释放的方式 按键盘右边的Ctrl键就可以
  • c++中sizeof()的详细用法

    sizeof 定义 sizeof是一个操作符 xff08 operator xff09 其作用是返回一个对象或类型所占的内存字节数 sizeof 语法 sizeof有三种语法形式 xff1a 1 sizeof object sizeof 对
  • Linux下如何查找特定的文件

    使用 find命令 语法 xff1a find path options params 作用 xff1a 在指定目录下查找文件 常用用法示例 xff1a find name file java xff1a 精确查找文件 xff08 在根目录
  • Ubuntu16.04使用教程(一)——安装

    Ubuntu16 04使用教程 xff08 一 xff09 安装 前言 最近我同学需要用Ubuntu16 04做项目 xff0c 可是她之前从没用过 xff0c 于是我在这里写一些我常用的简单的操作吧 本节将教你如何在你的Windows电脑
  • Linux环境下QT开发(三)——QT编程基础

    Linux环境下QT开发 xff08 三 xff09 QT编程基础 在上一篇文章中 xff0c 我们完成了第一个程序 HelloWorld 在这篇文章中 xff0c 我将介绍一些QT编程基础知识 xff0c 让我们由此进入QT的世界 xff