当前位置:   article > 正文

Qt --- 基本类_qt bool

qt bool

位置和尺寸

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

QPoint

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

  1. void QPoint::setX(int x);
  2. void QPoint::setY(int y);
  3. int QPoint::x() const; //只读
  4. int &QPoint::rx(); //返回引用 rx()=20
  5. int QPoint::y() const;
  6. int &QPoint::ry();
  7. //如果x和y坐标都为0则返回true,否则返回false
  8. bool isNull() const
  9. //返回x()和y()的绝对值之和,传统上称为从原点到该点的向量的“曼哈顿长度”--->两条直角边构成的距离
  10. //(p1-p2).manhattanLength();
  11. int manhattanLength() const
  12. //返回一个交换了x和y坐标的点: QPoint{1, 2}.transposed() // {2, 1}
  13. QPoint transposed() const
  14. // 直接通过坐标对象进行算术运算: 加减乘除 对坐标的缩放操作
  15. QPoint &QPoint::operator*=(float factor);
  16. QPoint &QPoint::operator*=(double factor);
  17. QPoint &QPoint::operator*=(int factor);
  18. QPoint &QPoint::operator+=(const QPoint &point);
  19. QPoint &QPoint::operator-=(const QPoint &point);
  20. QPoint &QPoint::operator/=(qreal divisor);
  21. ...
  1. //测试代码
  2. #include<QPoint>
  3. void testPoint();
  4. void testPoint()
  5. {
  6. //构造坐标点
  7. QPoint pos(5,4);
  8. //修改坐标 10 4
  9. pos.setX(10);
  10. //获取坐标
  11. qDebug()<<pos<<pos.x()<<pos.y();
  12. //修改坐标 5 5
  13. pos.rx()=5;
  14. pos.ry()=5;
  15. qDebug()<<pos<<pos.x()<<pos.y();
  16. //获取曼哈顿长度(相对于坐标原点)
  17. qDebug()<<pos.manhattanLength(); //5+5==10
  18. //下面是两个点的曼哈顿距离--->两个点相减得到两点距离再求曼哈顿距离
  19. qDwbug()<<QPoint(1,1)-QPoint(2,2).manhattanLength();
  20. //交换x和y
  21. qDebug()<<QPoint(2,3).transposed();
  22. }
  23. /*输出*/
  24. QPoint(10,4) 10 4
  25. QPoint(5,5) 5 5
  26. 10
  27. 2
  28. QPoint(3,2)

QLine

QLine是一个直线类, 封装了两个坐标点 (两点确定一条直线)

常用API如下:

  1. // 设置直线的起点坐标
  2. void setP1(const QPoint &p1);
  3. // 设置直线的终点坐标
  4. void setP2(const QPoint &p2);
  5. void setPoints(const QPoint &p1, const QPoint &p2); //两点确定一条线段
  6. void setLine(int x1, int y1, int x2, int y2);
  7. QPoint p1() const; // 返回直线的起始点坐标
  8. QPoint p2() const; // 返回直线的终点坐标
  9. QPoint center() const; // 返回值直线的中心点坐标, (p1() + p2()) / 2
  10. int x1() const; // 返回值直线起点的 x 坐标
  11. int y1() const; // 返回值直线起点的 y 坐标
  12. int x2() const; // 返回值直线终点的 x 坐标
  13. int y2() const; // 返回值直线终点的 y 坐标
  14. int dx() const //返回直线向量的水平分量
  15. int dy() const //返回直线向量的垂直分量
  16. // 用给定的坐标点平移这条直线
  17. void translate(const QPoint &offset);
  18. void translate(int dx, int dy);
  19. // 用给定的坐标点平移这条直线, 返回平移之后的坐标点(不会改变这条线的坐标)
  20. QLine translated(const QPoint &offset) const;
  21. QLine translated(int dx, int dy) const;
  22. // 直线对象进行比较
  23. bool operator!=(const QLine &line) const;
  24. bool operator==(const QLine &line) const;
  1. #include<QLine>
  2. void testLine()
  3. {
  4. //线段
  5. QLine line(2,3,4,5);
  6. //设置直线的起点坐标
  7. line.setP1(QPoint(10,10)); //QLine(QPoint(10,10),QPoint(4,5))
  8. //设置坐标
  9. line.setLine(5,5,9,9);
  10. //平移线段
  11. line.translate(1,2);
  12. qDebug()<<line;
  13. line.translate(3,3);
  14. qDebug()<<line;
  15. qDebug()<<line.translated(3,3);
  16. }
  17. /*输出*/
  18. Qline(QPoint(5,5),QPoint(9,9))
  19. Qline(QPoint(6,7),QPoint(10,11)) //有d不会对自身的线段进行操作 返回一个临时对象
  20. Qline(QPoint(9,10),QPoint(13,14)) //用qDebug()<<line.translated(3,3)输出

