QT基本数据类型

news/2024/4/29 9:41:52/文章来源:https://blog.csdn.net/yerennuo/article/details/136478576

第一章QT基本数据类型

文章目录

  • 第一章QT基本数据类型
  • 1.基础类型
  • 2. log输出
    • 基本分类
    • 格式化日志
    • 普通格式化
    • 条件格式化
    • 环境变量格式化
    • 禁用输出
  • 3.字符串类型


1.基础类型

Qt基本数据类型定义在#include <QtGlobal>中,Qt基本数据类型有:

类型名称注释备注
qint8signed char字符型
qint16signed short短整型
qint32signed int整型
qint64long long int长整型
qintptrqint32或qint64指针类型,32位系统是qint32~
qlonglonglong long int或(__int64)Windows中定义为__int64
qptrdiffqint32或qint64指针偏移,根据系统类型不同而不同~
qrealdouble或float实型,除非配置了-qreal float选项,否则默认double
quint8unsigned char无符号字符型
quint16unsigned short无符号短整型
quint32~~
quint64~~
quintptr~~
qulonglong~~
ucharunsigned char~
uintunsigned int~
ulongunsigned long~
ushortunsigned short~
qsizetypesize_t~

2. log输出

在Qt中进行log输出,Qt框架提供了专门用于日志输出的类,头文件名QDebug

基本分类

  • qDebug:调试信息提示
  • qInfo:输出信息
  • qWarning:一般的警告提示
  • qCritical:严重的错误提示
  • qFatal:致命错误提示,会直接中断程序
    qint8 v1='c';qint32 v2=100;quint8 v3='a';quint32 v4=100;qintptr *p=nullptr;qDebug("v1 = %" PRIdQSIZETYPE "",v1);qInfo("v2 = %d",v2);qWarning("v3=%c",v3);qCritical("v4=%d",v4);qFatal("致命错误");

格式化日志

默认情况下,日志格式是只输出对应的日志内容没有额外信息的。我们可以通过修改环境变量QT_MESSAGE_PATTERN或者调用方法qSetMessagePattern来修改日志的输出格式,日志格式中常用的占位符符号如下:

%{appname}		应用程序的名称(QCoreApplication::applicationName())
%{category}		日志所处的领域
%{file}			打印该日志的文件路径
%{fuction}		打印日志的函数
%{line}			打印日志在文件中的行数
%{message}		打印日志的内容
%{pid}			打印日志程序的PID
%{threadid}		打印日志的线程ID
%{qthreadptr}	打印日志的线程指针
%{type}			日志级别("debug","warning","critical" or "fatal")
%{time process}	日志发生时程序启动了多久
%{time boot}	日志发生时系统启动了多久
%{time [format]}以固定时间格式输出日志打印的时间,默认为QISODate格式

普通格式化

	qSetMessagePattern("%{time [yy-MM-dd hh:mm:ss]} %{file} %{function}(%{line}) %{message}");qInfo()<<"qInfo";qDebug()<<"qDebug";qWarning()<<"qWarning";qCritical()<<"qCritical";

注意:在Release模式下,文件名、函数名、行号获取不到,需要添加编译时宏QT_MESSAGELOGCONTEXT
添加方法如下:

在cmakeLists.txt文件中添加
add_definitions(-DQT_MESSAGELOGCONTEXT) # 全局范围可用
或者
target_compile_definitions(你的可执行程序名称 PRIVATE QT_MESSAGELOGCONTEXT) #目标范围可用

条件格式化

  QString s_debug="%{if-debug} [%{type}] line%{line} %{endif}";QString s_info = "%{if-info} [%{type}] %{file} %{endif}";qSetMessagePattern("%{time [yy-MM-dd hh:mm:ss]}"+s_debug+s_info+"%{message}");
  • 案例把日志写入文件
#include "MainWindow.h"
#include <QtGlobal>
#include <QApplication>
#include <QDebug>
#include <QFile>//日志消息处理函数
void logMessageHander(QtMsgType type,const QMessageLogContext &ctx,const QString &msg)
{//获取格式化日志信息QString typestr=qFormatLogMessage(type,ctx,msg);//可以根据日志级别进行过滤(比如不要debug,可以直接return)QString levelText;switch(type){case QtDebugMsg:levelText="debug";return;break;case QtWarningMsg:levelText ="warning";break;case QtCriticalMsg:levelText ="critical";break;case QtFatalMsg:levelText ="fatal";break;case QtInfoMsg:levelText ="info";break;}QFile file("mylog.txt");file.open(QIODeviceBase::WriteOnly|QIODeviceBase::Append);if(file.isOpen()){QTextStream tStream(&file);tStream<<typestr<<"\n";file.close();}
}
int main(int argc, char *argv[])
{QApplication a(argc, argv);QString s_debug="%{if-debug} [%{type}] line%{line} %{endif}";QString s_info = "%{if-info} [%{type}] %{file} %{endif}";qSetMessagePattern("%{time [yy-MM-dd hh:mm:ss]}"+s_debug+s_info+"%{message}");qInstallMessageHandler(logMessageHander);MainWindow w;qint8 v1='c';qint32 v2=100;quint8 v3='a';quint32 v4=100;qintptr *p=nullptr;QString say="你好,世界";qDebug("v1 = %" PRIdQSIZETYPE "",v1);qDebug()<<say;qInfo("v2 = %d",v2);qWarning("v3=%c",v3);qCritical("v4=%d",v4);//qFatal("致命错误");w.show();return a.exec();
}

