【QT】QPointF、QRectF、QPolygonF 介绍

QPointF 确实存在于 Qt 框架中,它是一个类,用于表示二维空间中的一个点,其中包含了浮点精度的 x 和 y 坐标。

主要特点和用途

  1. 高精度坐标QPointF 使用 double 类型来存储 x 和 y 坐标,这提供了比 QPoint(后者存储整数坐标)更高的精度。这在需要精确定位或处理图形和界面元素时特别有用,例如在绘图、图像处理或任何需要几何计算的应用中。

  2. 数学运算支持QPointF 提供了一系列便利的数学运算,如加法、减法、缩放(乘以标量)等,使得处理图形和动画时可以更加方便。例如,你可以轻松地计算两个点之间的距离或将一个点向特定方向移动一定的距离。

  3. 与其他 Qt 类型交互QPointF 可以与 Qt 的其他图形类(如 QRectF, QPolygonF 等)一起使用,使其在处理复杂的图形界面或动画时非常有用。它也常用于图表和绘图,特别是在需要非整数位置数据的情况下。

示例代码

演示创建点对象和进行基本的运算:

#include <QPointF>
#include <QDebug>

int main() {
    QPointF point1(1.5, 2.5);
    QPointF point2(3.0, 4.0);

    // 点的加法
    QPointF sum = point1 + point2;
    qDebug() << "Sum:" << sum;

    // 点的减法
    QPointF difference = point2 - point1;
    qDebug() << "Difference:" << difference;

    // 缩放点(乘以标量)
    QPointF scaledPoint = point1 * 2.0;
    qDebug() << "Scaled Point:" << scaledPoint;

    // 计算两点之间的距离
    double distance = sqrt(pow(point2.x() - point1.x(), 2) + pow(point2.y() - point1.y(), 2));
    qDebug() << "Distance between point1 and point2:" << distance;

    return 0;
}

QPointF 被用来创建点,进行点之间的加法和减法,以及点的缩放。此外,还计算了两点之间的距离,展示了如何在实际应用中使用 QPointF 来进行基本的几何计算。

总的来说,QPointF 是处理二维图形程序中的一个非常实用的工具,它的浮点精度和数学运算支持使其在许多需要精确坐标和复杂几何操作的场合中非常有用。

sqrt(pow())

在您提到的这个函数中:

sqrt(pow(point2.x() - point1.x(), 2) + pow(point2.y() - point1.y(), 2));

这个函数用来计算两个点 point1point2 之间的欧几里得距离。这是一个在二维空间中非常常用的几何运算,用于测量两点之间的“直线”距离。

分析:
  • pow 函数pow(a, b) 函数用来计算 ab 次幂。在这里,pow(point2.x() - point1.x(), 2)pow(point2.y() - point1.y(), 2) 分别计算 point2point1 在 x 轴和 y 轴方向上差值的平方。这是计算两点间距离的基础步骤,其中,差值表示两点在各自轴上的位置差异。

  • 数字 2:这里的 2 表示平方,是在计算差值的平方,以便用在欧几里得距离公式中。平方的目的是确保距离总是正数,并且按照几何距离的定义进行计算。

  • sqrt 函数sqrt(x) 函数用来计算 x 的平方根。在这个表达式中,它用来从两点间的 x 和 y 方向的平方和(即平方差的和)中计算出实际的直线距离。

Qt 框架中包含 QRectFQPolygonF 这两个类。这些类用于二维图形编程,特别是在涉及图形和用户界面设计时非常有用。

QRectF

QRectF 表示二维平面上的矩形,使用浮点数来定义位置和尺寸。它是 QRect 的浮点版本,提供更高的精度。QRectF 主要用于绘图操作,特别是在需要精确控制矩形区域的情况下,例如在图形渲染、图像处理和窗口布局中。

主要属性和方法包括:

  • left(), right(), top(), bottom():返回矩形的左、右、上、下边界。
  • width(), height():返回矩形的宽度和高度。
  • moveTo(), translate():移动矩形到新的位置或在当前位置上进行平移。
  • contains(): 检查一个点或另一个矩形是否完全位于此矩形内。
  • intersected(), united(): 分别计算与另一个矩形的交集和并集矩形。

