在QT中我们常见的 点, 线, 尺寸, 矩形 都被进行了封装, 下面依次为大家介绍相关的类
QPoint
类封装了我们常用用到的坐标点 (x, y), 常用的 API如下:
void QPoint::setX(int x);
void QPoint::setY(int y);
int QPoint::x() const; //只读
int &QPoint::rx(); //返回引用 rx()=20
int QPoint::y() const;
int &QPoint::ry();
//如果x和y坐标都为0则返回true,否则返回false
bool isNull() const
//返回x()和y()的绝对值之和,传统上称为从原点到该点的向量的“曼哈顿长度”--->两条直角边构成的距离
//(p1-p2).manhattanLength();
int manhattanLength() const
//返回一个交换了x和y坐标的点: QPoint{1, 2}.transposed() // {2, 1}
QPoint transposed() const
// 直接通过坐标对象进行算术运算: 加减乘除 对坐标的缩放操作
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);
...
//测试代码
#include
void testPoint();
void testPoint()
{
//构造坐标点
QPoint pos(5,4);
//修改坐标 10 4
pos.setX(10);
//获取坐标
qDebug()<两个点相减得到两点距离再求曼哈顿距离
qDwbug()<
QLine
是一个直线类, 封装了两个坐标点 (两点确定一条直线
)常用API如下:
// 设置直线的起点坐标
void setP1(const QPoint &p1);
// 设置直线的终点坐标
void setP2(const QPoint &p2);
void setPoints(const QPoint &p1, const QPoint &p2); //两点确定一条线段
void setLine(int x1, int y1, int x2, int y2);
QPoint p1() const; // 返回直线的起始点坐标
QPoint p2() const; // 返回直线的终点坐标
QPoint center() const; // 返回值直线的中心点坐标, (p1() + p2()) / 2
int x1() const; // 返回值直线起点的 x 坐标
int y1() const; // 返回值直线起点的 y 坐标
int x2() const; // 返回值直线终点的 x 坐标
int y2() const; // 返回值直线终点的 y 坐标
int dx() const //返回直线向量的水平分量
int dy() const //返回直线向量的垂直分量
// 用给定的坐标点平移这条直线
void translate(const QPoint &offset);
void translate(int dx, int dy);
// 用给定的坐标点平移这条直线, 返回平移之后的坐标点(不会改变这条线的坐标)
QLine translated(const QPoint &offset) const;
QLine translated(int dx, int dy) const;
// 直线对象进行比较
bool operator!=(const QLine &line) const;
bool operator==(const QLine &line) const;
#include
void testLine()
{
//线段
QLine line(2,3,4,5);
//设置直线的起点坐标
line.setP1(QPoint(10,10)); //QLine(QPoint(10,10),QPoint(4,5))
//设置坐标
line.setLine(5,5,9,9);
//平移线段
line.translate(1,2);
qDebug()<
在QT中
QSize
类用来形容长度和宽度, 常用的API如下:
void setWidth(int width)
void setHeight(int height);
int width() const; // 得到宽度
int &rwidth(); // 得到宽度的引用
int height() const; // 得到高度
int &rheight(); // 得到高度的引用
void transpose(); // 交换高度和宽度的值
QSize transposed() const; // 交换高度和宽度的值, 返回交换之后的尺寸信息
//返回一个大小,宽为当前大小与other的最小值,高为当前大小与other的最小值
QSize boundedTo(const QSize& oterSize)
//返回一个大小,宽为当前大小与other的最大值,高为当前大小与other的最大值
QSize expandedTo(const QSize &otherSize) const
/*
根据指定的模式,按给定的宽度和高度缩放矩形:
如果mode为Qt::IgnoreAspectRatio,则大小设置为(width, height)。
如果mode为Qt::KeepAspectRatio,当前大小将在内部缩放到一个尽可能大的矩形(宽度,高度),保持高宽比。
如果mode是Qt::KeepAspectRatioByExpanding,当前大小被缩放到一个矩形,尽可能小的外部(宽度,高度),保持长宽比。
*/
void scale(int width, int height, Qt::AspectRatioMode mode)
void scale(const QSize &size, Qt::AspectRatioMode mode)
QSize scaled(int width, int height, Qt::AspectRatioMode mode) const
QSize scaled(const QSize &s, Qt::AspectRatioMode mode) const
// 进行算法运算: 加减乘除
QSize &operator*=(qreal factor);
QSize &operator+=(const QSize &size);
QSize &operator-=(const QSize &size);
QSize &operator/=(qreal divisor);
#include
void testSize()
{
QSize size(640,480);
//设置宽度和高度
size.setWidth(1920);
size.setHeight(1080);
size.width();
size.heigth();
qDebug()<
在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;
//调整矩形的尺寸 (左上角和右下角坐标偏移量)
void QRect::adjust(int dx1, int dy1, int dx2, int dy2)
QRect QRect::adjusted(int dx1, int dy1, int dx2, int dy2) const
//测试代码
#include
void testRect()
{
//构造一个矩形
QRect rect(5,5,250,250);
//输出左上角的坐标
qDebug()<
// 构造函数
QDate::QDate();
QDate::QDate(int y, int m, int d); //年 月 日
// 公共成员函数
// 重新设置日期对象中的日期
bool QDate::setDate(int year, int month, int day);
// 给日期对象添加 ndays 天
QDate QDate::addDays(qint64 ndays) const;
// 给日期对象添加 nmonths 月
QDate QDate::addMonths(int nmonths) const;
// 给日期对象添加 nyears 月
QDate QDate::addYears(int nyears) const;
// 得到日期对象中的年/月/日
int QDate::year() const;
int QDate::month() const;
int QDate::day() const;
void QDate::getDate(int *year, int *month, int *day) const;
/*日期对象格式化
d - 没有前导零的日子 (1 to 31)
dd - 前导为0的日子 (01 to 31)
ddd - 显示(缩写) 周一、周二、周三、周四、周五、周六、周日
dddd - 显示(完整) 星期一、星期二、星期三、星期四、星期五、星期六、星期日
M - 没有前导零的月份(1到12) 在年月日中只有月份是大写 小写m用来表示其他东西
MM - 前导零的月份(01到12)
MMM - 缩写 1月、2月、3月...
MMMM - 完整 一月、二月、三月...
yy - 两个数字的年 (00 to 99)
yyyy - 以四位数表示的年份
*/
QString QDate::toString(const QString &format) const;
// 操作符重载 ==> 日期比较
bool QDate::operator!=(const QDate &d) const;
bool QDate::operator<(const QDate &d) const;
bool QDate::operator<=(const QDate &d) const;
bool QDate::operator==(const QDate &d) const;
bool QDate::operator>(const QDate &d) const;
bool QDate::operator>=(const QDate &d) const;
// 静态函数 -> 得到本地的当前日期
[static] QDate QDate::currentDate();
//测试代码
#include
void testDate()
{
//构造一个日期对象
QDate date(2021,3,4);
qDebug()<一周的的第几天
qDebug()<
// 构造函数
QTime::QTime(); //时 分 秒 毫秒
/*
h ==> must be in the range 0 to 23
m and s ==> must be in the range 0 to 59
ms ==> must be in the range 0 to 999
*/
QTime::QTime(int h, int m, int s = 0, int ms = 0);
// 公共成员函数
// Returns true if the set time is valid; otherwise returns false.
bool QTime::setHMS(int h, int m, int s, int ms = 0);
QTime QTime::addSecs(int s) const;
QTime QTime::addMSecs(int ms) const;
// 示例代码
QTime n(14, 0, 0); // n == 14:00:00
QTime t;
t = n.addSecs(70); // t == 14:01:10
t = n.addSecs(-70); // t == 13:58:50
t = n.addSecs(10 * 60 * 60 + 5); // t == 00:00:05
t = n.addSecs(-15 * 60 * 60); // t == 23:00:00
// 从时间对象中取出 时/分/秒/毫秒
// Returns the hour part (0 to 23) of the time. Returns -1 if the time is invalid.
int QTime::hour() const;
// Returns the minute part (0 to 59) of the time. Returns -1 if the time is invalid.
int QTime::minute() const;
// Returns the second part (0 to 59) of the time. Returns -1 if the time is invalid.
int QTime::second() const;
// Returns the millisecond part (0 to 999) of the time. Returns -1 if the time is invalid.
int QTime::msec() const;
// 时间格式化
/*
-- 时 如果是AM/PM显示,0 ~ 23或1 ~ 12
h ==> The hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)
hh ==> The hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)\
0到23,即使有AM/PM显示
H ==> The hour without a leading zero (0 to 23, even with AM/PM display)
HH ==> The hour with a leading zero (00 to 23, even with AM/PM display)
-- 分
m ==> The minute without a leading zero (0 to 59)
mm ==> The minute with a leading zero (00 to 59)
-- 秒
s ==> The whole second, without any leading zero (0 to 59)
ss ==> The whole second, with a leading zero where applicable (00 to 59)
-- 毫秒
zzz ==> The fractional part of the second, to millisecond precision,
including trailing zeroes where applicable (000 to 999).
-- 上午或者下午
AP or A ==> 使用AM/PM(大写) 描述上下午, 中文系统显示汉字
ap or a ==> 使用am/pm(小写) 描述上下午, 中文系统显示汉字
*/
QString QTime::toString(const QString &format) const;
// 操作符重载 ==> 时间比较
bool QTime::operator!=(const QTime &t) const;
bool QTime::operator<(const QTime &t) const;
bool QTime::operator<=(const QTime &t) const;
bool QTime::operator==(const QTime &t) const;
bool QTime::operator>(const QTime &t) const;
bool QTime::operator>=(const QTime &t) const;
// 静态函数 -> 得到当前时间
[static] QTime QTime::currentTime();
//测试代码
#include
void testTime()
{
//获取当前时间
QTime curTime = QTime::currentTime();
qDebug()<
QTime 的经时计时器已经过时了,推荐使用 QElapsedTimer
//QTime已废弃的函数
// 开始计时
void QTime::start();
// 计时结束
int QTime::elapsed() const;
// 重新计时
int QTime::restart();
// 推荐使用的API函数
// QElapsedTimer 类
void QElapsedTimer::start();
qint64 QElapsedTimer::restart();
qint64 QElapsedTimer::elapsed() const;
主要的使用方法就是测量一个操作耗时多久,例子如下:
#include
QElapsedTimer elapse;
elapse.start();
//经过计时器可以用来计算某段代码,执行用了多长时间
for(int i = 0;i<1000000;i++);
elapse.restart(); //重新开始计时
qDebug()<
// 构造函数
QDateTime::QDateTime(); //既有日期也有时间
QDateTime::QDateTime(const QDate &date, const QTime &time, Qt::TimeSpec spec = Qt::LocalTime);
// 公共成员函数
// 设置日期
void QDateTime::setDate(const QDate &date);
// 设置时间
void QDateTime::setTime(const QTime &time);
// 给当前日期对象追加 年/月/日/秒/毫秒, 参数可以是负数
QDateTime QDateTime::addYears(int nyears) const;
QDateTime QDateTime::addMonths(int nmonths) const;
QDateTime QDateTime::addDays(qint64 ndays) const;
QDateTime QDateTime::addSecs(qint64 s) const;
QDateTime QDateTime::addMSecs(qint64 msecs) const;
// 得到对象中的日期
QDate QDateTime::date() const;
// 得到对象中的时间
QTime QDateTime::time() const;
// 日期和时间格式, 格式字符参考QDate 和 QTime 类的 toString() 函数
QString QDateTime::toString(const QString &format) const;
// 操作符重载 ==> 日期时间对象的比较
bool QDateTime::operator!=(const QDateTime &other) const;
bool QDateTime::operator<(const QDateTime &other) const;
bool QDateTime::operator<=(const QDateTime &other) const;
bool QDateTime::operator==(const QDateTime &other) const;
bool QDateTime::operator>(const QDateTime &other) const;
bool QDateTime::operator>=(const QDateTime &other) const;
// 静态函数
// 得到当前时区的日期和时间(本地设置的时区对应的日期和时间)
[static] QDateTime QDateTime::currentDateTime();
#include
void testDateTime()
{
//获取当前时间
QDateTime dateTime = QDateTime::currentDateTime();
qDebug()<
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的通用算法一起使用
//测试代码
#include
void testIterator()
{
QList list;
//通过初始化参数列表添加数据
QList list = {1,2,3,4,5};
//通过流的方式添加数据
list<<6<<7<<8<<9;
//通过函数添加数据
list.append(88);
list.prepend(11);
//在2前面的位置添加44
list.insert(2,44);
//遍历
//java风格
QListIterator it(list);
while (it.hasNext()) //有下一个就获取下一个
{
std::out<::const_iterator*/auto it = list.constBegin(),it!=constEnd();it++)
{
std::cout<<*it<<" ";
}
//c++11 给我们提供了一个基于范围的for循环,更简单-->装的是什么类型就定义什么类型,让值到list中去拿 并输出
for(auto/*int*/ val : list)
{
std::cout<
QList模板提供了一个列表,实际上是一个指针数组,当项目数小于1000时,可以实现快速的插入删除操作
QList
使用概述:
QVector 应该是您的默认首选。 QVector
然而,QList 在整个 Qt API 被大量使用,用于传递参数和返回值。 使用 QList可以很方便的与这些 API 进行交互。
如果您需要一个真正的链表,它保证常量时间内插入列表,并且使用迭代器指向项而不是索引,那么请使用QLinkedList。
公有函数
添加数据
//支持流插入
QList()<<1<<2<<3<<4<<5;
void append(const T &value)
void append(const QList &value)
void insert(int i, const T &value)
QList::iterator insert(QList::iterator before, const T &value)
void prepend(const T &value)
void push_back(const T &value)
void push_front(const T &value)
获取数据
T &back()
const T &back() const
T &first()
const T &first() const
T &front()
const T &front() const
T &last()
const T &last() const
const T &constFirst() const
const T &constLast() const
//返回下标为i的元素,如果下标i不合法,则返回defaultValue
T value(int i) const
T value(int i, const T &defaultValue) const
const T &at(int i) const
T &operator[](int i)
const T &operator[](int i) const
//返回从位置pos开始的子列表。如果length为-1(默认),则包含pos中的所有元素;
QList mid(int pos, int length = -1) const
删除数据
void clear()
QList::iterator erase(QList::iterator pos)
QList::iterator erase(QList::iterator begin, QList::iterator end)
void pop_back()
void pop_front()
//删除元素
int removeAll(const T &value)
bool removeOne(const T &value)
void removeAt(int i)
void removeFirst()
void removeLast()
//删除元素并返回它,如果不使用返回值,removeAt()会更高效
T takeAt(int i)
T takeFirst()
T takeLast()
查找/替换
//返回value在列表中第一次出现的索引位置,从索引位置from向前搜索。 如果没有匹配的项,则返回-1。
int indexOf(const T &value, int from = 0) const
//返回value在列表中最后一次出现的索引位置,从索引位置from反向搜索。如果from是-1(默认值),则搜索从最后一项开始。如果没有匹配的项,则返回-1。
int lastIndexOf(const T &value, int from = -1) const
//将索引位置为i的项替换为value
void replace(int i, const T &value)
//如果列表中包含值的出现,则返回true; 否则返回false。 该函数要求值类型具有operator==()的实现。
bool contains(const T &value) const
交换/移动
//将索引位置from到索引位置to
//["A", "B", "C", "D", "E", "F"] move(1,4)-> ["A", "C", "D", "E", "B", "F"]
void move(int from, int to)
void swap(QList &other)
//交换下标i j的元素
void swapItemsAt(int i, int j)
判断函数
int count(const T &value) const
int count() const
int size() const
int length() const
bool empty() const
bool isEmpty() const
//如果列表第一项/后一项等于value,则返回true; 否则返回false。
bool startsWith(const T &value) const
bool endsWith(const T &value) const
//预分配空间大小
void reserve(int alloc)
和其他容器互转
QSet toSet() const
std::list toStdList() const
QVector toVector() const
[static] QList fromSet(const QSet &set)
[static] QList fromStdList(const std::list &list)
[static] QList fromVector(const QVector &vector)
QStringList 继承自 QList
判断是否包含某个字符串 → 全匹配
bool contains(const QString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
bool contains(QLatin1String str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
bool contains(QStringView str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
过滤:返回包含子字符串 str 的所有字符串的列表 → 部分匹配,只要包含即可
QStringList filter(const QString &str, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
QStringList filter(QStringView str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
QStringList filter(const QRegExp &rx) const
QStringList filter(const QRegularExpression &re) const
查找
//从左往右查找 从哪里开始查找 | 默认从0开始查
int indexOf(const QRegExp &rx, int from = 0) const
int indexOf(QStringView str, int from = 0) const
int indexOf(QLatin1String str, int from = 0) const
int indexOf(QRegExp &rx, int from = 0) const
int indexOf(const QRegularExpression &re, int from = 0) const
//从右往左查找 正则表达式
int lastIndexOf(const QRegExp &rx, int from = -1) const
int lastIndexOf(QStringView str, int from = -1) const
int lastIndexOf(QLatin1String str, int from = -1) const
int lastIndexOf(QRegExp &rx, int from = -1) const
int lastIndexOf(const QRegularExpression &re, int from = -1) const
连接:将QStringList中的所有字符串连接为一个字符串,每个元素由给定的分隔符(可以是空串)分隔
//支持流插入 << 返回的是一个字符串
QString join(const QString &separator) const
QString join(QStringView separator) const
QString join(QLatin1String separator) const
QString join(QChar separator) const
删除:从QStringList中删除重复的元素。 返回已删除元素的数量
int removeDuplicates()
替换:返回一个字符串列表,其中每个字符串在找到before文本时都将before文本替换为after文本
QStringList &replaceInStrings(const QString &before, const QString &after, Qt::CaseSensitivity cs = Qt::CaseSensitive)
QStringList &replaceInStrings(QStringView before, QStringView after, Qt::CaseSensitivity cs = Qt::CaseSensitive)
QStringList &replaceInStrings(const QString &before, QStringView after, Qt::CaseSensitivity cs = Qt::CaseSensitive)
QStringList &replaceInStrings(QStringView before, const QString &after, Qt::CaseSensitivity cs = Qt::CaseSensitive)
QStringList &replaceInStrings(const QRegExp &rx, const QString &after)
QStringList &replaceInStrings(const QRegularExpression &re, const QString &after)
排序:升序
void sort(Qt::CaseSensitivity cs = Qt::CaseSensitive)
//测试代码
#include
void testStringList()
{
//构造一个字符串列表 用于存储大量的字符串
QStringList names = {"大白","大白","小白","大黑","小黑"};
//重载了流的方式
names<<",.?!"<<"nullptr"<<"young"<<"loading";
qDebug()<部分匹配
auto lists = names.filter("g"); //返回值类型:QStringList 需要接收一下
for(auto str : lists)
{
std::cout<返回下标的位置
int pos = names.indexOf("小白");
qDebug()<按升序排列|区分大小写
names.sort();
qDebug()<按降序排列|比较准则
std::sort(names.begin(),names.end(),[](QString& s1,QString& s2){ return s1>s2; });
qDebug()<