QT(五)常用类

1. QString字符串类(掌握)

QString是Qt的字符串类,与C++的string相比,不再使用ASCII编码,QString使用的是Unicode编码。

QString中每个字符都是一个16位的QChar,而不是8位的char。

QString完全支持中文,但是由于不同的技术可能会采用不同的中文编码, 也有可能会遇到中文编码一致性的问题。

从此乱码是路人

Qt中对C++的类重写时,充分考虑到了C++程序员的编程习惯,因此QString几乎支持所有string的API,除此之外也会增加一些额外的函数。

// int → QString
// 参数1:要转换的原始数据
// 参数2:进制
// 返回值:转换后的新的QString对象
QString QString::number(int n, int base = 10)[static]

// QString -> int
// 参数1:转换成功还是失败,成功参数设置为true、失败设置为false
// 参数2:进制
// 返回值:转换后的int数据,转换失败返回0
int QString::toInt(bool * ok = 0, int base = 10) const

dialog.h

#include "dialog.h"
#include "ui_dialog.h"Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);    QString str = "안녕하세요.";
    qDebug() << str;    ui->textBrowser->append(str);    // int → QString
    int a = 255;
    str = QString::number(a);
    qDebug() << str;    // "255"
    str = QString::number(a,2);//二进制
    qDebug() << str;    // "11111111"    str = QString::number(a,16);
    qDebug() << str;    // "ff"    // QString -> int
    bool result = false;
    str = "0";
    qDebug() << str.toInt(&result); // 0
    qDebug() << result; // true    str = "你好";
    qDebug() << str.toInt(&result); // 0
    qDebug() << result; // false
}Dialog::~Dialog()
{
    delete ui;
}

举例

QString str1 = "0";      // 合法的数字0
QString str2 = "你好";    // 非数字字符串
QString str3 = "123";    // 合法数字bool ok1, ok2, ok3;int num1 = str1.toInt(&ok1); // 转换成功,num1=0, ok1=true
int num2 = str2.toInt(&ok2); // 转换失败,num2=0, ok2=false
int num3 = str3.toInt(&ok3); // 转换成功,num3=123, ok3=trueqDebug() << "str1:" << num1 << ok1; // 输出: 0 true
qDebug() << "str2:" << num2 << ok2; // 输出: 0 false
qDebug() << "str3:" << num3 << ok3; // 输出: 123 true

当使用 toInt() 转换用户输入或外部数据时,必须检查 ok 参数

QString userInput = ui->lineEdit->text();
bool ok;
int value = userInput.toInt(&ok);if (ok) {
    // 转换成功,使用value
    qDebug() << "输入的是有效整数:" << value;
} else {
    // 转换失败,处理错误
    qDebug() << "输入不是有效整数";
    QMessageBox::warning(this, "错误", "请输入有效的整数");
}

不建议死记QString的API,因为数量多且都有示例代码,只需要把常用的关键词记住即可:

2. 容器类(掌握)

Qt重写了C++的STL中的容器类,相比较于C++的容器类,Qt的容器类更轻巧、更安全、更加的易于使用。因为Qt的容器类进行了速度和存储的优化,减少了可执行文件的生成体积,几乎全面兼容STL容器类API接口,线程是安全的,可以被多个线程所访问。

2.1 顺序容器—QList类

本次课程内容使用QList类存储Student元素,Student是自定义类型。在Qt项目中创建一个C++类的操作步骤如下:

  1. 在Qt Creator中,选中项目名称,鼠标右键点击添加新文件。
  2. 在弹出的窗口中按照下图所示,进行操作

3.在弹出的窗口中输入类名(大驼峰/帕斯卡)

4.在项目管理界面直接点击完成,可以看到新的文件已经创建成功。

student.h

