(5)Qt—ui常用类

news/2024/11/29 2:51:00/

目录

1. QString 字符串类*

2. 容器类

2.1 顺序容器 QList

2.2关联容器 QMap

3. Qt类型

3.1 跨平台数据类型

3.2 QVariant 统一数据类型 

4.QDate Time 日期时间类

 5.QTimer 定时器类


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();    //字符串长度法1qDebug() << text.length();  //字符串长度法2qDebug() << text.count();   //字符串长度法3// int → QString// 参数1:要转换的数字// 参数2:进制,默认为十进制text = QString::number(11,16);qDebug() << text;// int → QString// 参数1:要转换的数字// 参数2:进制,默认为十进制// 返回值:QString& ,因此支持链式调用text.setNum(10,16).append("哈哈哈");qDebug() << text;// QString → int
//    int	toInt(bool * ok = 0, int base = 10) const// 参数1:表示转换是否成功// 参数2:进制,默认为十进制// 返回值:转换的结果,0表示失败text = "0";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<T>::const_iterator

QListIterator<T>

QList<T>::iterator

QMutableListIterator<T>

QStringList类基本等同于QList<QString>

 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

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

dialog.cpp

#include "dialog.h"Dialog::Dialog(QWidget *parent): QDialog(parent)
{//创建一个QList对象QList<Student> class23021;Student s1("张三",23,"电子信息科学与技术");Student s2("李四",25,"自动化");Student s3("王五",18,"计算机科学");Student s4("赵六",24,"物联网");Student s5("徐七",23,"电子信息工程");Student s6("孙八",18,"计算机科学");//增加元素class23021.push_back(s1); //向后追加class23021.append(s2);   //向后追加class23021.push_front(s3); //向前追加class23021 <<s1 <<s2 <<s3;  //连续追加class23021.insert(1,s4);  //在第二个位置插入 //参数1:位置 //参数2:元素值//删除元素class23021.pop_back();  //删除最后一个元素,同removeLastclass23021.pop_front();  //删除第一个元素,同removeFirst//class23021.erase();class23021.removeAt(1); //删除第n个元素//int removeAll(const T & value)  删除所有相同的元素//bool QList::removeOne(const T & value) 删除第一个相同元素//更新元素class23021[1] = s5;//更新元素//参数1:元素位置//参数2:更新的数组class23021.replace(0,s6);//遍历for(int i = 0;i<class23021.count();i++){Student s = class23021.at(i); //更高效qDebug()<<s.getName()<<s.getAge()<<s.getMajor();}qDebug()<<"*********************************";//C++ STL迭代器for(QList<Student>::const_iterator iter = class23021.begin();iter !=class23021.end();iter++){Student s = *iter;qDebug()<<s.getName()<<s.getAge()<<s.getMajor();}qDebug()<<"*********************************";//Java迭代器构造函数,参数为容器对象QListIterator<Student> iter(class23021);while(iter.hasNext()){ //判断后续有无有效元素//向后移动并取出Student s = iter.next();qDebug()<<s.getName()<<s.getAge()<<s.getMajor();}
}Dialog::~Dialog()
{}

main.cpp

#include "dialog.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Dialog w;w.show();return 0;
}

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;
}

运行结果:

2.2关联容器 QMap

关联容器的元素是以键值对的方式存在的,键表示数据的名称(通常使用字符串类型),值表示数据的本身(支持任何类型)。可以通过键来找到对应的值,关联容器是没有顺序的。

QMap除了支持C++的迭代器以外,还支持Java的迭代器,对应关系如下。

C++迭代器

等效的Java迭代器

QMap<T>::const_iterator

QMapIterator<T>

QMap<T>::iterator

QMutableMapIterator<T>

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对象QMap<QString,int> map;// 增加map["身高"] = 188;map["年龄"] = 18;map["防御"] = 55;// 插入// 参数1:键// 参数2:值map.insert("体重",188);// 删除元素// 参数:键// 返回值:删除的键值对数量,为0表示失败qDebug() << map.remove("体重");qDebug() << map.remove("体重");if(!map.contains("身高"))// 修改map["身高"] = 226;elseqDebug() << "身高键值对已经存在,无法修改!";// 取出if(map.contains("身高"))qDebug() << map["身高"]; // 不存在返回0// 取出// 参数1:键// 参数2:如果取不到的默认值qDebug() << map.value("身高2",-1);// 支持直接输出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.QDate Time 日期时间类

