Qt--QString字符串类、QTimer定时器类
目录
1. QString 字符串类
dialog.cpp
2. 容器类
2.1 顺序容器 QList
示例代码:
student.h
student.cpp
dialog.h
dialog.cpp
运行结果:
2.2 关联容器 QMap
示例代码:
dialog.h
dialog.cpp
运行结果:
3. Qt类型
3.1 跨平台数据类型
3.2 QVariant 统一数据类型
4. QDateTime 日期时间类
dialog.h
dialog.cpp
运行结果:
5. QTimer 定时器类
示例代码:
dialog.ui
dialog.h
dialog.cpp
运行结果:
1. QString 字符串类
QString是Qt中的字符串类,与C和C++不同的是,Qt的字符串使用Unicode编码。每一个字符使用一个16位的QChar,而不是之前8位的char,所以Qt处理中文没有问题,并且每个中文算作一个字符。
Qt是基于C++的开发框架,因此很多类会尽可能地兼容C++的API,QString支持绝大多数std::string的API,例如append、size、length、at、push_back等。除此之外,也有修改和新增的部分。
对于QString类的API,可以通过认识常用的英文单词查询文档使用。
dialog.cpp
#include "dialog.h"Dialog::Dialog(QWidget *parent): QDialog(parent)
{//支持多国语言QString text="αβγあいうえおАБВ";qDebug()<<text;qDebug()<<"字符串长度:"<<text.size();qDebug()<<text.length();qDebug()<<text.count();//int--->QString//参数1:要转换的数字 参数2:进制, 默认十进制text=QString::number(12,16);//cqDebug()<<"数字转换为字符串:"<<text;//向后追加text.setNum(12,16).append("哈哈哈");text.push_back("g");qDebug()<<"向后追加:"<<text;//向前追加text.prepend("e");text.push_front("d");qDebug()<<"向前追加:"<<text;text.insert(0,"a");qDebug()<<"插入元素"<<text;//移除 下标从0开始text.remove(1,4);qDebug()<<"移除后:"<<text;//替换text="Say yes!";text.replace(4,3,"no");qDebug()<<"替换:"<<text;//分割text="a,b,c";QStringList list=text.split(",");qDebug()<<"以逗号分割:"<<list;//QString-->int// int toInt(bool * ok = 0, int base = 10) const//参数1:表示是否转换成功 参数2:进制,默认十进制//返回值:转换的结果,0表示失败text="12";bool result;//转换是否成功int i=text.toInt(&result);qDebug()<<"是否成功:"<<result;qDebug()<<i;
}Dialog::~Dialog()
{}
2. 容器类
C++的STL容器类已经不适用于Qt的环境,因为Qt重新实现了部分容器类,据官方所说,Qt的容器类更加轻巧、安全和易于使用。Qt对这些容器类进行存储优化,可以使生成的exe可执行文件的体积减小,这些容器类是线程安全的,支持同时被多个线程进行只读访问,几乎支持C++的STL容器类的API,并在此基础上进行了扩充。
2.1 顺序容器 QList
先创建一个自定义的C++类,然后使用QList存储这个类的对象。
在Qt中创建一个自定义的C++类的操作步骤如下:
1. 在Qt Creator中选中项目名称,鼠标右键,点击“添加新文件”。
2. 在弹出的窗口中,按照下图所示进行操作。

3. 在弹出的窗口中,先给类命名(主题使用大驼峰命名法,即所有单词的首字母大写),然后点击“下一步”。
4. 在项目管理界面直接点击完成。可以看到在项目中已经有对应的头文件和源文件了。

