使用Qt绘制正弦函数图形

9
我正在尝试绘制正弦图形的方法。
我的小部件只需要传入一些任意数据点。我必须将这些数据点拟合到正弦线曲线上:

Sin(x)

到目前为止,我已经尝试了几种使用QPainterPath的方法。
  1. QPainterPath::lineTo - 我尝试使用这个函数通过取我的数据点并在它们之间创建许多点来绘制曲线,使得线条实际上会平滑一些。但是我觉得这有点过于计算密集。
  2. QPainterPath::cubicTo - 从RTFM中我了解到,这是最好的方法。唯一的问题是我不确定如何在能够始终以编程方式平滑曲线的位置绘制控制点。我无法使用此函数获得所需的结果。
经过一些搜索,我发现一些论坛帖子正在使用Qwt进行曲线绘制。如果我可以使用Qwt,那就太好了,但由于我只能使用Qt,因此这不是一个选项。
有人有有用的反馈/建议吗?
2个回答

7

我目前正在进行类似的事情,涉及参数均衡器的带宽扫描(长线与多个扫描曲线)。我的做法是(伪样式):

qreal yCoords[GRAPH_WIDTH];
...
QPainter Painter(this);
Painter.setRenderHint(QPainter::Antialiasing, true);
//Painter.setRenderHint(QPainter::HighQualityAntialiasing, true); //opengl specific
for(int xCoord = 0; xCoord < GRAPH_WIDTH; x++)
  Path.lineTo(QPointF(xCoord, yCoord[xCoord]));
...
Painter.drawPath(Path);

调用setRenderHint并使用QPointF(即两个qreal)而不是QPoint(两个int)来绘制线条,使得线条非常平滑。
我们在运行Ubuntu的SBC上使用它,并获得了600x300px图形的重绘时间(包括获取第一组点的所有复杂数学计算)约为80ms。初步测试表明,启用OpenGL渲染可以将其降至约8ms(显然,处理器密集型任务是带有抗锯齿效果的绘图),因此如果您能够实现这一点,我认为这个解决方案将适用于您。

@sjwarner:你好,我正在尝试做类似的事情。在你的第五行(for循环中),你是不是想说path而不是painter - Vahid Nateghi
@VahidNateghi:是的,我就是那个意思。谢谢你指出来 :) - sam-w

3

QCustomPlot是一种免费且易于使用的类,在网上可以找到。对于您正在寻找的内容,它可能更好。


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