五、Qt中的常用类

news2024/11/18 9:24:57

1. QString 字符串类

QString是Qt中的字符串类,与C/C++不同的是,不再使用ASCII编码,而使用Unicode编码。因此一个字符不是8位的char,而是16位的QChar,这就是为什么之前一个汉字占用一个字符的原因。、
QString几乎向前兼容所有std::string的API。
部分常用函数如下:

// 数字 → QString
// 参数1:要转换的数字
// 参数2:进制
// 返回值:转换后的字符串
QString QString::number(long n, int base = 10) [static]
// 数字 → QString
// 参数1:要转换的数字
// 参数2:进制
// 返回值:转换后的字符串,支持链式调用
QString & QString::setNum(int n, int base = 10)
// QString → 数字
// 参数1:转换是否成功
// 参数2:进制
// 返回值:转换的结果,如果转换失败为0
int QString::toInt(bool * ok = 0, int base = 10) const

image.png

#include "dialog.h"

Dialog::Dialog(QWidget *parent)
: QDialog(parent)
{
    // Unicode
    QString text = "你好あいうㅙㅖабв";
    // 遍历
    for(int i=0;i<text.count();i++)
        {
            // at效率更高,[]可以作为左值
            qDebug() << text.at(i);
        }

    int a = 1;
    // 数字 → QString
    text = QString::number(a);
    qDebug() << text;
    a = 63;
    QString s = QString::number(a, 16);             // s == "3f"
    QString t = QString::number(a, 16).toUpper();     // t == "3F"
    // 数字 → QString
    text.setNum(a).append("fklsdh");
    qDebug() << text;
    // QString → 数字
    // 函数名称:to数据类型
    text = "0";
    bool result;
    a = text.toInt(&result,10);
    qDebug() << a;
    qDebug() << result;
}

Dialog::~Dialog()
{

}

2. 容器类

Qt基于C++的容器,重新提供了更轻巧、更安全和更易于使用的新容器类。这些新的容器类可以使程序最终的可执行文件体积减小,同时这些容器类可以被多个线程直接读取,也兼容C++绝大多数API。

2.1 QList类

本例不光讲解容器类的使用,同时增加自定义C++类的代码。
创建一个C++类的操作步骤如下:
1. 在Qt Creator中选中项目名称,鼠标右键,点击“添加新文件”。
2. 在弹出的窗口中,按照下图所示进行操作。
image.png
3. 在弹出的窗口中输入类名后点击“下一步”。image.png
4. 在项目管理界面,直接点击完成。
Qt的容器类都增加了Java风格迭代器,与C++的STL风格相比,只有语法上的不同。对应关系如下:

C++ STL 风格Java风格
QList::const_iteratorQListIterator
QList::iteratorQMutableListIterator
#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
#include "student.h"

Student::Student(QString name,int age,QString major)
    :name(name)
{
    this->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;
}
#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QDebug>
#include <QList>
// 引入学生类
#include "student.h"

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = 0);
    ~Dialog();
};

#endif // DIALOG_H
#include "dialog.h"

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
{
    QList<Student> class23061;
    Student s1("李新宇",33,"光电");
    Student s2("贾洪瑞",18,"电子");
    Student s3("谢德政",22,"畜牧");
    Student s4("陈凯",62,"光电");
    Student s5("王俊杰",63,"通信");
    Student s6("何凯",67,"保安");
    // 增
    class23061.append(s1);
    class23061 << s2  << s4 << s5;
    class23061.prepend(s6); // 前插
    class23061.insert(1,s3); // 在第二个位置插入s3
    // 删
    class23061.removeAt(2); // 删除第三个
//    class23061.removeAll(s4); // 删除所有相同元素
    class23061.removeFirst(); // 删除第一个
    class23061.removeLast(); // 删除最后一个
//    class23061.removeOne(s4); // 删除相同元素的第一个
    // 改
    class23061.replace(1,s6); // 把第二个元素替换为s6

    // 遍历
    for(int i=0;i<class23061.size();i++)
    {
        Student s = class23061.at(i);
        qDebug() << s.getName() << s.getAge() << s.getMajor();
    }

    // Java迭代器
    QListIterator<Student> iter(class23061); // 创建迭代器对象
    while(iter.hasNext()) // 后续有无元素
    {
        Student s = iter.next(); // 移动迭代器且取出元素
        qDebug() << s.getName() << s.getAge() << s.getMajor();
    }
}