QDate Time类是两个类的合并: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)
{// 计算时间戳qint64 time0 = QDateTime::currentMSecsSinceEpoch();ui->setupUi(this);qint64 time = QDateTime::currentMSecsSinceEpoch();qDebug() << "setupUi耗时:" << time-time0;qDebug() << time;// 把time作为种子生成随机数qsrand(time);qDebug() << "0到200的随机数:" << qrand()%201;// 拿到基于当前数据的QDateTime对象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.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);//设置周期性timer->setSingleShot(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;
}

ui:

运行结果:


http://www.ppmy.cn/news/64881.html

相关文章

HTML的两个实战项目

文章目录 HTML的两个实战项目1. 个人简历1. 1 快速生成模板1.2 根据简历格式进行预设计1.3 开始创作吧1.3.1 基本信息1.3.2 教育背景1.3.3 专业技能1.3.4 我的项目1.3.5 自我评价 2. 输入简历信息页面设计2.1 设计大概框架2.2 开始创作吧2.2.1 输入姓名2.2.2 上传照片2.2.3 输入…

使用【SD-WEBUI】插件生成单张图包含多个人物:分区域的提示词

文章目录 &#xff08;零&#xff09;前言&#xff08;一&#xff09;潜变量成对&#xff08;Latent Couple&#xff09;&#xff08;1.1&#xff09;可自组LoRA&#xff08;Composable LoRA&#xff09; &#xff08;二&#xff09;分区扩散&#xff08;Multi Diffusion&#…

4.共享模型之管程

4.共享模型之管程 4.1 共享带来的问题 Java的体现 import lombok.extern.slf4j.Slf4j;/*** author xc* date 2023/5/6 13:00*/ Slf4j public class Test14 {static int i 0;public static void main(String[] args) throws InterruptedException {Thread t1 new Thread(()…

Redis 缓存穿透、缓存击穿与缓存雪崩

文章目录 1. 缓存穿透解决方法 2. 缓存击穿解决方法 3. 缓存雪崩解决方法 在 redis 的应用场景中&#xff0c;需要考虑缓存在某些场景下可能出现的问题&#xff1a; 缓存穿透 缓存击穿 缓存雪崩 以下缓存问题的讨论都是基于以下应用架构讨论的&#xff1a; 1. 缓存穿透 对应…

数据结构学习记录——堆的小习题(对由同样的n个整数构成的二叉搜索树(查找树)和最小堆,下面哪个说法是不正确的)

目录 习题一 习题二 习题三 答案区 解析区 习题一 习题二 习题三 习题一 一、下列序列中哪个是最小堆&#xff1f; .2&#xff0c;55&#xff0c;52&#xff0c;72&#xff0c;28&#xff0c;98&#xff0c;71 .2&#xff0c;28&#xff0c;71&#xff0c;72&#x…

ASP.NET Core 8 中身份验证的改进

ASP.NET Core 团队正在改进 .NET 8 中的身份验证、授权和身份管理(统称为“身份验证”)。新的 APIs 将使自定义用户登录和身份管理体验变得更加容易。新的端点将在没有外部依赖的单页应用程序(SPA)中启用基于令牌的身份验证和授权。我们还将改进我们的指引和文档&#xff0c;使…

C++实现二分查找(力扣题目704)

题目要求&#xff1a;给定一个n个元素的&#xff08;升序&#xff09;整型数组nums和一个目标值target&#xff0c;写一个函数搜索nums中的target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回-1 示例 输入: nums [-1,0,3,5,9,12] target 9 输出: 4 解释: 9 出现在…

读书笔记:《图解CIO工作指南》

《图解CIO工作指南》第 4 版&#xff0c;日 . 野村综合研究所系统咨询事业本部 著&#xff0c;周自恒 译 大数据、云计算时代下的IT战略和IT实务 CIO工作&#xff1a;IT管理、IT架构、IT实践 以着眼企业未来的观点进行构思&#xff1a;可视化&#xff08;业务与系统&am…