如何在QT中绘制点

How do you plot points in QT?

本文关键字:绘制 QT      更新时间:2023-10-16

我正在用QT在c++中编写应用程序,其中您有n个点并计算此凸壳。然而,一旦这是计算我不知道如何绘制点和绘制船体的边界。制作菜单按钮等是很简单的,但我不确定我知道做这个的工具。

你是怎么做到的?

图形视图,addEllipse

QGraphicsView做2D绘图非常好,并为您提供了许多如何显示它的选项。它不像qwt那样适合绘制科学数据,但只是为了显示一堆点,或几何或动画和许多其他东西,它工作得很好。参见Qt的图形视图框架文档和示例。

这是如何在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的描述。你可以缩放视图来显示更多或更少的场景它可以放滚动条进去。我回答了一个相关的问题,在那里我展示了更多关于你可以用QGraphicsView做什么,你可能也想看看。

您可以创建一个从QWidget派生的自定义类,其中覆盖void paintEvent(QPaintEvent* event)方法。在这种情况下,你把点放入某种点列表,std::vector<QPoint>QList<QPoint>,然后用折线方法绘制它。例如:

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()));
}

有一个图表库qwt,它提供了用于绘制图表的Qt小部件。

Qt Charts, QML或GraphicsView

这将是我的QGraphics视图示例的更新,但它有点长,这确实是一个完全不同的方法来回答这个问题。

Qt Charts (LGPL自2016年起可用)是一个很好的方法,无需第三方库。

  • https://doc.qt.io/qt-5/qtcharts-linechart-example.html
  • http://blog.qt。io/博客/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.html
https://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);

希望对你有帮助。