Dialog::~Dialog()
{

}

2.2 QMap类

QMap也拥有Java风格迭代器:

C++ STL 风格Java风格
QMap<K,V>::const_iteratorQMapIterator<K,V>
QMap<K,V>::iteratorQMutableMapIterator<K,V>

dialog.cpp

#include "dialog.h"

Dialog::Dialog(QWidget *parent)
: QDialog(parent)
{
    QMap<QString,int> map;
    // 增加
    map.insert("月薪",10000);
    map.insert("年龄",20);
    map.insert("身高",199);
    map.insert("体重",100);

    // 移除
    // 返回值表示移除的键值对数量
    map.remove("体重");

    // 判断某个键在不在
    if(map.contains("身高"))
        qDebug() << "包含身高键";
    else
        qDebug() << "不包含身高键";
    // 修改
    map["身高"] = 188;
    // 取出
    int result = map.value("月薪",-1);
    qDebug() << result;

    // Java风格迭代器
    QMutableMapIterator<QString,int> iter(map);
    while(iter.hasNext())
        {
            iter.next(); // 向后移动
            QString k = iter.key();
            int v = iter.value();
            qDebug() << k << v;
        }

    qDebug() << map;
}

Dialog::~Dialog()
{

}

3. Qt数据类型

3.1 跨平台类型

Qt是一种跨平台的开发框架,需要保证常见的基本数据类型在各平台具有统一的长度,Qt因此为了这些数据类型定义了类型符号。

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

3.2 统一数据类型 QVariant

QVariant 类是Qt常见数据类型的统一类型,可以完成与常见类型的相互转换。
后续有一些函数的参数或返回值使用此类型,因此可以支持很多类型的匹配。

QVariant value(3.14);
QString text = value.toString(); // “3.14”
qDebug() << text;

3.3 QStringList字符串列表

QStringList是一个字符串列表,几乎等同于QList。

4. 时间与日期处理(熟悉)

在Qt中使用QDate类处理日期,使用QTime类处理时间,使用QDateTime类同时处理日期和时间。
QDateTime类常用功能有:

// 返回1970-1-1 00:00:00到到现在的毫秒数(基于格林威治时间)
qint64 QDateTime::currentMSecsSinceEpoch() [static]

以下是一个生成随机数的例子:

qint64 time = QDateTime::currentMSecsSinceEpoch();
qDebug() << time;
// 把time作为种子
qsrand(time);
// 生成 1-45 随机数
int rand = qrand()%45+1;
qDebug() << rand;
以下是一个时间戳的例子:
qint64 time = QDateTime::currentMSecsSinceEpoch();
ui->setupUi(this);
qDebug() << QDateTime::currentMSecsSinceEpoch() - time;
// 基于当前时区,从系统中返回一个包含当前日期和时间的QDatetime对象
QDateTime QDateTime::currentDateTime() [static]
// 把QDateTime中的数据转换为固定格式的字符串
// 参数为格式
QString QDateTime::toString(const QString & format) const

image.png
以下是一个格式化日期和时间的例子:

// 拿到QDateTime对象,包含当前数据
    QDateTime dt = QDateTime::currentDateTime();
    // 转换为固定格式
    QString text = dt.toString("yyyy-MM-dd hh:mm:ss");
    qDebug() << text; // "2023-10-20 16:00:44"
    text = dt.toString("yyyy年MM月dd日");
    qDebug() << text; // "2023年10月20日"

相关组件:
image.png

5. QTimer定时器类(掌握)

QTimer是定时器类,用于设定一个倒计时或者周期性触发的效果。
QTimer的常用属性有:
● interval : int
如果是一次性的定时器,此属性表示倒计时时间;如果是周期性的定时器,此属性表示间隔时间。单位毫秒
● singleShot : bool
表示是否是一次性
● active : const bool
表示当前定时器是否正在运行

QTimer常用函数如下:

// 启动定时器,如果定时器已经在运行,调用此函数会停止定时器运行并重新运行
void QTimer::start() [slot]
// 停止定时器
void QTimer::stop() [slot]
// 定时器每次触发时发射的信号
void QTimer::timeout() [signal]