环境变量格式化

    qputenv("QT_MESSAGE_PATTERN",QByteArray("%{time yyyyMMdd h:mm:ss.zzz t} %{if-debug}D %{endif}""%{file} %{function}(%{line}) %{message}"));

和上面的qSetMessagePattern()一起使用的话,qputenv()就无效了

禁用输出

在开发或者调试时,我们必须借助日志来进行判断,但是当程序需要发布时,调试的日志信息不再需要,此时如果把代码删除,又不太方便
Qt提供了禁用qInfo、qwarning、qdebug输出的宏,qcritical和qfatal不能屏蔽
在CMakeLists.txt文件中添加如下三行,即可禁用

add_compile_definitions(QT_NO_INFO_OUTPUT)
add_compile_definitions(QT_NO_WARNING_OUTPUT)
add_compile_definitions(QT_NO_DEBUG_OUTPUT)

3.字符串类型

  1. QByteArray
可以通过这个类的构造函数申请一个内存,用于存储我们需要处理的字符串数据
  • 构造函数
    QByteArray arr1("hello,world!");QByteArray arr2("你好世界");QByteArray arr3(10,'a');qDebug()<<arr1;qDebug()<<QString::fromUtf8(arr2);//输出中文要通过qstring转qDebug()<<arr3;
  • 数据操作
    arr2.append("我好帅");//尾插qDebug()<<QString::fromUtf8(arr2);  //"你好世界我好帅"arr1.insert(3,"abc");qDebug()<<arr1; //"helabclo,world!"arr1.insert(10,"@@&^",1);qDebug()<<arr1; //"helabclo,w@orld!"arr3.insert(20,'*');//超出长度用空格填充qDebug()<<arr3; //"aaaaaaaaaa          *"    arr1.remove(3,3); //移除第三个位置的后面3个字符qDebug()<<arr1; //"hello,w@orld!"arr1.removeIf([](char a){return a<'i';});//移除里面小于'i'的字符qDebug()<<arr1; //"lloworl"arr3.truncate(5);//从第5个位置开始截断qDebug()<<arr3;//"aaaaa"arr3.replace(1,2,"我是个大聪明啊,你是不是也和我一样");//从第一个位置开始,把后面2个字符替换成内容qDebug()<<QString::fromUtf8(arr3);//"a我是个大聪明啊,你是不是也和我一样aa"
  • 字符串查找和判断
  	qDebug()<<"arr3包含大聪明"<<arr3.contains("大聪明");//arr3包含大聪明 trueqDebug()<<"arr3以大聪明开头"<<arr3.startsWith("大聪明");//arr3以大聪明开头 falseqDebug()<<"arr3以大聪明结尾"<<arr3.endsWith("大聪明");//arr3以大聪明结尾 false  qDebug()<<arr1.at(2);qDebug()<<arr1[2];//第二个位置的字符    
  • 遍历
    for(auto i :arr1)qDebug()<<i;
  1. QString
  • 构造函数
    QString s1="你好";QString s2(QByteArray("abc"));qDebug()<<s1<<s2; 
  • 数据操作
    和QByteArray类似,append,prepend,insert
    s2.chop(1);//尾部删除一个字符qDebug()<<s2;
  • 字符串格式化
    s2 = QString::asprintf("hello %s","world");//跟sprintf差不多qDebug()<<s2;qDebug()<<QString("我叫%1,今年%2岁,职业是%3").arg("张三").arg(30).arg("程序员");//"我叫张三,今年30岁,职业是程序员"
  • 不同字符串类型转换
    //string->qstrings1= QString::fromStdString("你好china");qDebug()<<s1;//qstring->stringstd::string str1= s1.toStdString();std::cout<<str1<<std::endl;//qstring->qbytearryQByteArray qarr1 = s1.toUtf8();//转换为utf8编码格式的字符串qarr1 = s1.toLatin1();//转换为latin1编码,不支持中文qarr1 = s1.toLocal8Bit();//转换为本地编码,跟随操作系统
  1. QVariant

