06. Qt中的数据结构

Qt中的数据结构

一、常用数据类型

  1. 常用基本数据类型

    qint8 quint8 qint16 quint16 qint32 quint32 qint64 quint64 qreal

类型 说明 大小
qint8 signed char 1
quint8 unsigned char 1
qint16 signed short 2
quint16 unsigned short 2
qint32 signed int 4
quint32 unsigned int 4
qint64 long long int 8
quint64 unsigned long long int 8
qreal double 8

常用接口

//求绝对值,T是泛型,以下都是
T qAbs(const T &t)
//最大值和最小值,会把最大或最小的返回出来
T &qMax(const T &value1, const T &value2)
T &qMin(const T &value1, const T &value2)
//取中间值3个区中间的那个
const T &qBound(const T &min, const T &value, const T &max)
//比较浮点数大小
bool qFuzzyCompare(float p1, float p2)
bool qFuzzyCompare(double p1, double p2)
//随机数,可以像以前C讲的随机数一样使用,能执行成功
//如果没有随机数种子(qsrand),每次通过qrand随机出来的数都是一样的
qsrand((uint)QTime::currentTime().msec);//获取时间的秒,当作随机数种子
qrand()%10;//随机0~9,和C语言讲的一样
//获取变量环境
QByteArray ba = qgetenv("Path");
qDebug() << ba ;
  1. QSize,QSizeF

    • QSize(int width, int height) 表示大小,宽高

    • QSizeF(qreal width, qreal height)

    • QSize size(100, 10);
      size.rwidth() += 20;//120,12
      //有不带r的width,不带r不能这样修改
      
  2. QPoint,QPointF

    • QPoint(int xpos, int ypos);
    • QPointF(qreal xpos, qreal ypos);
    • 类似和QSize一样的操作,只不过这个表示的坐标
  3. QRect

    QRect(const QPoint &topLeft, const QPoint &bottomRight)
    QRect(const QPoint &topLeft, const QSize &size)
    QRect(int x, int y, int width, int height)
    
  4. QString

    • QString类提供了一个Unicode字符字符串。 注意是Unicode字符的字符串

    • 初始化

      QString str="six start edu";
      
    • 追加

      QString str="start";
      str.prepend("six");//在前面追加
      str.append("deu");//在后面追加
      //也可以使用push_back、push_front
      
    • 替换

      QString str1="six start edu";
      QString str2="nine";
      str1.replace(0,3,str2); //从第0个位子,把后买3个改为str2
      //str1="nine start edu";
      
    • 删除

      QString str="Six nine start edu";
      str.remove(3,5);//从第三个位子删5个
      qDebug()<<str;
      str.remove(QChar('s'),Qt::CaseInsensitive);//不加第二个参,不区分大小写
      qDebug()<<str;
      str.remove("edu");//删除edu
      qDebug()<<str;
      
    • 插入

      QString str="Six star";
      str.insert(8,QString("t edu"));
      
    • 判断是否为空

      //两种判断方式,注意区别
      QString().isEmpty(); // returns true
      QString("").isEmpty(); // returns true
      QString("x").isEmpty(); // returns false
      QString("abc").isEmpty(); // returns false
      QString().isNull(); // returns true
      QString("").isNull(); // returns false
      QString("abc").isNull(); // returns false
      
    • 查找字符串出现的位子

      QString str1="six SIX 666";
      QString str2="six";
      qDebug()<<str1.indexOf(str2);//返回0 找到了第一个匹配的
      qDebug()<<str1.indexOf(str2,1);//从1的位子开始搜索 返回-1 区分大小写
      qDebug()<<str1.indexOf(str2,3,Qt::CaseInsensitive);//返回4 不区分大消息
      qDebug()<<str1.indexOf(str2,5);//返回-1 没找到
      
    • 查找是否包含字符串

      QString str = "SIX";
      qDebug()<<str.contains("six", Qt::CaseInsensitive);//不区分大小写 返回true
      qDebug()<<str.contains("six");//返回false
      
    • 查找字符串出现次数

      QString str = "SIX six";
      qDebug()<<str.count("six", Qt::CaseInsensitive);//返回2
      qDebug()<<str.count("six");//返回1
      
    • 字符串截取

      QString str = "LiuXingJiaoYu";
      qDebug()<<str.left(7);//LiuXing 向左截取
      qDebug()<<str.right(6);//JiaoYu 向右截取
      
    • mid()截取

      QString str = "LiuXingJiaoYu";
      qDebug()<<str.mid(7,4);//从第7个位子开始截取4个 Jiao
      qDebug()<<str.mid(7);//从第7个位子开始截取到最后 JiaoYu
      
    • 数字转QString

      QString str;
      qint32 val=10;
      str=QString::number(val);//默认10进制
      qDebug()<<str;//10
      val=65535;
      str=QString::number(val,16);//16进制 同理后面还可以是2 8
      qDebug()<<str;//ffff
      qreal num=1.0123456789;
      str=QString::number(num);//默认情况 保留6位,整数位一起算进来
      qDebug()<<str;//1.01235
      str=QString::number(num,'g',8);//保留8位
      qDebug()<<str;//1.0123457
      
    • 格式化输入

      qint32 age=18;
      QString name="yimu";
      qreal score=66.654321;
      QString str=QString("姓名:%1,年龄:%2,成绩:
      %3").arg(name).arg(age).arg(score,0,'f',2);
      qDebug()<<str;//姓名:yimu,年龄:18,成绩:66.65
      
    • QString与std::string的转换

      QString str1="aaaaa";
      string str2=str1.toStdString();//QString转std::string
      cout<<str2;
      //头文件iostream string 命名空间std
      //选项->文本编辑器->行为->默认编码选system->ok
      string str1="aaaaa";
      QString str2=QString::fromStdString(str1);//std::string转QString
      qDebug()<<str2;
      
  5. QByteArray

    • 提供一个字节数组(序列),QByteArray可用于存储原始字节(包括“\ 0” )和传统的8位 “\ 0” 端接字符串 . 使用QByteArray比使用const char 更方便.

    • 在IO操作中,c语言常使用const char ,而Qt中常使用QByteArray;

      QByteArray ba1="adf";//直接赋值
      qDebug()<<ba1;
      qDebug()<<ba1.at(2);//通过at访问
      QByteArray ba2;
      ba2[0]='c';//方括号赋值,访问
      qDebug()<<ba2;
      
    • QByteArrar与char*相互转换

      QByteArray ba("这是一个字符串");
      const char *p=ba.constData();//QByteArray转const char *
      qDebug()<<p;
      const char *p="aaa";//const char *转QByteArray
      QString s=QString(p);
      QByteArray ba=s.toUtf8();
      qDebug()<<ba;
      const char *p="aaa";//const char *转QByteArray
      QByteArray ba(QByteArray::fromRawData(p,3));
      qDebug()<<ba;
      const char *p="aaa\0bbb\0ccc";
      QByteArray ba(QByteArray::fromRawData(p,11));
      qDebug()<<ba;
      cout<<ba.constData();//返回值类型为 const char * 输出为aaa
      
  6. QVariant

    • QVariant变量是没有数据类型的。 QVariant类像是最常见的Qt的数据类型的一个共用体(union), 一个QVariant对象在一个时间只保存一个单一类型的一个单一的值(有些类型可能是多值的,比如字符 串列表)。

    • 可以使用toT()(T代表一种数据类型)函数来将QVariant对象转换为T类型,并且获取它的值。这里 toT()函数会复制以前的QVariant对象,然后对其进行转换,所以以前的QVariant对象并不会改变。

      QVariant v=1.23;
      qDebug()<<v;
      qDebug()<<v.toInt();//输出1,转成了整型
      v=13;
      qDebug()<<v;
      v="aaaaa";
      qDebug()<<v;
      
      

二、容器

  • Qt库提供了一组通用的基于模板的容器类(container classes)。这些容器类可以用来存储指定类型 的项目(items),例如,如果大家需要一个QString类型的可变大小的数组,那么可以使用 QVector(QString)。与STL(Standard Template Library,C++的标准模板库)中的容器类相比,Qt中的这 些容器类更轻量,更安全,更容易使用

  • STL风格迭代器兼容Qt和STL的通用算法(generic algorithms),而且在速度上进行了优化。对于每 一个容器类,都有两个STL风格迭代器类型:一个提供了只读访问,另一个提供了读写访问。因为只读 迭代器比读写迭代器要快很多,所以应尽可能使用只读迭代器。

  • STL风格迭代器的API模仿了数组的指针,例如,使用“++”操作符来向后移动迭代器使其指向下一个项 目;使用“*”操作符返回迭代器指向的项目等。STL风格迭代器是直接指向项目的。其中一个容器的 begin()函数返回了一个指向该容器中第一个项目的迭代器,end()函数也返回一个迭代器,但是这个迭代 器指向该容器的最后一个项目的下一个假想的虚项目,end()标志着一个无效的位置,当列表为空时, begin()函数等价于end()函数。

  • 和STL差不多,可以参照帮助文档

posted @ 2022-07-31 18:41  Quirkygbl  阅读(614)  评论(0编辑  收藏  举报