#ifndef STUDENT_H
#define STUDENT_H#include <QString>
class Student
{
public:
    Student(int,QString,QString);
    ~Student();    int getId() const;
    void setId(int value);    QString getName() const;
    void setName(const QString &value);    QString getMajor() const;
    void setMajor(const QString &value);private:
    int id; // 编号
    QString name;   // 姓名
    QString major;  // 专业};#endif // STUDENT_H

student.cpp

#include "student.h"Student::Student(int id, QString name, QString major):id(id)
{
    this->name = name;//两种写法
    this->major = major;
}Student::~Student()
{}
int Student::getId() const
{
    return id;
}void Student::setId(int value)
{
    id = value;
}
QString Student::getName() const
{
    return name;
}void Student::setName(const QString &value)
{
    name = 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 <QDebug>
#include "student.h"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);
    // 创建QList对象
    QList<Student> lis;
    Student s1(1,"志浩","开挖掘机");
    Student s2(2,"云龙","开意大利炮");
    Student s3(3,"雨龙","美容美发");
    Student s4(4,"文博","算命的");
    Student s5(5,"昌文","开挖掘机炒菜");    // 向后插入元素(链式调用)
    lis << s1 << s2 << s3 << s4;    // 插入
    lis.insert(1,s5);   // 在第二个位置上插入s5    // 删除元素
    lis.removeFirst();  // 删除第一个元素    lis.removeLast();   // 删除最后一个元素    // 编译报错,不支持只定义类型比较,如果想要实现此功能,需要将==运算符重载
    // lis.removeOne(s3);  // 删除所有相同元素的第一个元素    // lis.removeAll(s3);  // 删除所有相同元素    lis.removeAt(1);    // 删除第二个元素    // 普通遍历
    for(int i = 0; i < lis.count(); i++)
    {
        // at函数在qt中执行效率比[] 高
        // 只能在右值使用
        Student s = lis.at(i);
        qDebug() << s.getId() << s.getName() << s.getMajor();
    }    // C++迭代器遍历
    for(QList<Student>::iterator iter = lis.begin(); iter != lis.end(); iter++)
    {
        Student s = *iter;
        qDebug() << s.getId() << s.getName() << s.getMajor();
    }
}Dialog::~Dialog()
{
    delete ui;
}

2.2 关联容器—QMap类

重新实现了STL中的map类,QMap也兼容了map类的大部分API,也增加了一些自己的API。

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);    // 创建一个栈内存对象***
    QMap<QString,QString>map;    // 插入数据
    map.insert("姓名","旭杰");
    map.insert("年龄","18");
    map.insert("地址","同住地球村");
    map.insert("专业","物联网");
    map.insert("爱好","睡觉");    // 如果容器内的元素支持qDebug输出,则容器给本身也支持输出
    qDebug() << map;//打印所有键值对    // 删除
    qDebug() << map.remove("专业");   // 1 返回的是删除的键值对的数量
    qDebug() << map.remove("专业");   // 0  没有了     // 判断某个键值对是否存在
    if(map.contains("籍贯"))
    {
        map["籍贯"] = "山东省";
    }    qDebug() << map;    qDebug() << map.value("爱好","没有 没有");    // "睡觉"
    qDebug() << map.value("喜好","没有 没有");    // "没有 没有"    // C++迭代器遍历
    for(QMap<QString,QString>::iterator i = map.begin();i != map.end();i++)
    {
        // 输出键值对
        qDebug() << i.key() << i.value();
    }}Dialog::~Dialog()
{
    delete ui;
}

3. Qt数据类型(掌握)

3.1 跨平台数据类型

Qt是一个跨平台的开发框架,所以必须保证各个平台的数据类型的长度保持一致,因此Qt为常见的基本类型定义了新的类型符号。

在Qt的环境下,可以直接使用。

3.2 QVariant统一变量类

QVariant类型可以与Qt常见的数据类型完成相互的转换,因此此类型的函数具有类似多态的特点。

使用QVariant类型完成数据类型转换:

    qint64 a = 123;
    QVariant v(a);
    QString str = v.toString(); // 将qint64数据转换为QStringqDebug() << str;    // "123"    v = str;int b = v.toInt();  // 转换为intqDebug() << b;  // 123