变体数据类型,可以保存很多的数据类型,包括QBrush,QColor,QCursor,QDateTime,QFont,QKeySequence,QPalette,QPen,QPixmap,QPoint,QRect,QRegion,QSize和QString,并且还有C++基本类型,如int,float等

    QVariant var1(666);QVariant var2 = QVariant::fromValue(QString("野人诺"));QVariant var3;var3.setValue(QByteArray("张三"));qDebug()<<var1.toInt()<<var2.toString()<<var3.toByteArray();

qDebug()输出时,转换类型要和原来的一致,否则输出为空
上面运行结果为: 666 “野人诺” “”

qDebug()<<var3.typeName();//const char*

自定义类型
mainwindow.h加上自定义类

class Person
{
public:QString name;quint8 age;friend QDebug operator<<(QDebug debug,const Person &person){debug<<"Person("<<person.name<<","<<person.age<<")";return debug;}    
};
Q_DECLARE_METATYPE(Person)

main.cpp里使用

    var3.setValue(Person());qDebug()<<var3.value<Person>();//输出结果Person( "" , 0 )return a.exec();

判断类型使用

    if(var3.canConvert<int>()){qDebug()<<var3.value<int>();}else if(var3.canConvert<Person>()){qDebug()<<var3.value<Person>();}elseqDebug()<<var3.typeName();return a.exec();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1027752.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

fastadmin学习05-开启debug以及配置

FastAdmin 框架提供了对 .env 环境变量配置的支持&#xff0c;并附带一个默认示例文件 .env.sample。在安装后&#xff0c;框架并不会自动启用 env 环境变量&#xff0c;需要手动将 .env.sample 复制为 .env 并进行配置。 如果不开启.env会读取database.php中的配置 下面测试…

基于单片机智能可控电源系统设计

**单片机设计介绍&#xff0c;基于单片机智能可控电源系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机智能可控电源系统设计的主要目标是实现电源的智能控制、监测和保护功能&#xff0c;以满足不同应用场景下…

计算机网络:物理层 - 信道极限容量

计算机网络&#xff1a;物理层 - 信道极限容量 实际信道中的数字信号奈式准则香农公式练习 实际信道中的数字信号 信号在传输过程中会受到各种因素的影响&#xff0c;如图所示&#xff1a; 这是一个数字信号&#xff0c;当它通过实际的信道后&#xff0c;波形会产生失真&#…

LLM2LLM: Boosting LLMs with Novel Iterative Data Enhancement

LLM2LLM: Boosting LLMs with Novel Iterative Data Enhancement 相关链接&#xff1a;arXiv GitHub 关键字&#xff1a;LLM、Data Augmentation、Fine-tuning、NLP、Low-data Regime 摘要 预训练的大型语言模型&#xff08;LLMs&#xff09;目前是解决绝大多数自然语言处理任…

如何选择最适合Shopee店铺的支付方式?

Shopee平台为卖家提供了多元化的收款选项&#xff0c;包括了在线支付、虚拟账户余额支付以及线下支付方式。卖家在选择收款方式时&#xff0c;必须充分考虑到市场适应性这一关键因素。因为不同地区和不同国家的消费者对于支付方式有着不同的偏好和习惯&#xff0c;因此&#xf…

零基础入门数据挖掘系列之「特征工程」

摘要&#xff1a;对于数据挖掘项目&#xff0c;本文将学习应该从哪些角度做特征工程&#xff1f;从哪些角度做数据清洗&#xff0c;如何对特征进行增删&#xff0c;如何使用PCA降维技术等。 特征工程&#xff08;Feature Engineering&#xff09;对特征进行进一步分析&#xf…

AI+软件工程:10倍提效!用ChatGPT编写系统功能文档

系统功能文档是一种描述软件系统功能和操作方式的文档。它让开发团队、测试人员、项目管理者、客户和最终用户对系统行为有清晰、全面的了解。 通过ChatGPT&#xff0c;我们能让编写系统功能文档的效率提升10倍以上。 ​《Leetcode算法刷题宝典》一位阿里P8大佬总结的刷题笔记…

深入理解PHP+Redis实现分布式锁的相关问题

概念 PHP使用分布式锁&#xff0c;受语言本身的限制&#xff0c;有一些局限性。 通俗理解单机锁问题&#xff1a;自家的锁锁自家的门&#xff0c;只能保证自家的事&#xff0c;管不了别人家不锁门引发的问题&#xff0c;于是有了分布式锁。分布式锁概念&#xff1a;是针对多个…