例子:电子表
–来自百度网盘超级会员V6的分享
QLcdNumber组件使用:

// 给QLcdNumber设置字符串内容
ui->lcdNumber->display("11:23:23");

注意定时器对象要设置为堆内存,不归ui指针管
对应代码👇:
dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QTimer> // 定时器
#include <QDateTime>

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

private:
    Ui::Dialog *ui;
    QTimer* timer; // 定时器对象

private slots:
    // 定时器触发的槽函数
    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); // 0
    // 手动调用槽函数刷新时间
     // timeoutSlot(); // 解决刚刚运行时显示0的问题
    timer = new QTimer(this); // 创建定时器对象
    timer->setSingleShot(false); // 设置为周期性
    timer->setInterval(1000); // 设置间隔时间1000ms
    connect(timer,SIGNAL(timeout()),this,SLOT(timeoutSlot()));
    timer->start(); // 启动定时器
}
Dialog::~Dialog()
{
    delete ui;
}
void Dialog::timeoutSlot()
{
    // 获得当前时间
    QDateTime dt = QDateTime::currentDateTime();
    // 格式化
    QString text = dt.toString("hh:mm:ss");
    // 设置显示
    ui->lcdNumber->display(text);
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用jdbc技术连接数据库

连接数据库 <dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version><scope>compile</scope></dependency> </dependencies> g…

腾讯云阿里云服务器mongdb数据库设置密码

避坑点 数据库绑定ip一定要设置0.0.0.0 设置超级管理员账号密码 1、可以使用navicat15连接mongodb数据库&#xff0c;进入命令行界面&#xff0c;输入以下命令 如出现找不到MongoDB shell为可执行文件&#xff0c;选择设置路径&#xff0c;路径为&#xff1a;MongoDB shell是…

【底层服务/编程功底系列】「网络通信体系」深入探索和分析TCP协议的运输连接管理的核心原理和技术要点

【底层服务/编程功底系列】「网络通信体系」深入探索和分析TCP协议的运输连接管理的核心原理和技术要点 TCP的运输连接管理TCP三次握手三次握手流程分析注意要点 TCP四次挥手TCP之保活计时器&#xff08;keepalive timer&#xff09;保活计时器&#xff08;keepalive timer&…

入门人工智能 —— 学习数据持久化、使用 Python 将数据保存到mysql(7)

入门人工智能 —— 学习数据持久化、使用 Python 将数据保存到mysql 什么是数据持久化&#xff1f;使用 Python 进行数据持久化步骤 1: 安装 MySQL步骤 2: 安装必要的 Python 库步骤 3: 连接到 MySQL 数据库步骤 4: 创建数据表步骤 5: 插入数据步骤 6: 查询数据步骤 7: 关闭连接…

管理类联考——英语二——翻译篇——定语从句的翻译方法

第三节 定语从句的翻译方法 定语从句的翻译主要分为限制性定语从句和非限制性定语从句的翻译。主要可以分为三种方法&#xff1a;合译法、分译法和转译法。 一、限制性定语从句的翻译方法 限制性定语从句所修饰的先行词自身意义不明确&#xff0c;被定语从句修饰限定后其意…

很多技术人就是会存在自己技术能力不错但是是茶壶里煮饺子倒不出来,如何解决?可以用笔和纸去画一画?

所描述的情况通常指的是一些技术人员虽然拥有丰富的技术知识和实践经验&#xff0c;但在表达和沟通方面存在困难&#xff0c;无法有效地将自己的思考和解决方案传达给他人。这种情况在技术领域相对常见&#xff0c;因为技术人员往往更注重技术深度而非沟通技巧。为了解决这个问…

Azure - 机器学习企业级服务概述与介绍

目录 一、什么是 Azure 机器学习&#xff1f;大规模生成业务关键型机器学习模型 二、Azure 机器学习适合哪些人群&#xff1f;三、Azure 机器学习的价值点加快价值实现速度协作并简化 MLOps信心十足地开发负责任地设计 四、端到端机器学习生命周期的支持准备数据生成和训练模型…

基于LiteOS的智慧农业案例实验分享

最近在指导一位读者朋友做毕业设计&#xff0c;该毕设是关于端云互通的&#xff0c;基于小熊派LiteOS华为云。 在指导他的过程中我也学到了不少东西&#xff0c;这里通过一个案例实验&#xff08;智慧农业&#xff09;给大家分享一些知识。 实验框图 相关模块简介 1、STM32L4…

管理类联考——英语二——翻译篇——名词性从句的译法

第四节 名词性从句的译法 英语的名词性从句有四种&#xff0c;分别是主语从句&#xff0c;宾语从句&#xff0c;表语从句和同位语从句。整体而言&#xff0c;名词性从句的理解和中文语序的理解大致相同&#xff0c;因此在英译汉时&#xff0c;它无须作太大的调整&#xff08;…

Centos安装gitlabce

服务器配置要求&#xff08;2c4g&#xff09; 1、 安装其他组件 yum install -y curl policycoreutils-python openssh perl2、 安装Postfix服务以发送电子邮件通知&#xff0c;启动服务并自启 yum -y install postfix systemctl enable postfix --now3、 安装gitlab&#xf…

Linux C语言开发-D5常量

指数形式的实数一般由尾数部分、字母e或E和指数部分组成。格式如下&#xff1a; 字符常量 常见的字符常量的ASCII码的值为&#xff1a; A&#xff1a;65&#xff1b;Z&#xff1a;90&#xff1b; &#xff1a;32&#xff1b;0&#xff1a;48&#xff1b; a&#xff1a;97&…

怎么进行设备维护与保养?智能巡检系统有什么用?

设备维护与保养需要遵循三个原则&#xff1a;故障设备全面分析的原则、故障设备深入检查的原则以及故障设备分析排查的原则。 一、故障设备全面分析的原则   检修人员在对设备维护与保养时&#xff0c;如果看到设备在运行中出现了异常的现象&#xff0c;要立刻停止设备的工作…

有一门课不及格的学生

系列文章目录 进阶的卡莎C_睡觉觉觉得的博客-CSDN博客数1的个数_睡觉觉觉得的博客-CSDN博客双精度浮点数的输入输出_睡觉觉觉得的博客-CSDN博客足球联赛积分_睡觉觉觉得的博客-CSDN博客大减价(一级)_睡觉觉觉得的博客-CSDN博客小写字母的判断_睡觉觉觉得的博客-CSDN博客纸币(C…

2023年香港《施政报告》即将发布,人才引进计划最新政策解读!

2023年香港《施政报告》即将发布&#xff0c;人才引进计划最新政策解读&#xff01; 香港行政长官李家超将于10月25日发表任内第二份《施政报告》。李家超昨日&#xff08;10月22日&#xff09;在社交媒体分享视频&#xff0c;他手持新一份施政报告&#xff0c;封面是浅绿色为背…

【C语言|关键字】C语言32个关键字详解(4)——其他(typedef、sizeof)

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

使用 Redis 如何统计一亿个 keys ?

目录 1、聚合统计 2、排序统计 3、二值状态统计 4、基数统计 总结 // 淡泊明志&#xff0c;宁静致远 在 Web 和移动应用的业务场景中&#xff0c;我们经常需要保存这样一种信息&#xff1a;一个 key 对应了一个数据集合。举几个例子&#xff1a; 手机 App 中的每天的用户…

任务调度器详解(FreeRTOS)

目录 什么是任务调度器 FreeRTOS的任务调度器 抢占式调度 协作式调度 时间片调度 什么是任务调度器 任务调度器是实时操作系统&#xff08;RTOS&#xff09;的一个关键组件&#xff0c;它负责决定在多个可运行任务中哪一个将获得CPU时间以执行。它基于任务的优先级和状态来…

软考高级系统架构 上午真题错题总结

目录 前言一、2022年真题&#xff08;√&#xff09;二、2021年真题三、2020年真题&#xff08;√&#xff09;四、2019年真题&#xff08;√&#xff09;五、2018年真题&#xff08;√&#xff09;六、2017年真题&#xff08;√&#xff09;七、2016年真题&#xff08;√&…

Remmina Linux 远程桌面(堡垒机)解决方案,含文件互传

简介 Remmina 是一款在 Linux 和其他类 Unix 系统下的自由开源、功能丰富、强大的远程桌面客户端。 对于一个Linux作为主力开发机而言&#xff0c;Remmina 解决痛点主要是公司堡垒机远程客户现场的计算机&#xff0c;公司只给开发了win系统下的远程连接程序&#xff0c;而没有…