QSize

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

  1. void setWidth(int width)
  2. void setHeight(int height);
  3. int width() const; // 得到宽度
  4. int &rwidth(); // 得到宽度的引用
  5. int height() const; // 得到高度
  6. int &rheight(); // 得到高度的引用
  7. void transpose(); // 交换高度和宽度的值
  8. QSize transposed() const; // 交换高度和宽度的值, 返回交换之后的尺寸信息
  9. //返回一个大小,宽为当前大小与other的最小值,高为当前大小与other的最小值
  10. QSize boundedTo(const QSize& oterSize)
  11. //返回一个大小,宽为当前大小与other的最大值,高为当前大小与other的最大值
  12. QSize expandedTo(const QSize &otherSize) const
  13. /*
  14. 根据指定的模式,按给定的宽度和高度缩放矩形:
  15. 如果mode为Qt::IgnoreAspectRatio,则大小设置为(width, height)。
  16. 如果mode为Qt::KeepAspectRatio,当前大小将在内部缩放到一个尽可能大的矩形(宽度,高度),保持高宽比。
  17. 如果mode是Qt::KeepAspectRatioByExpanding,当前大小被缩放到一个矩形,尽可能小的外部(宽度,高度),保持长宽比。
  18. */
  19. void scale(int width, int height, Qt::AspectRatioMode mode)
  20. void scale(const QSize &size, Qt::AspectRatioMode mode)
  21. QSize scaled(int width, int height, Qt::AspectRatioMode mode) const
  22. QSize scaled(const QSize &s, Qt::AspectRatioMode mode) const
  23. // 进行算法运算: 加减乘除
  24. QSize &operator*=(qreal factor);
  25. QSize &operator+=(const QSize &size);
  26. QSize &operator-=(const QSize &size);
  27. QSize &operator/=(qreal divisor);

  1. #include<QSize>
  2. void testSize()
  3. {
  4. QSize size(640,480);
  5. //设置宽度和高度
  6. size.setWidth(1920);
  7. size.setHeight(1080);
  8. size.width();
  9. size.heigth();
  10. qDebug()<<size;
  11. //大小缩放
  12. size.scale(640,480,Qt::IgnoreAspectRatio); //忽略宽高比
  13. //保持宽高比
  14. size.scale(640,480,Qt::KeepAspectRatio); //保持宽高比
  15. size.scale(640,480,Qt::KeepAspectRatioByExpanding); //保持宽高比拓展
  16. qDebug()<<size;
  17. //把两个Size的最小宽度和高度拿出来构造成一个新的size返回
  18. qDebug()<<QSize(640,480).boundedTo(QSize(320,640));
  19. }
  20. /*输出*/
  21. QSize(1920,1080)
  22. QSize(640,480) //忽略宽高比
  23. QSize(640,360) //保持宽高比 短边和长边的区别
  24. QSize(853,480) //保持宽高比
  25. QSize(320,480)