QList除了支持C++的迭代器以外,还支持Java的迭代器,对应关系如下。
C++迭代器 | 等效的Java迭代器 |
QList::const_iterator | QListIterator |
QList::iterator | QMutableListIterator |
QStringList类基本等同于QList
示例代码:
student.h
#ifndef STUDENT_H
#define STUDENT_H
//引入头文件
#include<QString>class Student
{
public:Student(QString,int,QString);QString getName() const;void setName(const QString &value);int getAge() const;void setAge(int value);QString getMajor() const;void setMajor(const QString &value);private:QString name;int age;QString major;
};#endif // STUDENT_H
student.cpp
#include "student.h"Student::Student(QString name,int age,QString major):name(name),age(age)
{this->major=major;
}QString Student::getName() const
{return name;
}void Student::setName(const QString &value)
{name = value;
}int Student::getAge() const
{return age;
}void Student::setAge(int value)
{age = value;
}QString Student::getMajor() const
{return major;
}void Student::setMajor(const QString &value)
{major = value;
}
dialog.h
#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>
//头文件
#include<QList>
#include"student.h"
#include<QDebug>class Dialog : public QDialog
{Q_OBJECTpublic:Dialog(QWidget *parent = 0);~Dialog();
};#endif // DIALOG_H
dialog.cpp
#include "dialog.h"Dialog::Dialog(QWidget *parent): QDialog(parent)
{//创建一个QList对象QList<Student> stu;Student s1("张三",18,"计算机应用技术");Student s2("李四",20,"电子信息工程");Student s3("王五",21,"计算机科学与技术");Student s4("赵六",19,"电子工程技术");Student s5("玛丽",23,"计算机应用技术");Student s6("杰克",24,"计算机科学与技术");//增加元素stu.push_back(s1);//向后追加stu.append(s2); //向后追加stu.push_front(s3);//向前追加stu<< s1<<s2<<s3;//连续追加//在第二个位置插入元素//参数1:位置//参数2:元素值stu.insert(1,s4);//删除元素stu.pop_back();//删除最后一个元素 -->removeLast()stu.pop_front();//删除第一个元素 -->removeFirst()stu.removeAt(3);//删除第n个元素//int QList::removeAll(const T & value) 删除所有相同元素//bool QList::removeOne(const T & value) 删除第一个相同的元素//更新元素stu[1]=s5;//参数1:元素位置//参数2:更新的位置stu.replace(2,s6);for(int i=0;i<stu.count();i++){Student s=stu.at(i);//更高效qDebug()<<s.getName()<<s.getAge()<<s.getMajor();}qDebug()<<"---------C++ STL迭代器-------------";//for(QList<Student>::const_iterator it=stu.begin();it!=stu.end();it++){Student s=*it;qDebug()<<s.getName()<<s.getAge()<<s.getMajor();}qDebug()<<"---------Java迭代器----------------";//Java迭代器构造函数,参数为容器对象QListIterator<Student> it(stu);while(it.hasNext())//判断后续有无有效元素{//向后移动并取出Student s=it.next();qDebug()<<s.getName()<<s.getAge()<<s.getMajor();}}Dialog::~Dialog()
{}
运行结果:
2.2 关联容器 QMap
关联容器的元素是以键值对的方式存在的,键表示数据的名称(通常使用字符串类型),值表示数据的本身(支持任何类型)。可以通过键来找到对应的值,关联容器是没有顺序的。
QMap除了支持C++的迭代器以外,还支持Java的迭代器,对应关系如下。
C++迭代器 | 等效的Java迭代器 |
QMap::const_iterator | QMapIterator |
QMap::iterator | QMutableMapIterator |
示例代码:
dialog.h
#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>
#include<QDebug>
#include<QMap>
class Dialog : public QDialog
{Q_OBJECTpublic:Dialog(QWidget *parent = 0);~Dialog();
};#endif // DIALOG_H
dialog.cpp
#include "dialog.h"Dialog::Dialog(QWidget *parent): QDialog(parent)
{QMap<QString,int> map;map["身高"]=180;map["年龄"]=18;map["体重"]=97;map["性别"]=1;//参数1:键//参数2:值map.insert("体重",90);//重新赋值//删除元素//参数:键//返回值:删除的键值对数量 返回0失败qDebug()<<map.remove("性别");//1qDebug()<<map.remove("性别");//0if(!map.contains("身高"))//修改map["身高"]=165;elseqDebug()<<"身高键值对已存在,无法修改!";if(map.contains("身高"))//取出qDebug()<<map["身高"];//不存在返回0//参数1:键//参数2:如果取不到的默认值 自设默认值为-1qDebug()<<map.value("体重2",-1);qDebug()<<"------支持直接输出-----------";qDebug()<<map;qDebug()<<"-------C++ STL迭代器 -----------";for(QMap<QString,int>::iterator iter=map.begin();iter!=map.end();iter++){//输出键值对qDebug()<<iter.key()<<iter.value();}qDebug()<<"--------- Java迭代器 -----------";QMutableMapIterator<QString,int> iter(map);while(iter.hasNext()){iter.next();// 向后移动迭代器指针//输出键值对qDebug()<<iter.key()<<iter.value();}
}Dialog::~Dialog()
{}
运行结果:
3. Qt类型(熟悉)
3.1 跨平台数据类型
C++中的数据类型可能会受到不同平台的影响,导致数据长度不同。Qt为了达到跨平台特性,规定了等效的跨平台类型,可以使这些类型不受到平台的影响。
3.2 QVariant 统一数据类型
QVariant类支持常用的Qt类型进行构造,也支持转换为这些数据类型。
构造函数 to开头的成员函数
4. QDateTime 日期时间类(熟悉)
QDateTime类是两个类的合并:QDate和QTime,可以处理日期和时间。
常用函数如下:
// 返回一个基于1970年1月1日00:00:00到现在的毫秒数(格林威治时间)
qint64 QDateTime::currentMSecsSinceEpoch() [static]
// 返回一个包含基于当前时区、当前日期和时间的QDateTime对象
QDateTime QDateTime::currentDateTime() [static]
// 返回一个制定格式的日期和时间
// 参数为日期和时间的格式,可参考文档
QString QDateTime::toString(const QString & format) const
dialog.h
#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>
//头文件
#include<QDebug>
#include<QDateTime>namespace Ui {
class Dialog;
}class Dialog : public QDialog
{Q_OBJECTpublic:explicit Dialog(QWidget *parent = 0);~Dialog();private:Ui::Dialog *ui;
};#endif // DIALOG_H
dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog)
{ui->setupUi(this);qint64 time=QDateTime::currentMSecsSinceEpoch();qDebug()<<time;//把time作为种子生成随机数qsrand(time);qDebug()<<"0到200的随机数:"<<qrand()%201;QDateTime dt=QDateTime::currentDateTime();//输出格式为:年-月-日 时:分:秒QString dtText=dt.toString("yyyy-MM-dd hh:mm:ss");qDebug()<<dtText;
}Dialog::~Dialog()
{delete ui;
}
运行结果:
5. QTimer 定时器类(掌握)
QTimer类提供了一次性和周期性两种定时器模式。
QTimer的常用属性有:
// 定时器是否在运行
active : const bool
// 是否一次性
singleShot : bool
// 间隔时间,单位毫秒
interval : int
常用函数如下:
// 启动定时器
// 如果定时器正在运行,此函数会停止其运行,并重新运行
void QTimer::start() [slot]
// 停止定时器
void QTimer::stop() [slot]
// 触发时发射的信号
void QTimer::timeout() [signal]
示例代码:
dialog.ui
dialog.h
#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>
//头文件
#include<QTimer>
#include<QDateTime>namespace Ui {
class Dialog;
}class Dialog : public QDialog
{Q_OBJECTpublic:explicit Dialog(QWidget *parent = 0);~Dialog();private:Ui::Dialog *ui;QTimer * timer;//创建手动管理的堆内存定时对象
private slots://与timeout信号连接void timeoutSlot();
};#endif // DIALOG_H
dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog)
{ui->setupUi(this);timeoutSlot();//创建定时器对象timer=new QTimer(this);//设置间隔时间timer->setInterval(1000);//设置为周期性 true代表单次timer->setSingleShot(false);//是否为一次性 false代表周期性connect(timer,SIGNAL(timeout()),this,SLOT(timeoutSlot()));//启动定时器timer->start();}
//到点更新显示
void Dialog::timeoutSlot()
{//获取当前时间QString time=QDateTime::currentDateTime().toString("hh:mm:ss");// QLcdNumber设置显示void display(const QString & s)ui->lcdNumber->display(time);}Dialog::~Dialog()
{if(timer->isActive())timer->stop();delete timer;delete ui;
}
运行结果:
相关文章:

Qt--QString字符串类、QTimer定时器类
目录 1. QString 字符串类 dialog.cpp 2. 容器类 2.1 顺序容器 QList 示例代码: student.h student.cpp dialog.h dialog.cpp 运行结果: 2.2 关联容器 QMap 示例代码: dialog.h dialog.cpp 运行结果: 3. Qt类型 3.1 跨平台数据类型…...

2023.5.13>>Eclipse+exe4j打包Java项目及获取exe所在文件的路径
Eclipseexe4j打包Java项目及获取exe所在文件的路径 1、打包exe文件1.1 打jar包1.2 打包exe2、在程序中获取exe所在路径3、遇到问题4、JDK version和class file version(Class编译版本号)对应关系5、参考文章 1、打包exe文件 1.1 打jar包 右单击项目选择“Export…” 1.2…...

Centos系统的使用基本教程
Centos是一款流行的Linux操作系统,它基于Red Hat Enterprise Linux系统,是一款稳定、可靠、安全的操作系统。本文将介绍Centos系统的基本使用方法,包括安装、命令行操作、软件安装和系统管理等方面的内容。 安装Centos系统 Centos系统可以从…...

IDEA生成ER图、UML类图、时序图、流程图等的插件推荐或独立工具推荐
以下是几个常用的IDEA插件和独立工具,可以用于生成ER图、UML类图、时序图、流程图等: Visual Paradigm (独立工具) Visual Paradigm是一个强大的建模工具,可以生成UML类图、时序图、流程图等。它支持多种语言和框架,包括Java、Spr…...

Python心经(3)
这一节总结点demo和常用知识点 目录 有关字符串格式化打印的 lambda匿名函数,,将匿名函数作为参数传入 文件读写 生成器 python的装饰器 简单的网站代码: 有关三元运算 推导式: 新浪面试题: 有关面向对象里…...

单工,半双工,全双工通讯
对于点对点之间的通信,按照消息传送的方向与时间关系,通信方式可分为单工通信、半双工通信及全双工通信三种。 单工通信 单工通信(Simplex Communication)是指消息只能单方向传输的工作方式。 在单工通信中,通信的信…...

【2023-05-09】 设计模式(单例,工厂)
2023-05-09 设计模式(单例,工厂) 单例模式 顾名思义,就是整个系统对外提供的实例有且只有一个 特点: 1、单例类只有一个实例 2、必须是自己创建唯一实例 3、必须给所以对象提供这个实例 分类ÿ…...

批量任务导致页面卡死解决方案
需求背景 需要基于高德地图展示海量点位(大概几万个),点位样式要自定义(创建DOM),虽然使用了聚合点,但初始化时仍需要将几万个点位的DOM结构都创建出来。 这里补充一句,高德地图在2.…...

避免“文献综抄”,5种写作结构助你完成文献综述→
很多作者可能有过这样的体验:读了很多文献,但在写综述的时候总感觉不像是在写文献综述,更像在写文献总结 如果引用方面不注意,甚至会成为文献综抄。 那么,你可以参考下我们整理的以下资料哦~ 01 文献总结和文献综述的…...

Java异常和反射
JAVA 异常分类及处理 概念 } final Entry<K,V> getEntryUsingComparator(Object key) { K k (K) key; // 获取该 TreeMap 的 comparator Comparator<? super K> cpr comparator; if (cpr ! null) { // 从根节点开始 Entry<K,V> p …...

Accesss数据库的那点事
Accesss数据库的那点事 1.Access的简介 Access(全称为Microsoft Access)是一个关系型数据库管理系统(RDBMS)。它是由微软公司开发的数据库软件,用于创建、管理和操作数据库应用程序。 Access提供了一个可视化的开发环…...

网络基础学习:osi网络七层模型
osi网络七层模型 什么是OSI,什么是ISO?为什么ISO要提出OSI网络七层模型?OSI七层的划分以及具体内容第七层 应用层第六层 表示层第五层 会话层第四层 传输层第三层 网络层第二层 数据链路层第一层 物理层 每一层与设备的对应关系 什么是OSI,什…...

EndNote X9 引用参考 单击文献编号,不能跳转到文尾文献列表处,咋解决?文献编号 不能跳转 ,怎么办?
文章目录 1 正常情况下 引用文献编号 是可以跳转的2 问题分析3 解决方法4 EndNote X9 插入参考文献常见问题总结5 EndNote X9 快速上手教程(毕业论文参考文献管理器) 1 正常情况下 引用文献编号 是可以跳转的 正确的插入文献后, 正常情况下&a…...

用免费蜜罐工具配置Modbus工控蜜罐
导语:本文将用DecoyMini免费蜜罐工具来配置自定义的ModbusTCP工控仿真模板,并介绍部署后的Modbus蜜罐的使用效果。 DecoyMini是一个免费的蜜罐工具,其特色是仿真能力采用与软件松耦合的仿真模板来进行管理。通过一键式导入云端仿真模板库里的…...

DataGridXL中快速搜索单元格和底部全屏模式区域隐藏
DataGridXL表格是在2020年发布,DataGridXL在设计时就考虑到了性能。提供最快、最简单、最可靠的数据网格。DataGridXL支持所有常用所有的浏览器,为 Web 应用程序提供类似于 Microsoft Excel 的体验,它支持前端框架有Vue、React、Angular等。 …...

DotNet几种微服务框架,你用过吗?
最近有群友问,.NET有哪些微服务框架?.NET的微服务框架还真不多,一般企业都会自己搭建微服务框架,或者基于其它框架搭建微服务(比如abp)。本文将介绍几种微服务框架,供大家学习参考。 一、Servi…...

Nature | 生成式人工智能如何构建更好的抗体
疫情高峰期,研究人员竞相开发一些首批有效的COVID-19治疗方法:从已经康复的人的血液中分离出来的抗体分子。 现在,科学家已经证明,生成式人工智能(AI)可以通过一些繁琐的过程提供捷径,提出增强抗…...

【hive】基于Qt5和libuv udp 的lan chat
作者已经不更新了,但是很棒 在线用户列表: 聊天窗口 主程序 单独的网络线程: network_thread data管理关联网络管理的 程序update升级更新 和消息收到 即可...

Java版本工程项目管理系统源码,助力工程企业实现数字化管理
Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下: 首页 工作台:待办工作、消息通知、预警信息,点击可进入相应的列表 项目进度图表:选择(总体或单个)项目显示…...

什么是零拷贝?
零拷贝 什么是零拷贝 零拷贝指的是,从一个存储区域到另一个存储区域的copy任务无需CPU参与就可完成。零拷贝的底层是 通过DMA总线技术实现的。零拷贝与具体的编程语言无关,完全依赖于OS,OS支持就可使用,不支持 设置了也不起作用…...

计算机专业含金量高的证书
目录 第一种证书:计算机技术与软件专业资格考试证书 第二种证书:微软认证 第三种证书:Oracle认证 第四种证书:思科认证 第五种证书:华为认证 第六种证书:红帽认证工程师 第七种证书:阿里…...

原装二手Keithley 2401低压源表 吉时利2401数字源表
Keithley 2401低压源表,20V,1A,20W Keithley 2401 低压源表提供精密电压和电流源和测量功能(1V - 20V 和 10pA - 1A)。它既是高度稳定的直流电源,又是真正的仪器级 5 位万用表。电源特性包括低噪声、精度和…...

gradle-8.1.1-all 快速下载百度网盘下载
Gradle 8.1.1 发布 这是Gradle 8.1的第一个补丁发布。 它修复了以下3个问题: 为配置缓存检测具有数千个lambdas的类时出现MethodTooLargeException;用Gradle 8.1构建的Kotlin DSL预编译脚本插件不能用于其他版本的Gradle;Gradle 8.1在buil…...

C#开发的OpenRA游戏之基地工程车部署命令产生过程
C#开发的OpenRA游戏之基地工程车部署命令产生过程 OpenRA游戏里,前面已经分析基地工程车部署的流程, 但那只是一个框架的流程,只能理解大体的框架, 如果想要深入一步了解怎么样产生部署命令,还需继续探讨以下的代码。 基地工程车是先选中,然后再在基地工程车上面点击右…...

C++ 智能指针的原理、分类、使用
1. 智能指针介绍 为解决裸指针可能导致的内存泄漏问题。如: a)忘记释放内存; b)程序提前退出导致资源释放代码未执行到。 就出现了智能指针,能够做到资源的自动释放。 2. 智能指针的原理和简单实现 2.1 智能指针的原…...