QPolygonF

QPolygonF 代表一个多边形,其顶点坐标是浮点数。这使得 QPolygonF 非常适合用于需要高精度的图形计算,如复杂的图形绘制、图形变换等场景。

主要功能和应用:

  • 存储和操作多边形的顶点。
  • 提供便捷的方法来进行多边形的平移、缩放和旋转。
  • containsPoint() 方法用于判断一个点是否在多边形内部,常用于碰撞检测和区域测试。
  • 可以与 QPainter 对象一起使用,直接在图形视图或任何支持绘图的 Qt 小部件上绘制多边形。

这些类通过提供丰富的方法来简化图形处理程序的编写,从基本的几何计算到与图形视图的集成都非常有用。例如,在使用 QPainter 进行自定义绘图时,QRectF 可用于指定绘图区域的精确位置和大小,而 QPolygonF 则可以用来绘制或检测复杂的图形界面元素。

  • 7
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt中,可以使用QGraphicsView框架来实现鼠标绘图。以下是一个简单的示例,演示如何使用QGraphicsView框架来实现鼠标绘图: 1. 创建一个Qt Widgets应用程序,并将主窗口设置为QMainWindow。 2. 在主窗口中添加一个QGraphicsView部件,并设置其大小和位置。 3. 在主窗口中添加一个QGraphicsScene对象,并将其设置为QGraphicsView部件的场景。 4. 在主窗口中添加一个自定义的GraphicsItem对象,并将其添加到QGraphicsScene中。 5. 在自定义的GraphicsItem对象中,重写mousePressEvent和mouseMoveEvent事件处理程序,以捕获鼠标事件,并在场景中绘制图形。 以下是示例代码: mainwindow.h文件: ``` #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QGraphicsScene> #include "customgraphicsitem.h" namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private: Ui::MainWindow *ui; QGraphicsScene *scene; CustomGraphicsItem *item; }; #endif // MAINWINDOW_H ``` mainwindow.cpp文件: ``` #include "mainwindow.h" #include "ui_mainwindow.h" #include <QGraphicsView> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); // 创建场景和视图 scene = new QGraphicsScene(this); QGraphicsView *view = new QGraphicsView(scene, this); view->setGeometry(10, 10, 400, 400); // 创建自定义的GraphicsItem对象并添加到场景中 item = new CustomGraphicsItem(); scene->addItem(item); } MainWindow::~MainWindow() { delete ui; } ``` customgraphicsitem.h文件: ``` #ifndef CUSTOMGRAPHICSITEM_H #define CUSTOMGRAPHICSITEM_H #include <QGraphicsItem> class CustomGraphicsItem : public QGraphicsItem { public: CustomGraphicsItem(); QRectF boundingRect() const; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); protected: void mousePressEvent(QGraphicsSceneMouseEvent *event); void mouseMoveEvent(QGraphicsSceneMouseEvent *event); private: QList<QPointF> points; }; #endif // CUSTOMGRAPHICSITEM_H ``` customgraphicsitem.cpp文件: ``` #include "customgraphicsitem.h" #include <QPainter> #include <QGraphicsSceneMouseEvent> CustomGraphicsItem::CustomGraphicsItem() { // 设置图形项的矩形大小 setRect(0, 0, 100, 100); } QRectF CustomGraphicsItem::boundingRect() const { return rect(); } void CustomGraphicsItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { // 绘制多边形 QPolygonF polygon(points); painter->drawPolygon(polygon); } void CustomGraphicsItem::mousePressEvent(QGraphicsSceneMouseEvent *event) { // 添加一个新点 QPointF point = event->pos(); points.append(point); // 重新绘制 update(); } void CustomGraphicsItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { // 添加一个新点 QPointF point = event->pos(); points.append(point); // 重新绘制 update(); } ``` 运行应用程序后,单击并拖动鼠标,即可在场景中绘制多边形。每次单击鼠标时,都会在多边形中添加一个新点。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值