QRect 

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

  1. // 构造一个空对象
  2. QRect::QRect();
  3. // 基于左上角坐标, 和右下角坐标构造一个矩形对象
  4. QRect::QRect(const QPoint &topLeft, const QPoint &bottomRight);
  5. // 基于左上角坐标, 和 宽度, 高度构造一个矩形对象
  6. QRect::QRect(const QPoint &topLeft, const QSize &size);
  7. // 通过 左上角坐标(x, y), 和 矩形尺寸(width, height) 构造一个矩形对象
  8. QRect::QRect(int x, int y, int width, int height);
  9. // 设置矩形的尺寸信息, 左上角坐标不变
  10. void QRect::setSize(const QSize &size);
  11. // 设置矩形左上角坐标为(x,y), 大小为(width, height)
  12. void QRect::setRect(int x, int y, int width, int height);
  13. // 设置矩形宽度
  14. void QRect::setWidth(int width);
  15. // 设置矩形高度
  16. void QRect::setHeight(int height);
  17. // 返回值矩形左上角坐标
  18. QPoint QRect::topLeft() const;
  19. // 返回矩形右上角坐标
  20. // 该坐标点值为: QPoint(left() + width() -1, top())
  21. QPoint QRect::topRight() const;
  22. // 返回矩形左下角坐标
  23. // 该坐标点值为: QPoint(left(), top() + height() - 1)
  24. QPoint QRect::bottomLeft() const;
  25. // 返回矩形右下角坐标
  26. // 该坐标点值为: QPoint(left() + width() -1, top() + height() - 1)
  27. QPoint QRect::bottomRight() const;
  28. // 返回矩形中心点坐标
  29. QPoint QRect::center() const;
  30. // 返回矩形上边缘y轴坐标
  31. int QRect::top() const;
  32. int QRect::y() const;
  33. // 返回值矩形下边缘y轴坐标
  34. int QRect::bottom() const;
  35. // 返回矩形左边缘 x轴坐标
  36. int QRect::x() const;
  37. int QRect::left() const;
  38. // 返回矩形右边缘x轴坐标
  39. int QRect::right() const;
  40. // 返回矩形的高度
  41. int QRect::width() const;
  42. // 返回矩形的宽度
  43. int QRect::height() const;
  44. // 返回矩形的尺寸信息
  45. QSize QRect::size() const;
  46. //调整矩形的尺寸 (左上角和右下角坐标偏移量)
  47. void QRect::adjust(int dx1, int dy1, int dx2, int dy2)
  48. QRect QRect::adjusted(int dx1, int dy1, int dx2, int dy2) const

  1. //测试代码
  2. #include<QRect>
  3. void testRect()
  4. {
  5. //构造一个矩形
  6. QRect rect(5,5,250,250);
  7. //输出左上角的坐标
  8. qDebug()<<rect.topLeft();
  9. //输出右下角的坐标
  10. qDebug()<<rect.bottomRight();
  11. qDebug()<<rect.bottomRight()+QPoint(1,1); //正常获取像素需要+1
  12. qDebug()<<rect;
  13. rect.adjust(1,1,-1,-1); //左上角都+1 右下角都-1
  14. //判断矩形是否包含某个点
  15. if(rect.contains(QPoint(6,6)); //(6,6)刚好在矩形上面
  16. {
  17. qDebug()<<"is in";
  18. }
  19. //判断矩形是否包含某个点,(6,6)刚好在矩形上面 bool类型的参数:是否严格判断:必须在里面|在上面的情况不算
  20. if(rect.contains(QPoint(6,6),true))
  21. {
  22. qDebug()<<"is in";
  23. }
  24. }
  25. /*输出*/
  26. QRect(5,5);
  27. QRect(254,254); //坐标系统是浮点型的,是在1的中间绘制线,前后各少了一半,合起来刚好少了一个像素 QRect(255,255);
  28. QRect(5,5,250*250)
  29. QRect(6,6,248*248) //一来一去两个像素
  30. is in
  31. ...

 日期和时间

 QDate

  1. // 构造函数
  2. QDate::QDate();
  3. QDate::QDate(int y, int m, int d); //年 月 日
  4. // 公共成员函数
  5. // 重新设置日期对象中的日期
  6. bool QDate::setDate(int year, int month, int day);
  7. // 给日期对象添加 ndays 天
  8. QDate QDate::addDays(qint64 ndays) const;
  9. // 给日期对象添加 nmonths 月
  10. QDate QDate::addMonths(int nmonths) const;
  11. // 给日期对象添加 nyears 月
  12. QDate QDate::addYears(int nyears) const;
  13. // 得到日期对象中的年/月/日
  14. int QDate::year() const;
  15. int QDate::month() const;
  16. int QDate::day() const;
  17. void QDate::getDate(int *year, int *month, int *day) const;
  18. /*日期对象格式化
  19. d - 没有前导零的日子 (1 to 31)
  20. dd - 前导为0的日子 (01 to 31)
  21. ddd - 显示(缩写) 周一、周二、周三、周四、周五、周六、周日
  22. dddd - 显示(完整) 星期一、星期二、星期三、星期四、星期五、星期六、星期日
  23. M - 没有前导零的月份(1到12) 在年月日中只有月份是大写 小写m用来表示其他东西
  24. MM - 前导零的月份(01到12)
  25. MMM - 缩写 1月、2月、3月...
  26. MMMM - 完整 一月、二月、三月...
  27. yy - 两个数字的年 (00 to 99)
  28. yyyy - 以四位数表示的年份
  29. */
  30. QString QDate::toString(const QString &format) const;
  31. // 操作符重载 ==> 日期比较
  32. bool QDate::operator!=(const QDate &d) const;
  33. bool QDate::operator<(const QDate &d) const;
  34. bool QDate::operator<=(const QDate &d) const;
  35. bool QDate::operator==(const QDate &d) const;
  36. bool QDate::operator>(const QDate &d) const;
  37. bool QDate::operator>=(const QDate &d) const;
  38. // 静态函数 -> 得到本地的当前日期
  39. [static] QDate QDate::currentDate();
  1. //测试代码
  2. #include<QDate>
  3. void testDate()
  4. {
  5. //构造一个日期对象
  6. QDate date(2021,3,4);
  7. qDebug()<<date;
  8. //获取当前的日期
  9. QDate curDate = QData::currentDate();
  10. qDebug()<<curDate;
  11. //获取年,月,日
  12. qDebug()<<curDate.year()<<curDate.month()<<curDate.day();
  13. //获取日期对应的星期--->一周的的第几天
  14. qDebug()<<curDate.dayOfWeek();
  15. //把日期转成字符串
  16. QString dateStr = date.toString();
  17. QString dateStr = date.toString(Qt::DateFormat::ISODate);
  18. QString dateStr = date.toString(Qt::DateFormat::LocalDate);
  19. dateStr = date.toString("今天是yy--MM-dd");
  20. dateStr = date.toString("今天是yy--MMMM-dd");
  21. qDebug()<<dateStr;
  22. }
  23. /*输出*/
  24. QDate("2021-03-04")
  25. QDate("2022-03-04")
  26. 2022 3 4
  27. 5
  28. "周四 3月 4 2021"
  29. "2021-03-04"
  30. "2021/3/4"
  31. "今天是2021-03-04"
  32. "今天是2021-三月-04"

 QTime

  1. // 构造函数
  2. QTime::QTime(); //时 分 秒 毫秒
  3. /*
  4. h ==> must be in the range 0 to 23
  5. m and s ==> must be in the range 0 to 59
  6. ms ==> must be in the range 0 to 999
  7. */
  8. QTime::QTime(int h, int m, int s = 0, int ms = 0);
  9. // 公共成员函数
  10. // Returns true if the set time is valid; otherwise returns false.
  11. bool QTime::setHMS(int h, int m, int s, int ms = 0);
  12. QTime QTime::addSecs(int s) const;
  13. QTime QTime::addMSecs(int ms) const;
  14. // 示例代码
  15. QTime n(14, 0, 0); // n == 14:00:00
  16. QTime t;
  17. t = n.addSecs(70); // t == 14:01:10
  18. t = n.addSecs(-70); // t == 13:58:50
  19. t = n.addSecs(10 * 60 * 60 + 5); // t == 00:00:05
  20. t = n.addSecs(-15 * 60 * 60); // t == 23:00:00
  21. // 从时间对象中取出 时/分/秒/毫秒
  22. // Returns the hour part (0 to 23) of the time. Returns -1 if the time is invalid.
  23. int QTime::hour() const;
  24. // Returns the minute part (0 to 59) of the time. Returns -1 if the time is invalid.
  25. int QTime::minute() const;
  26. // Returns the second part (0 to 59) of the time. Returns -1 if the time is invalid.
  27. int QTime::second() const;
  28. // Returns the millisecond part (0 to 999) of the time. Returns -1 if the time is invalid.
  29. int QTime::msec() const;
  30. // 时间格式化
  31. /*
  32. -- 时 如果是AM/PM显示,0 ~ 23或1 ~ 12
  33. h ==> The hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)
  34. hh ==> The hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)\
  35. 0到23,即使有AM/PM显示
  36. H ==> The hour without a leading zero (0 to 23, even with AM/PM display)
  37. HH ==> The hour with a leading zero (00 to 23, even with AM/PM display)
  38. -- 分
  39. m ==> The minute without a leading zero (0 to 59)
  40. mm ==> The minute with a leading zero (00 to 59)
  41. -- 秒
  42. s ==> The whole second, without any leading zero (0 to 59)
  43. ss ==> The whole second, with a leading zero where applicable (00 to 59)
  44. -- 毫秒
  45. zzz ==> The fractional part of the second, to millisecond precision,
  46. including trailing zeroes where applicable (000 to 999).
  47. -- 上午或者下午
  48. AP or A ==> 使用AM/PM(大写) 描述上下午, 中文系统显示汉字
  49. ap or a ==> 使用am/pm(小写) 描述上下午, 中文系统显示汉字
  50. */
  51. QString QTime::toString(const QString &format) const;
  52. // 操作符重载 ==> 时间比较
  53. bool QTime::operator!=(const QTime &t) const;
  54. bool QTime::operator<(const QTime &t) const;
  55. bool QTime::operator<=(const QTime &t) const;
  56. bool QTime::operator==(const QTime &t) const;
  57. bool QTime::operator>(const QTime &t) const;
  58. bool QTime::operator>=(const QTime &t) const;
  59. // 静态函数 -> 得到当前时间
  60. [static] QTime QTime::currentTime();
  1. //测试代码
  2. #include<Qtime>
  3. void testTime()
  4. {
  5. //获取当前时间
  6. QTime curTime = QTime::currentTime();
  7. qDebug()<<curTime;
  8. //获取时,分,秒,毫秒
  9. qDebug()<<curTime.hour()<<curTime.minute()<<curTime.second()<<curTime.msec();
  10. //把时间转换为字符串
  11. QString timeStr = curTime.toString("AP hh:mm:ss:zzz");
  12. qDebug()<<timeStr;
  13. //从字符串获取时间
  14. qDebug()<<QTime::fromString(timeStr,"AP hh:mm:ss:zzz"); //使用的是自定义格式需要把格式加在后面 | 如果使用标准方式就不用写后面的参数
  15. }
  16. /*输出*/
  17. QTime("21:31:08.716")
  18. 21 31 08 716
  19. "下午21:31:08:716"
  20. QTime("21:31:08.716")

 经时计时器

 QTime 的经时计时器已经过时了,推荐使用 QElapsedTimer

  1. //QTime已废弃的函数
  2. // 开始计时
  3. void QTime::start();
  4. // 计时结束
  5. int QTime::elapsed() const;
  6. // 重新计时
  7. int QTime::restart();
  8. // 推荐使用的API函数
  9. // QElapsedTimer 类
  10. void QElapsedTimer::start();
  11. qint64 QElapsedTimer::restart();
  12. qint64 QElapsedTimer::elapsed() const;

 主要的使用方法就是测量一个操作耗时多久,例子如下:

  1. #include<QElapsedTimer>
  2. QElapsedTimer elapse;
  3. elapse.start();
  4. //经过计时器可以用来计算某段代码,执行用了多长时间
  5. for(int i = 0;i<1000000;i++);
  6. elapse.restart(); //重新开始计时
  7. qDebug()<<elapse.elapsed()<<endl; //0
  8. void testElapsed()
  9. {
  10. QTime time;
  11. time.start(); //启动计时器
  12. for(int i = 0;i<1000000;i++)
  13. {
  14. ;
  15. }
  16. qDebug()<<"总共耗时: "<<time.elapsed(); //从启动到调用函数经过了多长时间
  17. }
  18. /*输出*/
  19. 总共耗时: 1(毫秒)

 QDateTime

  1. // 构造函数
  2. QDateTime::QDateTime(); //既有日期也有时间
  3. QDateTime::QDateTime(const QDate &date, const QTime &time, Qt::TimeSpec spec = Qt::LocalTime);
  4. // 公共成员函数
  5. // 设置日期
  6. void QDateTime::setDate(const QDate &date);
  7. // 设置时间
  8. void QDateTime::setTime(const QTime &time);
  9. // 给当前日期对象追加 年/月/日/秒/毫秒, 参数可以是负数
  10. QDateTime QDateTime::addYears(int nyears) const;
  11. QDateTime QDateTime::addMonths(int nmonths) const;
  12. QDateTime QDateTime::addDays(qint64 ndays) const;
  13. QDateTime QDateTime::addSecs(qint64 s) const;
  14. QDateTime QDateTime::addMSecs(qint64 msecs) const;
  15. // 得到对象中的日期
  16. QDate QDateTime::date() const;
  17. // 得到对象中的时间
  18. QTime QDateTime::time() const;
  19. // 日期和时间格式, 格式字符参考QDate 和 QTime 类的 toString() 函数
  20. QString QDateTime::toString(const QString &format) const;
  21. // 操作符重载 ==> 日期时间对象的比较
  22. bool QDateTime::operator!=(const QDateTime &other) const;
  23. bool QDateTime::operator<(const QDateTime &other) const;
  24. bool QDateTime::operator<=(const QDateTime &other) const;
  25. bool QDateTime::operator==(const QDateTime &other) const;
  26. bool QDateTime::operator>(const QDateTime &other) const;
  27. bool QDateTime::operator>=(const QDateTime &other) const;
  28. // 静态函数
  29. // 得到当前时区的日期和时间(本地设置的时区对应的日期和时间)
  30. [static] QDateTime QDateTime::currentDateTime();
  1. #include<QDateTime>
  2. void testDateTime()
  3. {
  4. //获取当前时间
  5. QDateTime dateTime = QDateTime::currentDateTime();
  6. qDebug()<<dateTime;
  7. //获取日期和时间
  8. qDebug()<<dateTime.date()<<dateTiem.Time();
  9. //把dateTime转换为字符串 格式可以自己决定
  10. qDebug()<<dateTime().toString("yyyy/MM/dd [hh:mm:ss:zz] ap");
  11. }
  12. /*输出*/
  13. QDateTime(2022-03-04 21:46:37.922 中国标准时间 Qt::LocalTime)
  14. QDate("2022-03-04") QTime("21:46:37.922")
  15. "2022/03/04 [21:46:37.922] 下午"

Qt 中容器遍历的方式

container

Qt中提供了一组通用的基于模板的容器类(container class)。可以用来存储指定的项(items),与STL(C++标准模板库)相比,Qt中的容器更轻量,更安全,功能更强大。

  • 序列式容器

    • QList

    • QLinkedList

    • QVector

    • QStack

    • QQueue

    对于大多数应用程序,QList是最好的类型。虽然它是作为数组列表实现的,但是它提供了非常快的前置和追加。如果你真的需要一个链表,使用QLinkedList;如果您希望您的项目占用连续的内存位置,请使用QVector。QStack和QQueue是提供LIFO和FIFO语义的便利类。

  • 关联式容器

    • QMap

    • QMultiMap

    • QHash

    • QMultiHash

    • QSet

    “multi”容器方便地支持与单个键相关联的多个值。“hash”容器通过使用哈希函数而不是对排序集进行二进制搜索,从而提供更快的查找。

  • 作为特殊情况,QCache和QContiguousCache类在有限的缓存存储中提供了对象的高效散列查找。

遍历容器

Qt提供了两种遍历容器的风格:

Java风格 的迭代器和 STL风格 的迭代器。java风格的迭代器更容易使用并提供高级功能,而STL风格的迭代器稍微更高效,可以与Qt和STL的通用算法一起使用

  1. //测试代码
  2. #include<QList>
  3. void testIterator()
  4. {
  5. QList<int> list;
  6. //通过初始化参数列表添加数据
  7. QList<int> list = {1,2,3,4,5};
  8. //通过流的方式添加数据
  9. list<<6<<7<<8<<9;
  10. //通过函数添加数据
  11. list.append(88);
  12. list.prepend(11);
  13. //在2前面的位置添加44
  14. list.insert(2,44);
  15. //遍历
  16. //java风格
  17. QListIterator<int> it(list);
  18. while (it.hasNext()) //有下一个就获取下一个
  19. {
  20. std::out<<it.next()<<" ";
  21. }
  22. //STL风格
  23. for(/*QList<int>::const_iterator*/auto it = list.constBegin(),it!=constEnd();it++)
  24. {
  25. std::cout<<*it<<" ";
  26. }
  27. //c++11 给我们提供了一个基于范围的for循环,更简单-->装的是什么类型就定义什么类型,让值到list中去拿 并输出
  28. for(auto/*int*/ val : list)
  29. {
  30. std::cout<<val<<" ";
  31. }
  32. }
  33. /*输出*/
  34. 11 1 44 2 3 4 5 6 7 8 9 88
  35. 11 1 44 2 3 4 5 6 7 8 9 88
  36. 11 1 44 2 3 4 5 6 7 8 9 88

序列式容器

QList

QList模板提供了一个列表,实际上是一个指针数组,当项目数小于1000时,可以实现快速的插入删除操作

QList<T> 是 Qt 的通用容器类之一。它将项目存储在一个列表中,该列表提供基于索引的快速访问和基于索引的插入和删除。 QList<T>、QLinkedList<T> 和 QVector<T> 提供类似的 API 和功能。它们通常可以互换,但会产生性能后果。

使用概述:

  • QVector 应该是您的默认首选。 QVector<T> 通常会比 QList<T> 提供更好的性能,因为 QVector<T> 总是将其项按顺序存储在内存中,其中 QList<T> 将在堆上分配它的项,除非 sizeof(T) <= sizeof(void *) 并且 T 已使用 Q_DECLARE_TYPEINFO 声明为 Q_MOVABLE_TYPE 或 Q_PRIMITIVE_TYPE。

  • 然而,QList 在整个 Qt API 被大量使用,用于传递参数和返回值。 使用 QList可以很方便的与这些 API 进行交互。

  • 如果您需要一个真正的链表,它保证常量时间内插入列表,并且使用迭代器指向项而不是索引,那么请使用QLinkedList。

公有函数

  • 添加数据

  1. //支持流插入
  2. QList<int>()<<1<<2<<3<<4<<5;
  3. void append(const T &value)
  4. void append(const QList<T> &value)
  5. void insert(int i, const T &value)
  6. QList::iterator insert(QList::iterator before, const T &value)
  7. void prepend(const T &value)
  8. void push_back(const T &value)
  9. void push_front(const T &value)
  • 获取数据

  1. T &back()
  2. const T &back() const
  3. T &first()
  4. const T &first() const
  5. T &front()
  6. const T &front() const
  7. T &last()
  8. const T &last() const
  9. const T &constFirst() const
  10. const T &constLast() const
  11. //返回下标为i的元素,如果下标i不合法,则返回defaultValue
  12. T value(int i) const
  13. T value(int i, const T &defaultValue) const
  14. const T &at(int i) const
  15. T &operator[](int i)
  16. const T &operator[](int i) const
  17. //返回从位置pos开始的子列表。如果length为-1(默认),则包含pos中的所有元素;
  18. QList<T> mid(int pos, int length = -1) const
  • 删除数据

  1. void clear()
  2. QList::iterator erase(QList::iterator pos)
  3. QList::iterator erase(QList::iterator begin, QList::iterator end)
  4. void pop_back()
  5. void pop_front()
  6. //删除元素
  7. int removeAll(const T &value)
  8. bool removeOne(const T &value)
  9. void removeAt(int i)
  10. void removeFirst()
  11. void removeLast()
  12. //删除元素并返回它,如果不使用返回值,removeAt()会更高效
  13. T takeAt(int i)
  14. T takeFirst()
  15. T takeLast()
  • 查找/替换

  1. //返回value在列表中第一次出现的索引位置,从索引位置from向前搜索。 如果没有匹配的项,则返回-1。
  2. int indexOf(const T &value, int from = 0) const
  3. //返回value在列表中最后一次出现的索引位置,从索引位置from反向搜索。如果from是-1(默认值),则搜索从最后一项开始。如果没有匹配的项,则返回-1。
  4. int lastIndexOf(const T &value, int from = -1) const
  5. //将索引位置为i的项替换为value
  6. void replace(int i, const T &value)
  7. //如果列表中包含值的出现,则返回true; 否则返回false。 该函数要求值类型具有operator==()的实现。
  8. bool contains(const T &value) const
  • 交换/移动

  1. //将索引位置from到索引位置to
  2. //["A", "B", "C", "D", "E", "F"] move(1,4)-> ["A", "C", "D", "E", "B", "F"]
  3. void move(int from, int to)
  4. void swap(QList<T> &other)
  5. //交换下标i j的元素
  6. void swapItemsAt(int i, int j)
  • 判断函数

  1. int count(const T &value) const
  2. int count() const
  3. int size() const
  4. int length() const
  5. bool empty() const
  6. bool isEmpty() const
  7. //如果列表第一项/后一项等于value,则返回true; 否则返回false。
  8. bool startsWith(const T &value) const
  9. bool endsWith(const T &value) const
  10. //预分配空间大小
  11. void reserve(int alloc)
  • 和其他容器互转

  1. QSet<T> toSet() const
  2. std::list<T> toStdList() const
  3. QVector<T> toVector() const
  4. [static] QList<T> fromSet(const QSet<T> &set)
  5. [static] QList<T> fromStdList(const std::list<T> &list)
  6. [static] QList<T> fromVector(const QVector<T> &vector)

QStringList → 字符串列表

QStringList 继承自 QList<QString> 它提供基于索引的快速访问以及快速插入和删除。 将字符串列表作为值参数传递既快速又安全。 QList的所有功能也适用于QStringList。 例如,可以使用isEmpty()来测试列表是否为空,还可以调用append()、prepend()、insert()、replace()、removeAll()、removeAt()、removeFirst()、removeLast()和removeOne()等函数来修改QStringList。 此外,QStringList提供了一些方便的函数,使处理字符串列表更容易:

  • 判断是否包含某个字符串 → 全匹配

  1. bool contains(const QString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
  2. bool contains(QLatin1String str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
  3. bool contains(QStringView str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
  • 过滤:返回包含子字符串 str 的所有字符串的列表 → 部分匹配,只要包含即可

  1. QStringList filter(const QString &str, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
  2. QStringList filter(QStringView str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
  3. QStringList filter(const QRegExp &rx) const
  4. QStringList filter(const QRegularExpression &re) const
  • 查找

  1. //从左往右查找 从哪里开始查找 | 默认从0开始查
  2. int indexOf(const QRegExp &rx, int from = 0) const
  3. int indexOf(QStringView str, int from = 0) const
  4. int indexOf(QLatin1String str, int from = 0) const
  5. int indexOf(QRegExp &rx, int from = 0) const
  6. int indexOf(const QRegularExpression &re, int from = 0) const
  7. //从右往左查找 正则表达式
  8. int lastIndexOf(const QRegExp &rx, int from = -1) const
  9. int lastIndexOf(QStringView str, int from = -1) const
  10. int lastIndexOf(QLatin1String str, int from = -1) const
  11. int lastIndexOf(QRegExp &rx, int from = -1) const
  12. int lastIndexOf(const QRegularExpression &re, int from = -1) const
  • 连接:将QStringList中的所有字符串连接为一个字符串,每个元素由给定的分隔符(可以是空串)分隔

  1. //支持流插入 << 返回的是一个字符串
  2. QString join(const QString &separator) const
  3. QString join(QStringView separator) const
  4. QString join(QLatin1String separator) const
  5. QString join(QChar separator) const
  • 删除:从QStringList中删除重复的元素。 返回已删除元素的数量

int removeDuplicates()
  • 替换:返回一个字符串列表,其中每个字符串在找到before文本时都将before文本替换为after文本

  1. QStringList &replaceInStrings(const QString &before, const QString &after, Qt::CaseSensitivity cs = Qt::CaseSensitive)
  2. QStringList &replaceInStrings(QStringView before, QStringView after, Qt::CaseSensitivity cs = Qt::CaseSensitive)
  3. QStringList &replaceInStrings(const QString &before, QStringView after, Qt::CaseSensitivity cs = Qt::CaseSensitive)
  4. QStringList &replaceInStrings(QStringView before, const QString &after, Qt::CaseSensitivity cs = Qt::CaseSensitive)
  5. QStringList &replaceInStrings(const QRegExp &rx, const QString &after)
  6. QStringList &replaceInStrings(const QRegularExpression &re, const QString &after)
  • 排序:升序

void sort(Qt::CaseSensitivity cs = Qt::CaseSensitive)

 

  1. //测试代码
  2. #include <QStringList>
  3. void testStringList()
  4. {
  5. //构造一个字符串列表 用于存储大量的字符串
  6. QStringList names = {"大白","大白","小白","大黑","小黑"};
  7. //重载了流的方式
  8. names<<",.?!"<<"nullptr"<<"young"<<"loading";
  9. qDebug()<<names;
  10. //判断是否包含某个字符串 是否区分大小写
  11. if(names.contains("Nullptr",Qt::CaseSensitivity::CaseInsensitive)) //忽略大小写
  12. {
  13. qDebug()<<"找到了";
  14. }
  15. else
  16. {
  17. qDebug()<<"没找到";
  18. }
  19. //过滤--->部分匹配
  20. auto lists = names.filter("g"); //返回值类型:QStringList 需要接收一下
  21. for(auto str : lists)
  22. {
  23. std::cout<<str.toStdString()<<" "; //一个个输出 转换为std的String
  24. }
  25. std::cout<<lists.size()<<std::endl; //输出大小
  26. //查找-->返回下标的位置
  27. int pos = names.indexOf("小白");
  28. qDebug()<<pos;
  29. //把所有的字符串连接成一个字符串
  30. qDebug()<<names.join(" "); //或者用,分隔
  31. //从列表中删除重复的元素,返回已删除元素的数量
  32. int cnt = names.removeDuplicates();
  33. qDebug()<<cnt;
  34. qDebug()<<names;
  35. //把大白替换为maye
  36. names.replaceInStrings("大白","maye");
  37. qDebug()<<names;
  38. //排序--->按升序排列|区分大小写
  39. names.sort();
  40. qDebug()<<names;
  41. //c++的排序方式--->按降序排列|比较准则
  42. std::sort(names.begin(),names.end(),[](QString& s1,QString& s2){ return s1>s2; });
  43. qDebug()<<names;
  44. }
  45. /*输出*/
  46. ("大白","大白","小白","大黑","小黑",",.?!\","nullptr","young","loading") //列表
  47. 找到了
  48. loading young 2
  49. 2
  50. "大白 大白 小白 大黑 小黑 ,.?! nullptr loading young" //一个字符串
  51. 1
  52. ("大白","小白","大黑","小黑",",.?!","nullptr","young","loading")
  53. ("maye","小白","大黑","小黑",",.?!","nullptr","young","loading")
  54. (",.?!", "loading", "maye", "nullptr", "young", "大黑", "小白", "小黑")
  55. ("小黑", "小白", "大黑", "young", "nullptr", "maye", "loading", ",.?!")
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/167718
推荐阅读
相关标签
  

闽ICP备14008679号