学习笔记——SVG.js中形状元素的创建及其相关方法
CreateElement 1)创建svg元素 在svg.js中,每个元素都是一个对象,可以通过构造它来创建: import { Rect } from "svgdotjs/svg.js" var rect new Rect().size(100, 100).addTo(draw) // or to reuse an existing nod…...

Linux一学就会——系统文件I/O
Linux一学就会——系统文件I/O 有几种输出信息到显示器的方式 #include <stdio.h> #include <string.h> int main() {const char *msg "hello fwrite\n";fwrite(msg, strlen(msg), 1, stdout);printf("hello printf\n");fprintf(stdout, &q…...

OpenCV-Python图像阈值
目录 简单阈值 自适应阈值 Otsu的二值化 所谓的图像阈值,就是图像二值化,什么是二值化,就是只有0和1,没有其他的。在OpenCV的图像里面,二值化表示图像的像素为0和255,并没有其他的值,它跟灰度…...

LangChain-Agents 入门指南
LangChain-Agents 入门指南 LangChain-Agents 入门指南注册 Serpapi运行高级 Agents API 测试运行 Google Search其它 Here’s the table of contents: LangChain-Agents 入门指南 LangChain是一个使用LLMs构建应用程序的工具箱,包含Models、Prompts、Indexes、Mem…...

深度学习-tensorflow 使用keras进行深度神经网络训练
概要 深度学习网络的训练可能会很慢、也可能无法收敛,本文介绍使用keras进行深度神经网络训练的加速技巧,包括解决梯度消失和爆炸问题的策略(参数初始化策略、激活函数策略、批量归一化、梯度裁剪)、重用预训练层方法、更快的优化…...