通过Caliper进行压力测试程序,且汇总压力测试问题解决

环境要求 第一步. 配置基本环境 部署Caliper的计算机需要有外网权限;操作系统版本需要满足以下要求:Ubuntu >= 16.04、CentOS >= 7或MacOS >= 10.14;部署Caliper的计算机需要安装有以下软件:python 2.7、make、g++(gcc-c++)、gcc及git。第二步. 安装NodeJS # …

RegSeg 学习笔记(待完善)

论文阅读 解决的问题 引用别的论文的内容 可以用 controlf 寻找想要的内容 PPM 空间金字塔池化改进 SPP / SPPF / SimSPPF / ASPP / RFB / SPPCSPC / SPPFCSPC / SPPELAN &#xfffc; ASPP STDC&#xff1a;short-term dense concatenate module 和 DDRNet SE-ResNeXt …

初识React(一)从井字棋游戏开始

写在前面&#xff1a; 磨磨唧唧了好久终于下定决心开始学react&#xff0c;刚刚接触感觉有点无从下脚...新的语法新的格式跟vue就像两种物种...倒是很好奇路由和store是怎么实现的了~v~&#xff0c;一点一点来吧&#xff01;&#xff01;&#xff01; (一)创建项目 使用vite…

Reactor设计模式和Reactor模型

Reactor设计模式 翻译过来就是反应堆&#xff0c;所以Reactor设计模式本质是基于事件驱动。 角色 Handle&#xff08;事件&#xff09;EventHandler&#xff08;事件处理器&#xff09;ConcreteEventHandler&#xff08;具体事件处理器&#xff09;Synchronous Event Demult…

QT实现蒙层效果

一.蒙层的作用 1.为了其他窗口不被误操作&#xff0c;禁止对其他窗口操作 二.应用场景 1.一些触摸屏设备上弹出一个dialog窗口&#xff0c;在操作这个窗口的时候不希望后面的窗口被误操作 2.之前做一个医疗设备就曾有过这种需求&#xff0c;因为医疗设备对安全性要求非常高&…

利用 Scapy 库编写 ARP 缓存中毒攻击脚本

一、ARP 协议基础 参考下篇文章学习 二、ARP 缓存中毒原理 ARP&#xff08;Address Resolution Protocol&#xff09;缓存中毒是一种网络攻击&#xff0c;它利用了ARP协议中的漏洞&#xff0c;通过欺骗或篡改网络中的ARP缓存来实施攻击。ARP协议是用于将IP地址映射到物理MAC…

各大pdf转word软件都用的哪家的ocr引擎?

国内一般的PDF软件一般都调用某国际PDF原厂的OCR接口&#xff0c;但这家公司是主要做PDF&#xff0c;在OCR方面并不专注&#xff0c;一些不是很复杂的场景还能应付得过来&#xff0c;复杂一点的效果就强差人意了&#xff0c;推荐用金鸣表格文字识别系统&#xff0c;它主要有以下…

基于树莓派实现 --- 智能家居

最效果展示 演示视频链接&#xff1a;基于树莓派实现的智能家居_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Tr421n7BM/?spm_id_from333.999.0.0 &#xff08;PS&#xff1a;房屋模型的搭建是靠纸板箱和淘宝买的家居模型&#xff0c;户型参考了留学时短租的公寓~&a…

Linux repo基本用法: 搭建自己的repo仓库[服务端]

概述 Repo的使用离不开Git, Git 和 Repo 都是版本控制工具&#xff0c;但它们在使用场景和功能上有明显区别… Git 定义&#xff1a;Git 是一个分布式的版本控制系统&#xff0c;由 Linus Torvalds 为 Linux 内核开发而设计&#xff0c;现已成为世界上最流行的版本控制软件之…

【详细讲解PostCSS如何安装和使用】

&#x1f308;个人主页:程序员不想敲代码啊&#x1f308; &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家&#x1f3c6; &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d; 希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提…

Leetcode146. LRU 缓存

Every day a Leetcode 题目来源&#xff1a;146. LRU 缓存 解法1&#xff1a;哈希表 链表 代码&#xff1a; /** lc appleetcode.cn id146 langcpp** [146] LRU 缓存*/// lc codestart class LRUCache { private:unordered_map<int, list<pair<int, int>>:…

图解Kafka架构学习笔记(二)

kafka的存储机制 https://segmentfault.com/a/1190000021824942 https://www.lin2j.tech/md/middleware/kafka/Kafka%E7%B3%BB%E5%88%97%E4%B8%83%E5%AD%98%E5%82%A8%E6%9C%BA%E5%88%B6.html https://tech.meituan.com/2015/01/13/kafka-fs-design-theory.html https://feiz…