Qt:第二章:数据类型容器

目录

一、数据类型

1 、基础数据类型

2 、字符串类型

1、初始化 

 2、追加、插入

3、替换

4、删除

5、判空

6、查找字符串出现的位置

7、查找字符串出现的次数

8、查找是否包含另一个字符串

9、字符串截取

10、数字转字符串QString

11、字符串str转换为数值

12、字符串分割

13、指定位置截断字符串

14、格式化输出

15、QString 与std:string互相转换

16、QByteArray和QString的转换

17、判断字符串str是否已字符串str2开头

18、QVariant(万能类型)

3、位置和尺寸类型

1、QPoint 

2、QLine

3、QSize

4、QRect

4 、日期和时间

1、QTime

2、QDate

3、QDateTime

二、容器

1、QVector

2、QList

3、QLinkedList

4、Qstack

5、QQueue

6、QSet

7、QMap,>

8、QHash,>

9、QMultiHash、QMutioleMap,>,>


一、数据类型

1 、基础数据类型

类型名称注释备注
qint8signed char有符号8位整形数据
qrealdouble 或 float除非配置了-qreal float选项,否则默认为double
qintptrquint32 或 quint64根据系统类型不同而不同,32位系统为quint32、64位系统为quint64
    //类型声明
    qint8 num = 48;
    qreal socre = 90.5;
    intptr agePtr;

2 、字符串类型

c => char*

c++ => std::string

Qt =>  QString、QByteArray        两者可以互相转换

1、初始化 

    QString str="dsfafd";
    QString str1("dsfafd");

 2、追加、插入

    //尾部追加数据    
    str.prepend("hello");
    str.push_back("goo");
    str +=str1;
    
    //头部添加数据
    str.append("EDU");
    str.push_front("bad");
    
    //插入:从第四位字符开始插入ok字符串
    str.insert(4,QString("ok"))

3、替换

    replace(1,0,str1);
    //参数1:从第几个位置开始,参数2:从基点往后面数的几个位置,然后把这一段删除,换上替换的str
    
    QString  str ="NC";
    QString  str1="wc";
    str.replace(1,0,str1);
    //结果 “NwcC”
    
    QString  str ="say yes";
    QString  str1="no";
    str.replace(4,3,str1);
    //结果 say no

4、删除

    //按位删除 remove(int,int);
    //删除特定字符串 remove(QChar(‘y’),Qt::CaseInsensitive);
    //Qt::CaseInsenstive:宏 不区分大小写 默认情况下是区分大小写的

    QString  str ="say yes";
    QString  str1="no";
    str.remove(0,5);
    str1.remove(1,1);
    //结果 es
    str.remove(QChar('y'),Qt::CaseInsensitive);
    //结果 sa es

5、判空

    //两种方法,isEmpty()或isNull()
    QString  str ="say yes";
    str.isEmpty();//true
    str.isNull();//true

6、查找字符串出现的位置

    //indexOf:找第一个出现的输入符号,返回对应下标
    //lastIndexOf:找最后一个
    int i;
    QString  str ="stick t";
    QString  str1="t";
    i=str.indexOf(str1); //1
    i=str.lastIndexOf(str1);//6

    i=str.indexOf(str1,11);//-1//从11位开始找,没找到返回-1

7、查找字符串出现的次数

    QString  str ="Stick question";
    QString  str1="sti";
    i=str.count(str1);  //返回1
    j=str.count(str1,Qt::CaseInsensitive);//忽略大小写,返回2

8、查找是否包含另一个字符串

    bool x;
    QString  str ="Stick question";
    QString  str1="sti";
    x=str.contains(str1);//true 

9、字符串截取

    QString  str ="Stick question";
    QString  str1="sti";
    - 向左截取
    str1=str.left(7); //从左开始数
    - 向右截取
    i=str.right(5),//从右边开始数
    - 中间截取
    j=str.mid(6,4);//从第一个参数开始,向后数4个

10、数字转字符串QString

    int num = 17;
    QString::number(num);

11、字符串str转换为数值

     //example 1      QString >> double
    bool d;
    d = QString( "1234,56" ).toDouble(&ok); // ok == false
    d = QString( "1234.56" ).toDouble(&ok); // ok == true, d == 1234.56
 
    //exapmle 2      QString >> folat
    QString str1 = "1234.56";
    str1.toFloat();             // returns 1234.56
 
    bool ok;
    QString str2 = "R2D2";
    str2.toFloat(&ok);          // returns 0.0, sets ok to false
 
    //exapmle 3     QString >> int 
    QString str = "FF";
    bool ok;
    //16表示十六进制
    int hex = str.toInt(&ok, 16);       // hex == 255, ok == true
    //10表示十进制 转换失败
    int dec = str.toInt(&ok, 10);       // dec == 0, ok == false