4. 时间与日期处理(掌握)

Qt中使用QDate类处理日期,使用QTime处理时间,使用QDateTime处理时间和日期。以QDateTime为例进行讲解。

需要注意的是,QDateTime的数据来自于系统时间,所以修改系统时间会影响到QDateTime的数据。

常用函数:

// 返回自1970年1月1日00:00:00到现在的毫秒数
qint64 QDateTime::​currentMSecsSinceEpoch()[static]

  1. 时间戳的作用,计算代码的运算时间。
    qint64 start = QDateTime::currentMSecsSinceEpoch();
    ui->setupUi(this);qDebug() << QDateTime::currentMSecsSinceEpoch() - start;

     2. 时间戳的其他作用

可以使用时间戳作为随机数的种子。但是需要注意,计算机中都是伪随机。不是真正的随机数,计算机无法做到真正的随机数。

获取当前的时间和日期对象。

// 返回一个包含当前日期和时间的QDateTime的对象
QDateTime QDateTime::​currentDateTime()[static]
// 格式化输出年月日、时分秒
QString QDateTime::​toString(const QString & format) const

秒:ss

#include "dialog.h"
#include "ui_dialog.h"Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    qint64 start = QDateTime::currentMSecsSinceEpoch();
    ui->setupUi(this);
    qDebug() << QDateTime::currentMSecsSinceEpoch() - start;    // 使用时间戳作为随机数的种子
    qsrand(start);    // 生成随机数(生成101以内的随机数)
    qDebug() << qrand() % 101;    QDateTime dt = QDateTime::currentDateTime();
    qDebug() << dt.toString("yyyy年MMMM月dddd日 hh时mm分ss秒");
}Dialog::~Dialog()
{
    delete ui;
}

其他与日期和时间相关的组件:

5. QTimer定时器(重点)

QTimer类可以实现一个延时任务或者周期任务

延时任务:微波炉定时功能

周期任务:闹钟,每天都响

使用定时器需要包含头文件#include<QTimer>,定时器继承自QObject。

常用属性:

  • interval : int

时间间隔,单位毫秒。

  • singleShot : bool

是否为一次性。true为延时任务、false为周期任务。

  • active : const bool

当前定时器的运行状态

// 构造函数,堆区开辟
QTimer:: QTimer(QObject * parent = 0)

QLCDNumber 组件

显示出10:30:32 这样的时间

因为显示时间需要8位,所以需要将此属性改为8

// lcdNuber的显式函数
void	display(const QString & s)[slot]
// 定时器触发时,发射的信号
void QTimer:: timeout()[signal]

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;private:
    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);    timer = new QTimer(this);    // 提前刷新
    timeoutSlot();//不提前刷新会先显示原来的0,再显示时间    // 设置时间间隔
    timer->setInterval(500);    // 设置为周期任务(默认就是周期任务)
    timer->setSingleShot(false);    connect(timer,SIGNAL(timeout()),
            this,SLOT(timeoutSlot()));    // 启动定时器
    timer->start();
}Dialog::~Dialog()
{
    if(timer->isActive())   // 如果正在运行,则先关闭
    {
        timer->stop();  // 关闭定时器
    }    delete timer;
    delete ui;
}void Dialog::timeoutSlot()
{
    // 获取当前时间,转换:时:分:秒格式的QString字符串
    QString str = QDateTime::currentDateTime().toString("hh:mm:ss");
    ui->lcdNumber->display(str);
}

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

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

相关文章

EXCEL怎么提取表名

错误的方法&#xff1a;使用以下方法提取表名的时候&#xff0c;会存在1个问题&#xff0c;公式只在当前工作表生效&#xff0c;换工作表会出现表名覆盖的情况。RIGHT(CELL("filename"),LEN(CELL("filename"))-FIND("]",CELL("filename&quo…

