我正在使用QT在C ++中编写一个应用程序,你有n个点并计算它的凸包。但是,一旦计算出来,我就不知道如何绘制点并绘制船体的边界。制作菜单按钮等很简单,但我不确定我知道这样做的工具。
你是怎么做到的?
答案 0 :(得分:11)
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文档中QGraphicsScene
和QGraphicsView
的说明。您可以缩放视图以显示更多或更少的场景,并且可以放置滚动条。我回答了相关的question,其中我详细介绍了您可以使用QGraphicsView
做些什么看看。
答案 1 :(得分:5)
您可以创建一个源自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()));
}
答案 2 :(得分:2)
有一个图表库qwt,它提供Qt小部件 - 用于制作图表。
答案 3 :(得分:0)
这将是对我的QGraphics View示例的更新,但是花了很长时间,而且确实是一种完全不同的回答问题的方法。
Qt图表(自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);
希望有帮助。