基本信息
时间:2024.08.27
QT版本:5.14.2
平台:window 10
程序简介:
1.本工程是Qt基础类和基本数据类型专题例程,QPoint坐标类
2.本工程对照着Qt的帮助文档,把每个属性和成员函数测试了一遍
3.本工程,为学习Qt的其它类,其它帮助文档中的内容,留下一个模版
程序说明:
1.打印每个成员函数的帮助信息
2.每个按钮,验证一个成员函数
3.pro文件,添置CONFIG += console,输出重定向到控制台
4.toCGPoint、QDataStream,这2项相关,暂未测试验证
QPoint类帮助中的2种操作符重载
在查阅QPoint类的帮助文档中,注意到,同样的操作符重载,有2种,一种是返回的引用,一种是返回的副本。
这也是我在查阅完文档之后,决定把测试程序的按钮把引用和副本标出来的原因,否则不必这么麻烦。
关于标准C++的操作符重载,不是这里的重点,不过多赘述,请参考其它资料。
操作符重载,最通俗易懂的理解,就是“可以将类对象像基本数据类型一样,进行+ - * / 的运算”。
举例:
int a=1;
intb=2;
//这里的+的2个操作数是int类型的
int sum=a+b;
加法操作符重载之后,可以进行类对象的加法,举例如下:
Object obj1;
Object obj2;
Object objSum;
//这里的+的2个操作数不是基本数据类型,是类对象
objSum=obj1+obj2;
Qt的帮助文档中,关于加法操作符的重载,有如下2段,请注意看!
第1段,这里返回的是引用
QPoint &QPoint::operator+=(const QPoint &point)
Adds the given point to this point and returns a reference to this point. For example:
将给定点添加到此点,并返回对此点的引用。例如:
QPointp( 3, 7);
QPoint q(-1, 4);
p += q; // p becomes (2, 11)
See also operator-=().
第2段,这里返回的是副本,即对象,即复制了一个对象,这是要开辟内存,占用内存的。
const QPointoperator+(const QPoint&p1, const QPoint&p2)
Returns a QPointobject that is the sum of the given points, p1 and p2; each component is added separately.
返回一个QPoint对象,它是给定点p1和p2的总和;每个组件都是单独添加的。
See also QPoint::operator+=().
【题外话】
这里不吐不快。非常感谢年轻时遭受的白眼与轻蔑,没有这些,想必前进的动力也会少了很多。
记得我刚毕业的时候,刚踏入社会走向工作时,曾经在闲聊时,向项目合作中来自上海的2个同事,请教关于内存的重要性,问了句“为什么行业内的前辈都在强调内存的重要性,网上写文章都说,调试的时候要注意看内存,内存怎么看啊?”
这2个来自上海的同事,一男一女,男的是博士,女的是老板的关系户,这2个人都摇头和我说“不知道,不会”。
我当时一脸疑惑,不能吧~!他们工作这么多年,怎么可能不会啊!这水平也一般般啊!
现在回再回想起来,人家怎么可能是水平一般般,怎么可能是不会,只不过,当前的我,还不具备和人家对话的能力和条件罢了,就算人家花时候给我讲一讲,我大概率也听不懂,胡乱还会再问一堆问题,人家就算花时间给我讲了,我可能还是一知半解。人家只不过是没必要给我讲罢了。
还好,本人比较有自知知明,没有过多打扰。这些年,这个瞬间也没有忘记。也激励自己不断的学习、积累、前进、提高。
重要成员函数举例6个
这里,最基本的获取坐标,point.x()和point.y()等,rx(),ry()等不再详细介绍、不再贴代码了。
工程上传至CSDN,供同一时期学习QT的网友参考,可自行查看。
这里仅介绍新手小白可能值得一看的内容贴出来。
程序全貌
这个练习程序,是对照着QT中QPoint的帮助文档,一个一个测试形成的。全貌如下图:
bool QPoint::isNull() const
程序运行效果如下:
qDebug()<<"帮助:如果x和y坐标都设置为0,则返回true,否则返回false。";
QPoint p1(0,0);
QPoint p2(300,200);
qDebug()<<"p1的原坐标是:"<<p1.x()<<","<<p1.y();
qDebug()<<"p2的原坐标是:"<<p2.x()<<","<<p2.y();
bool result1=p1.isNull();
bool result2=p2.isNull();
qDebug()<<"经过bool result1=p1.isNull();运算";
qDebug()<<"经过bool result2=p2.isNull();运算";
qDebug()<<"result1的结果是:"<<result1;
qDebug()<<"result2的结果是:"<<result2;
qDebug()<<"";
qDebug()<<"";
int QPoint::manhattanLength() const
qDebug();
qDebug()<<"帮助:返回x()和y()的绝对值之和,传统上称为向量从原点到点的“曼哈顿长度”。";
QPoint p(30,40);
qDebug()<<"p的坐标是:"<<p.x()<<","<<p.y();
//以下语句需要<QMath>的支持
double trueLength = std::sqrt(std::pow(p.x(), 2) + std::pow(p.y() , 2));
qDebug()<<"经过double trueLength = std::sqrt(std::pow(p.x(), 2) + std::pow(p.y() , 2));运算";
qDebug()<<"p点与原点的真实长度是:"<<trueLength;
qDebug()<<"p点的曼哈顿长度是:"<<p.manhattanLength();
程序运行效果如下:
QPoint &QPoint::operator*=(float factor)
QPoint p1(10,10);
qDebug()<<"";
qDebug()<<"帮助:将该点的坐标乘以给定因子,并返回对该点的引用。";
qDebug()<<"p1的老坐标是:"<<p1.x()<<","<<p1.y();
float pi=3.142;
//p1*=pi;
p1.operator*=(pi);
qDebug()<<"经过p1.operator*=(pi);乘法操作符重载运算";
qDebug()<<"p1的新坐标是:"<<p1.x()<<","<<p1.y()<<"";
qDebug()<<"注意QPoint坐标类,乘法运算符重载时产生的四舍五入问题,必要时使用QPointF";
qDebug()<<"";
qDebug()<<"";
程序运行效果如下:
QPoint &QPoint::operator/=(qreal divisor)
QPoint p1(100,100);
QPoint p2(200,200);
qDebug()<<"帮助:这是一个重载函数。将x和y除以给定的除数,并返回对此点的引用。";
qDebug()<<"p1的老坐标是:"<<p1.x()<<","<<p1.y();
qDebug()<<"p2的老坐标是:"<<p2.x()<<","<<p2.y();
//p1/=10;
//p2/=3;
qreal r1=10;
qreal r2=3;
p1=p1.operator/=(r1);
p2/=r2;
qDebug()<<"经过p1=p1.operator/=(r1);除法操作符重载运算";
qDebug()<<"经过p2/=r2;;除法操作符重载运算";
qDebug()<<"p1的新坐标是:"<<p1.x()<<","<<p1.y();
qDebug()<<"p2的新坐标是:"<<p2.x()<<","<<p2.y();
qDebug()<<"注意QPoint类,除法运算符重载的四舍五入问题,必要时使用QPointF";
qDebug()<<"";
qDebug()<<"";
程序运行效果如下:
const QPoint operator+(const QPoint &point)
qDebug()<<"";
qDebug()<<"帮助:返回未修改的点。返回的是const QPoint类型的对象。这个函数是在Qt 5.0中引入的。";
QPoint p(100,100);
qDebug()<<"p的坐标是:"<<p.x()<<","<<p.y();
QPoint q;
q=operator+(p);
qDebug()<<"经过q=operator+(p);加法操作符重载";
qDebug()<<"q的坐标是:"<<q.x()<<","<<q.y()<<"";
qDebug()<<"";
qDebug()<<"";
程序运行效果如下:
本文后续
1.本篇博文,关联QPointF,准备着手再测试验证一下QPointF
2.本篇博文,关联标准C++的操作符重载,看时间情况吧~!如果时间允许,近期再整理一下C++的操作符重载
2024.08.28
于家中