springboot校园外卖配送系统

目 录 第一章 绪 论 1.1背景及意义 1.2国内外研究概况 1.3 研究的内容 第二章 关键技术的研究 2.1开发技术 2.2 Springboot框架介绍 2.3 Vue.js 主要功能 2.4 MVVM模式介绍 2.4 B/S体系工作原理 2.5 MySQL数据库 第三章 系统分析 3.1 系统设计目标 3.2 系统可行性…

【智慧物联网平台】安装部署教程——仙盟创梦IDE

一、部署前准备1. 环境要求基础环境&#xff1a;JDK 1.8、MySQL 5.7/8.0、Maven 3.6、Redis&#xff08;用于缓存&#xff09;、Node.js&#xff08;用于前端构建&#xff0c;可选&#xff09;。依赖服务&#xff1a;若需对接门禁、道闸等硬件设备&#xff0c;需确保设备网络可…

【安全漏洞】防范未然:如何有效关闭不必要的HTTP请求方法,保护你的Web应用

在构建和维护Web应用的过程中&#xff0c;安全问题总是我们最关心的话题之一。今天&#xff0c;我们要探讨的是一个经常被忽视的Web漏洞——未关闭或限制不必要的HTTP请求方法。 虽然我们在日常开发中主要使用 GET 和 POST 这两种请求方法&#xff0c;但像 PUT、DELETE、HEAD、…

嵌入式Linux裸机开发笔记8(IMX6ULL)主频和时钟配置实验(1)

引言在前几章实验中我们都没有涉及到 I.MX6U 的时钟和主频配置操作&#xff0c;全部使用的默认配置&#xff0c; 默认配置下 I.MX6U 工作频率为 396MHz。但是 I.MX6U 系列标准的工作频率为 528MHz&#xff0c;有些 型号甚至可以工作到 696MHz。本章学习 I.MX6U 的时钟系统&…

设计模式(四)创建型:生成器模式详解

设计模式&#xff08;四&#xff09;创建型&#xff1a;生成器模式详解生成器模式&#xff08;Builder Pattern&#xff09;是 GoF 23 种设计模式中的核心创建型模式之一&#xff0c;其核心价值在于将一个复杂对象的构建过程与其表示分离&#xff0c;使得同样的构建过程可以创建…

《Angular+Spring Boot:ERP前端采购销售库存协同架构解析》

基于Angular与Spring Boot构建的全栈ERP前端&#xff0c;绝非技术的简单叠加&#xff0c;而是通过深度融合两者特性&#xff0c;打造出兼具稳定性与灵活性的业务载体。Angular的组件化架构将复杂界面拆解为可复用的独立单元&#xff0c;依赖注入机制则让服务调用与数据流转条理…

Java 排序

文章目录排序插入排序分析希尔排序分析选择排序分析堆排序分析冒泡排序分析快速排序霍尔法分析挖坑法找基准前后指针法题目快排的优化三数取中法非递归实现快排归并排序分析非递归实现归并排序海量数据的排序非比较的排序计数排序分析基数排序桶排序排序 稳定的排序&#xff1…

日本IT就职面试|仪容礼仪篇分享建议

日系企業で好印象を与える「身だしなみ」と「面接マナー」ガイドこんにちは。 日系企業への就職・転職活動をされている方にとって、「第一印象」は合否を左右する大切なポイントですよね。実は、面接の評価は入室の瞬間から始まっていると言っても過言ではありません。 今回は…

英语听力口语词汇-8.美食类

1.crispy,crisp adj.酥脆的&#xff0c;易碎的 2.sweet adj.甜的 比如说chocolate is so sweet and delicious 3.chewy adj.难嚼的&#xff0c;难咽的 4.oatmeal n.燕麦粉 5.pickle n.泡菜 7.stir-fry v.炒菜 8.bacon n.咸肉&#xff0c;熏肉 9.yummy adj.美味可口的 1…

力扣7:整数反转

