如何在QT中绘制点?

6

我正在使用C++和QT编写一个应用程序,其中有n个点,需要计算这些点的凸包。然而,一旦计算完成,我不知道如何绘制这些点并绘制凸包的边界。创建菜单按钮之类的操作很简单,但我不确定如何完成这个任务。

请问如何实现这个功能?


可能是重复的问题:在Qt中制作图表 (https://dev59.com/N3I_5IYBdhLWcg3wMf5_)。 - yasouser
4个回答

12

图形视图,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做的更多内容,您可能也想看一下。


6

您可以创建一个自定义类,继承自QWidget,并重写void paintEvent(QPaintEvent* event)方法。在该方法中,将点放入某种点列表中,可以是std::vector<QPoint>QList<QPoint>,然后使用Polyline方法进行绘制。例如:

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

我尝试了这个,但是出现了编译错误:'QPainter painter'有初始化器但是类型不完整。 - Ohad Cohen
嗯,@Ohad可能已经离开了,但对于其他路过的人,“不完整类型”错误通常表示您正在使用一个Qt对象,而您没有包含适当的头文件(即在文件顶部添加#include <QPainter>)。另外,似乎有一个头文件提供了所有Qt类的前向声明(即class QPainter;之类),使编译器认识到存在这样的类,但不知道更多信息,从而导致出现陌生的错误消息。 - dmckee --- ex-moderator kitten

3

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


我确实注意到了这一点,但是出于与某些同行的兼容性考虑,我希望只使用QT来完成它。 - user189320
2
你可以将qwt编译到你的项目中,它是基于Qt的。我不认为这会影响兼容性。 - Chris

1

Qt Charts、QML或GraphicsView

本来这篇文章是要更新我的QGraphics View示例,但是它变得有点长了,而且这真的是一个完全不同的方法来回答这个问题。

Qt Charts(自2016年起LGPL可用)是一种很好的方法,可以在不需要第三方库的情况下完成此操作。

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

希望有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接