12、字符串分割

    QString str;
    QString csv = "forename,middlename,surname,phone";
    QString path = "/usr/local/bin/myapp"; // 第一个字段是空的
    QString::SectionFlag flag = QString::SectionSkipEmpty;
 
    //以“,”为分隔符,将从左往右的第2段返回
    str = csv.section(',', 2, 2);   // str == "surname"
    qDebug() <<str;
    //以“/”为分隔符,将从左往右的第3段到第4段返回
    str = path.section('/', 3, 4);  // str == "bin/myapp"
    qDebug() <<str;
    //以“/”为分隔符,将从左往右的第3段(忽略前面的空字段)
    str = path.section('/', 3, 3, flag); // str == "myapp"
    qDebug() <<str;
    
    //前面符号表示从右往左计数
    str = csv.section(',', -3, -2);  // str == "middlename,surname"
    str = path.section('/', -1); // str == "myapp"
 
    //这里除了可以以单个字符','为分割符外,还可以以"**"字符串为分割符号

13、指定位置截断字符串

    QString str = "Vladivostok";
    str.truncate(4);    // str == "Vlad"

14、格式化输出

    qreal x=123.123345678;
    QString str1="RainYa";
    QString str2;
    str2=QString("name is %1,age is %2").arg(str1).arg(x,0,'f',3);
    //qreal 保留几位小数,最后一个参数决定

15、QString 与std:string互相转换

    QString str1="RainYa";
    std::string str2="helllo";
    std::string str=str1.toStdString();
    QString qstr=QString::fromStdString(str2);

16、QByteArray和QString的转换

    //QStringLiteral("你好")为了显示中文

    //QString转为QByteArray 
    QString str(QStringLiteral("你好"));
	QByteArray byte = str.toUtf8();
	QByteArray byte1 = str.toLatin1();

    //QByteArray转QByteArray 
    QByteArray byte("hello");
    QString str = byte;
    

17、判断字符串str是否已字符串str2开头

    QString str = "Bananas";
 
    str.startsWith("Ban",Qt::CaseSensitive);         // returns true
    str.startsWith("ban",Qt::CaseInsensitive);       // returns true
    str.startsWith("Car",Qt::CaseSensitive);         // returns false

18、QVariant(万能类型)

//可以存储各种类型的数据,除了Qt内置类型,还可以支持自定义数据类型,需要宏Q_DECLARE_METATYPE(类型名)说明类型;
    QVariant b("fdfdsgfe");  //QVariant
    QString str=b.toString(); //QString
    
    --------------该函数不可以用做类型转换-------
    QStringList str1;
    str1<<"ni"<<" hao";
    QVariant b(str1);
    QStringList str=b.toStringList();

3、位置和尺寸类型

在QT中我们常见的 点, 线, 尺寸, 矩形 都被进行了封装, 下边依次为大家介绍相关的类。

1、QPoint 

QPoint类封装了我们常用用到的坐标点 (x, y), 常用的 API如下:

    // 构造函数
    // 构造一个坐标原点, 即(0, 0)
    QPoint::QPoint();
    // 参数为 x轴坐标, y轴坐标
    QPoint::QPoint(int xpos, int ypos);
    
    // 设置x轴坐标
    void QPoint::setX(int x);
    // 设置y轴坐标
    void QPoint::setY(int y);
    
    // 得到x轴坐标
    int QPoint::x() const;
    // 得到x轴坐标的引用
    int &QPoint::rx();
    // 得到y轴坐标
    int QPoint::y() const;
    // 得到y轴坐标的引用
    int &QPoint::ry();

    // 直接通过坐标对象进行算术运算: 加减乘除
    QPoint &QPoint::operator*=(float factor);
    QPoint &QPoint::operator*=(double factor);
    QPoint &QPoint::operator*=(int factor);
    QPoint &QPoint::operator+=(const QPoint &point);
    QPoint &QPoint::operator-=(const QPoint &point);
    QPoint &QPoint::operator/=(qreal divisor);
    
    // 其他API请自行查询Qt帮助文档

2、QLine