力扣7:整数反转题目思路代码题目 给你一个 32 位的有符号整数 x &#xff0c;返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−2^31, 2^31 − 1] &#xff0c;就返回 0。 思路 这道题我们可以分成两部分来做&#xff0c;一是完成反转二…

PWM信号控制电机

1&#xff1a;环境 STM32F103C8T6 KEIL5.38 2个电机 2个轮子 1个L298N STLINKV2 CH340 1个4位独立按键 杜邦线若干 2&#xff1a;代码 key.h #ifndef __KEY_H #define __KEY_H#include "stm32f10x.h"extern volatile uint8_t key_t ; extern volatile uint8_t …

开源赋能产业,生态共筑未来 | 开源科学计算与系统建模(openSCS)分论坛圆满举行

2025开放原子开源生态大会于7月23日-24日在北京国家会议中心召开。本届大会以“开源赋能产业&#xff0c;生态共筑未来”为主题&#xff0c;汇聚政、产、学、研、用、金、创、投等各领域开源力量&#xff0c;聚焦开源政策导向、生态发展趋势、开源产业实践&#xff0c;共探中国…

Android广播机制体系初识

Android广播机制体系大白话把Android的广播机制想象成小区里的“大喇叭”谁在喊话&#xff1f;任何App或系统都能当“大喇叭”&#xff0c;比如喊一嗓子“电量不足啦&#xff01;”&#xff08;这就是发送广播&#xff09;谁在听&#xff1f;其他App只要“竖起耳朵”&#xff0…

微信小程序点击输入框时,顶部导航栏被遮挡问题如何解决?

前言 不知道大家开发微信小程序的时候有没有遇到这么一个问题&#xff0c;就是在表单页面中&#xff0c;点击输入框后&#xff0c;输入框顶起会把顶部栏给遮挡住&#xff0c;如下图所示&#xff1a;遇到这种情况有没有解决的办法呢&#xff1f;能不能既将页面顶起&#xff0c;同…

通过具有一致性嵌入的大语言模型(LMMs)实现端到端乳腺癌放射治疗计划制定|文献速递-医学影像算法文献分享

Title题目End-to-end breast cancer radiotherapy planning via LMMs with consistencyembedding通过具有一致性嵌入的大语言模型&#xff08;LMMs&#xff09;实现端到端乳腺癌放射治疗计划制定01文献速递介绍近年来&#xff0c;受大型语言模型&#xff08;LLM&#xff09;启发…

vscode npm run build打包报ELIFECYCLE

npm run build打包报ELIFECYCLE 是内存溢出解决方案&#xff1a;修改build脚本 &#xff1a;"build": "node --max_old_space_size4096 node_modules/vue/cli-service/bin/vue-cli-service.js build",

【lucene】BlockMaxConjunctionScore

BlockMaxConjunctionScorer 是 Lucene 8.5 引入的一个高性能交集打分器&#xff08;conjunction scorer&#xff09;&#xff0c;专门用于处理 多条件“与”查询&#xff08;AND 查询&#xff09; 的场景。它基于 Block-Max WAND&#xff08;BMW&#xff09;算法&#xff0c;可…

Androidstudio 上传当前module 或本地jar包到maven服务器。

1.设置gradle版本到8.0 gradle-wrapper.properties文件中设置&#xff1a; distributionUrlhttps\://mirrors.aliyun.com/macports/distfiles/gradle/gradle-8.0-bin.zip 2.设置项目根目录build.gradle 设置agp版本和maven插件版本&#xff08;和gralde版本有对应关系&#xff…

Python动态规划:从基础到高阶优化的全面指南

动态规划&#xff08;Dynamic Programming&#xff09;是解决复杂优化问题的核心技术&#xff0c;也是算法领域的明珠。本文将深入探讨Python实现动态规划的全方位技术&#xff0c;涵盖基础概念、经典问题、优化技巧和实际工程应用&#xff0c;带您掌握这一强大工具的精髓。一、…