你如何在 QT 中绘制点?

Posted

技术标签:

【中文标题】你如何在 QT 中绘制点?【英文标题】:How do you plot points in QT? 【发布时间】:2011-10-17 22:39:39 【问题描述】:

我正在用 QT 用 C++ 编写一个应用程序,你有 n 个点并计算它的凸包。但是,一旦计算出来,我就不知道如何绘制点并绘制船体的边界。制作菜单按钮等很简单,但我不确定我是否知道执行此操作的工具。

你是怎么做到的?

【问题讨论】:

可能重复:在 Qt 中绘制绘图 (***.com/questions/1491362/making-plot-in-qt) 【参考方案1】:

图形视图,addEllipse

QGraphicsView 非常擅长 2D 绘图,并为您提供了许多显示方式的选项。它不像qwt 那样专为绘制科学数据而量身定制,而只是为了显示一堆点、几何图形或动画以及许多其他东西,它工作得很好。请参阅 Qt 的 Graphics View Framework 文档和示例。

这是您如何在 QGraphicsScene 中绘制一堆点并将其显示在 QGraphicsView 中。

#include <QtGui/QApplication>

#include <QGraphicsView>
#include <QGraphicsScene>
#include <QPointF>
#include <QVector>

int main(int argc, char *argv[])

    QApplication a(argc, argv);
    QVector <QPointF> points;

    // Fill in points with n number of points
    for(int i = 0; i< 100; i++)
       points.append(QPointF(i*5, i*5));

    // Create a view, put a scene in it and add tiny circles
    // in the scene
    QGraphicsView * view = new QGraphicsView();
    QGraphicsScene * scene = new QGraphicsScene();
    view->setScene(scene);

    for(int i = 0; i< points.size(); i++)
        scene->addEllipse(points[i].x(), points[i].y(), 1, 1);

    // Show the view
    view->show();

    // or add the view to the layout inside another widget

    return a.exec();

注意:您可能需要在视图上调用setSceneRect,否则场景将自动居中。阅读 Qt 文档中对 QGraphicsSceneQGraphicsView 的描述。您可以缩放视图以显示或多或少的场景,并且可以放入滚动条。我回答了相关的question,我在其中展示了更多关于您可以使用QGraphicsView 做什么的信息,您可能还想看看.

【讨论】:

【参考方案2】:

您可以创建一个派生自 QWidget 的自定义类,并在其中覆盖 void paintEvent(QPaintEvent* event) 方法。在这种情况下,您将点放入某种点列表中,std::vector&lt;QPoint&gt;QList&lt;QPoint&gt;,然后使用折线方法对其进行绘制。例如:

void Foo::paintEvent(QPaintEvent* event)

  QPainter painter(this);
  std::vector<QPoint> points;
  // Fill points with the points
  painter.drawPolyLine(points.data(), static_cast<int>(points.size()));

【讨论】:

我试过了,但是编译错误:'QPainterpainter'有初始化程序但类型不完整' 好吧,@Ohad 可能早已不复存在,但对于其他路人来说,“不完整类型”错误通常表明您使用的 Qt 对象没有包含适当的标头(即添加 @ 987654326@ 到文件顶部)。顺便说一句,似乎在某处有一个标头提供所有 Qt 类的前向声明(即class QPainter; 等),使编译器认识到存在这样一个类,但对它一无所知并导致在不熟悉的错误消息中。【参考方案3】:

有一个图表库,qwt,它提供 Qt 小部件用于 - erm - 图表目的。

【讨论】:

确实,我注意到了这一点,但我希望只使用 QT 来实现,以便与一些同行兼容。 您可以将 qwt 直接编译到您的项目中,它是基于 Qt 的。我看不出这会如何影响兼容性。【参考方案4】:

Qt 图表、QML 或 GraphicsView

这将是对我的 QGraphics View 示例的更新,但它有点长,而且它确实是一种完全不同的回答问题的方法。

Qt Charts(LGPL 自 2016 年起提供)是一种无需第三方库即可实现此目的的好方法。

https://doc.qt.io/qt-5/qtcharts-linechart-example.html http://blog.qt.io/blog/2016/01/18/qt-charts-2-1-0-release/ https://doc.qt.io/qt-5/qtcharts-overview.html

https://doc.qt.io/qt-5/qlineseries.html#QLineSeries

QLineSeries* series = new QLineSeries();
series->append(0, 6);
series->append(2, 4);
...
chart->addSeries(series);

对于凸包示例,您可能需要QAreaSeries 图表。

https://doc.qt.io/qt-5/qtcharts-areachart-example.htmlhttps://doc.qt.io/qt-5/qareaseries.html

QLineSeries *series0 = new QLineSeries();
QLineSeries *series1 = new QLineSeries();
*series0 << QPointF(1, 5) << QPointF(3, 7) << QPointF(7, 6) << QPointF(9, 7) << QPointF(12, 6)
         << QPointF(16, 7) << QPointF(18, 5);
*series1 << QPointF(1, 3) << QPointF(3, 4) << QPointF(7, 3) << QPointF(8, 2) << QPointF(12, 3)
         << QPointF(16, 4) << QPointF(18, 3);
QAreaSeries *series = new QAreaSeries(series0, series1);

希望对您有所帮助。

【讨论】:

以上是关于你如何在 QT 中绘制点?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Qt 中绘制曲线? [复制]

如何在 QT 中获取按钮的绘制事件

Qt画图以及坐标问题

如何使用 Qpainter 在 Qt 中绘制棋盘

如何在原生 C/C++ 中使用 Qt 绘制二维码

如何在 Matplotlib 中绘制模糊点