QLine是一个直线类, 封装了两个坐标点 (两点确定一条直线)。常用API如下:

    // 构造函数
    // 构造一个空对象
    QLine::QLine();
    // 构造一条直线, 通过两个坐标点
    QLine::QLine(const QPoint &p1, const QPoint &p2);
    // 从点 (x1, y1) 到 (x2, y2)
    QLine::QLine(int x1, int y1, int x2, int y2);
    
    // 给直线对象设置坐标点
    void QLine::setPoints(const QPoint &p1, const QPoint &p2);
    // 起始点(x1, y1), 终点(x2, y2)
    void QLine::setLine(int x1, int y1, int x2, int y2);
    // 设置直线的起点坐标
    void QLine::setP1(const QPoint &p1);
    // 设置直线的终点坐标
    void QLine::setP2(const QPoint &p2);
    
    // 返回直线的起始点坐标
    QPoint QLine::p1() const;
    // 返回直线的终点坐标
    QPoint QLine::p2() const;
    // 返回值直线的中心点坐标, (p1() + p2()) / 2
    QPoint QLine::center() const;
    
    // 返回值直线起点的 x 坐标
    int QLine::x1() const;
    // 返回值直线终点的 x 坐标
    int QLine::x2() const;
    // 返回值直线起点的 y 坐标
    int QLine::y1() const;
    // 返回值直线终点的 y 坐标
    int QLine::y2() const;

// 用给定的坐标点平移这条直线
void QLine::translate(const QPoint &offset);
void QLine::translate(int dx, int dy);
// 用给定的坐标点平移这条直线, 返回平移之后的坐标点
QLine QLine::translated(const QPoint &offset) const;
QLine QLine::translated(int dx, int dy) const;

// 直线对象进行比较
bool QLine::operator!=(const QLine &line) const;
bool QLine::operator==(const QLine &line) const;

// 其他API请自行查询Qt帮助文档, 不要犯懒哦哦哦哦哦......

3、QSize

在QT中QSize类用来形容长度和宽度, 常用的API如下:

    // 构造函数
    // 构造空对象, 对象中的宽和高都是无效的
    QSize::QSize();
    // 使用宽和高构造一个有效对象
    QSize::QSize(int width, int height);
    
    // 设置宽度
    void QSize::setWidth(int width)
    // 设置高度
    void QSize::setHeight(int height);
    
    // 得到宽度
    int QSize::width() const;
    // 得到宽度的引用
    int &QSize::rwidth();
    // 得到高度
    int QSize::height() const;
    // 得到高度的引用
    int &QSize::rheight();
    
    // 交换高度和宽度的值
    void QSize::transpose();
    // 交换高度和宽度的值, 返回交换之后的尺寸信息
    QSize QSize::transposed() const;

    // 进行算法运算: 加减乘除
    QSize &QSize::operator*=(qreal factor);
    QSize &QSize::operator+=(const QSize &size);
    QSize &QSize::operator-=(const QSize &size);
    QSize &QSize::operator/=(qreal divisor);
    
    // 其他API请自行查询Qt帮助文档

4、QRect

在Qt中使用 QRect类来描述一个矩形, 常用的API如下:

    // 构造函数
    // 构造一个空对象
    QRect::QRect();
    // 基于左上角坐标, 和右下角坐标构造一个矩形对象
    QRect::QRect(const QPoint &topLeft, const QPoint &bottomRight);
    // 基于左上角坐标, 和 宽度, 高度构造一个矩形对象
    QRect::QRect(const QPoint &topLeft, const QSize &size);
    // 通过 左上角坐标(x, y), 和 矩形尺寸(width, height) 构造一个矩形对象
    QRect::QRect(int x, int y, int width, int height);
    
    // 设置矩形的尺寸信息, 左上角坐标不变
    void QRect::setSize(const QSize &size);
    // 设置矩形左上角坐标为(x,y), 大小为(width, height)
    void QRect::setRect(int x, int y, int width, int height);
    // 设置矩形宽度
    void QRect::setWidth(int width);
    // 设置矩形高度
    void QRect::setHeight(int height);
    
    // 返回值矩形左上角坐标
    QPoint QRect::topLeft() const;
    // 返回矩形右上角坐标
    // 该坐标点值为: QPoint(left() + width() -1, top())
    QPoint QRect::topRight() const;
    // 返回矩形左下角坐标
    // 该坐标点值为: QPoint(left(), top() + height() - 1)
    QPoint QRect::bottomLeft() const;
    // 返回矩形右下角坐标
    // 该坐标点值为: QPoint(left() + width() -1, top() + height() - 1)
    QPoint QRect::bottomRight() const;
    // 返回矩形中心点坐标
    QPoint QRect::center() const;

    // 返回矩形上边缘y轴坐标
    int QRect::top() const;
    int QRect::y() const;
    // 返回值矩形下边缘y轴坐标
    int QRect::bottom() const;
    // 返回矩形左边缘 x轴坐标
    int QRect::x() const;
    int QRect::left() const;
    // 返回矩形右边缘x轴坐标
    int QRect::right() const;
    
    // 返回矩形的高度
    int QRect::width() const;
    // 返回矩形的宽度
    int QRect::height() const;
    // 返回矩形的尺寸信息
    QSize QRect::size() const;

