你如何在 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 文档中对 QGraphicsScene
和 QGraphicsView
的描述。您可以缩放视图以显示或多或少的场景,并且可以放入滚动条。我回答了相关的question,我在其中展示了更多关于您可以使用QGraphicsView
做什么的信息,您可能还想看看.
【讨论】:
【参考方案2】:您可以创建一个派生自 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()));
【讨论】:
我试过了,但是编译错误:'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.htmlhttps://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 中绘制点?的主要内容,如果未能解决你的问题,请参考以下文章