4 、日期和时间

1、QTime

//获取当前日期
QDate date = QDate::currentDate();

//将QDate类型的对象转换为QString类型
QString strDate = date.toString("yyyy-MM-dd");

//将QString类型的对象转换为QDate类型
//strDate1中的格式和fromString()的参数2保持一致
QString strDate1 = "2023-07-01";
QDate date1 = QDate::fromString(strDate1, "yyyy-MM-dd");

//直接赋值声明:1997-7-1
QDate date3(1997, 7, 1);

2、QDate

//获取当前系统时间
QTime time = QTime::currentTime();

//将QTime 类型的对象转换为QString类型
 QString strTime = time.toString("hh:mm:ss z");//时-分-秒-毫秒

//将QString类型的对象转换为QTime 类型
QTime time1 = QTime::fromString("13:21:39", "hh:mm:ss");

3、QDateTime

//获取当前系统日期时间
QDateTime dt = QDateTime::currentDateTime();

//转为QString类型
QString  strDt  =  dt.toString("yyyy-MM-dd HH:mm:ss zzz");

//转为QDateTime 类型
QDateTime yuyu = QDateTime::fromString("2023-07-01 13:21:39 922", "yyyy-MM-dd hh:mm:ss zzz");

二、容器

序列式容器: QList, QLinkedList, QVector, QStack, 以及QQueue.对于大多数应用开发来说,QList是最好的容器使用类型。QList被设计的其实是一个数组链表。因此它在链表头尾操作时有非常好效率。如果我们需要指针类型格式的链表,就要使用 QLinkedList。QVector的底层就是一个数组,那样它的内存和数组一样是连续的。常用的 LIFO(后入先出) 以及 FIFO(先入先出)等数据结果也有对应的容器:QStack、QQueue,也就是栈和堆。

关联式容器:QMap, QMultiMap, QHash, QMultiHash, 以及 QSet。带"Multi"容器可以方便地支持与单个键关联的多个值。哈希容器通过使用哈希函数而不是二进制搜索来对排序集提供更快的查找。

描述
QVector特点:节点内存连续,优缺点和数组一致,但是功能封装的比数组强大。
QList这个类最常用,Qt很多API的容器参数基本上都是QList类型的【因为这个类开销小,很多API默认参数基本就是QList类型】,因为QList 是使用数组实现的,数据之间有顺序的,也就支持索引的方式,从而确保基于索引的访问非常快。数组有的功能,QList都有,增删改查,数组的优缺点,QList也是一样的继承下来了。【优点:索引方便、首尾添加方便;缺点:数据量巨大时插入不方便】
QLinkedList类似QList,除了实现的方式是指针结构体形式,而不是数组形式外,其他在使用是没啥区别;特点:插入快,遍历慢【都是数据量大的时候】
QStack栈,使用了QVector的局部功能(LIFO)
QQueue队列,使用的QList的局部功能(FIFO)
QMap<Key, T>这提供了一个字典(关联数组),该字典将 Key 类型的键映射到 T 类型的值。通常每个键都与单个值相关联。QMap按键顺序存储其数据;如果顺序无关紧要,QHash是一个更快的选择。 QMap会排序键,通过键访问值。
QMultiMap<Key, T>QMap升级版,一个键能对应多个值,一对多关系
QSet子集的特性:全局保留一份数组,可以去重复。
QHash<Key, T>和QMap功能相似,只是通过哈希算法实现的键值匹配,匹配更快,但是键是无序排列
QMultiHash<Key, T>和QMultiMap功能一致,只是实现方式不一致,有自己的适应范围。

注意:
        存储在各种容器中的值可以是任何可分配的数据类型。符合条件的数据类型必须能提供复制构造函数和赋值运算符。对于某些操作,还需要默认构造函数。这里涵盖了能被存储在容器中的大多数数据类型,包括基本类型(如 int 和 double等)、指针类型和 Qt 数据类型(如 QString、QDate 和 QTime等)。但是不包括QObject或任何QObject子类类型如(QWidget,QDialog,QTimer等)。 如果尝试实例化 QList< QWidget >,编译器将把 QWidget 的复制构造函数和赋值运算符禁用,该容器会失效。Qt为我们想到了另外一种方式:把这些类型的对象的地址存储在容器中,也就是将它们存储为指针类型,例如 QList<QWidget *> ,这样就能达到我们的目的.

//不能使用这种方式
QList <QWidget> widgets;

//而是这样
QList<QWidget *> ptr_widgets;

1、QVector

//声明
QVector<int> vec = { 1,2,3 };
//获取
qDebug() << vec[0] << " " << vec[1] << " " << vec[2] << " ";
//尾部添加
vec.push_back(10);
vec.append(20);
//头部添加
vec.push_front(0);
//包含
bool a = vec.contains(0);
//迭代器
QVector<int>::iterator iter = vec.begin();
for (; iter != vec.end(); iter++)
{
    qDebug() << *iter;
}
//插入
vec.insert(0, 20);
//删除
vec.remove(0);
//清空
vec.clear();
.............

2、QList

//声明:
 QList<QString> list;
//添加
list.push_back("aa");
list.append("bb");
list.prepend("00");
list.push_front("xx");
list.push_back("aa");
//取值
list[1];
for (int i = 0; i < list.size(); i++)
{
    qDebug() << list[i];
}
//统计出现次数
int a = list.count("aa");

//QStringList
QStringList strList;
strList.push_back("hello");
strList << "Qt" << "c++" << "mysql" << "design pattern";
qDebug() << strList;

//将字符串列表中的元素合并为字符串
QString str1 = strList.join("_");
qDebug() << "str1=" << str1;
//分隔
QStringList strList1 = str1.split("_");
qDebug() << strList1;
//找c++第一次出现的为坐标
int a = strList.indexOf("c++");
//替换
strList1.replaceInStrings("Qt", "QT");
//找最后一个坐标
int b = strList1.lastIndexOf("hello");  

3、QLinkedList

//声明
QLinkedList<int> list;

// 添加元素
list.append(1);
list.append(2);
list.append(3);

// 遍历
QLinkedList<int>::iterator i;
for (i = list.begin(); i != list.end(); ++i) {
     cout << *i << " ";
}
cout << std::endl;

// 删除元素
list.removeFirst();

// 查找元素
list.contains(2);//true OR  false

4、Qstack

//声明
QStack<int> s;

//添加
s.push(1);

//弹出栈顶元素
s.pop();

//栈顶元素
s.top();

5、QQueue

//声明
QQueue<int> q;

//添加
q.enqueue(1);
q.enqueue(2);
q.enqueue(3);

//取出
q.dequeue()

//头部元素
q.head();

6、QSet

//声明
QSet<QString> set;
//添加
set.insert("one");
set.insert("three");
set.insert("seven");
set << "twelve" << "fifteen" << "nineteen";
//是否属于集合,返回bool类型
bool a = set.contains("ninety-nine");
//遍历
QSet<QString>::iterator i = set.begin();
while (i != set.constEnd()) {
    qDebug() << *i;
    ++i;
}
//删除remove()
//清空clear()

7、QMap<Key, T>

//声明
QMap<QString, int> map;
//添加键值对
map.insert("zhangsan", 20);
map.insert("lisi", 25);
map["wangwu"] = 22;
//获取键值对
for (auto iter = map.begin(); iter != map.end(); iter++)
{
    qDebug() << " (" << iter.key() << "," << iter.value() << ")";
}
//获取所有键
QList<QString> keys = map.keys();
//获取所有值
QList<int> value = map.values();

qDebug() << keys[0] << " " << keys[1] << "," << keys[2];
qDebug() << value[0] << " " << value[1] << " " << value[2];

8、QHash<Key, T>

//声明
QHash<int,QString> qhash;

//插入元素:每个键只允许有一个值。如果用已经存在的键调用 insert(),先前的值将被删除 
    //方式一
    qhash[1] = "1";
    qhash[2] = "2";
    qhash[3] = "3";

    //方式二
    qhash.insert(4, “4”);

//取值:如果qhash里面没有该键值,则返回默认构造值;
    //方式一   
    QString str1=qhash.value(1);//str1="1";
 
    //方式二
    QString str2=qhash[2];//str1="2";

//检索某个值是否在里面 true OR false
qhash.contains(9)

//遍历
QHash<int,QString>::const_iterator it = qhash.constBegin();
while (it != qhash.constEnd()) {
    cout << it.key() << ": " << it.value() << Qt::endl;
    ++it;
}

//删除
    qhash.erase(it);//这里的it是迭代器
 
    qhash.remove(key);

9、QMultiHash<Key, T>、QMutioleMap<Key, T>

        QMultiHash和QMutioleMap内置API与QHash、QMap方法相同,不同点为一个键可以对应多个值,为一对多关系

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值