在Qt中绘制曲线,可以使用QPainter类和其提供的drawCurve()函数。具体步骤如下:
创建一个QWidget或QGraphicsView,并重写其paintEvent(QPaintEvent *event)函数。
在paintEvent函数中,创建一个QPainter对象,并设置画笔和画刷等属性。
使用drawCurve()函数绘制曲线。该函数需要传入一个QPointF类型的数组作为参数,表示曲线上的点集。例如:
void MyWidget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setPen(Qt::red);
QPointF points[] = { QPointF(10, 10), QPointF(50, 100), QPointF(150, 50) };
painter.drawCurve(points, 3);
}
以上代码会在MyWidget中绘制一条红色曲线,经过三个点:(10, 10),(50, 100),(150, 50)。
- 如果需要绘制更复杂的曲线,可以使用Bezier曲线或B样条曲线算法。这些算法通常需要自己实现。
完整示例代码如下:
#include <QtWidgets>
class MyWidget : public QWidget
{
public:
MyWidget(QWidget *parent = nullptr) : QWidget(parent) {}
protected:
void paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setPen(Qt::red);
// 绘制一条简单的曲线
QPointF points[] = { QPointF(10, 10), QPointF(50, 100), QPointF(150, 50) };
painter.drawCurve(points, 3);
// 绘制一条Bezier曲线
QPointF bezierPoints[] = { QPointF(10, 200), QPointF(50, 300), QPointF(150, 250), QPointF(200, 350) };
painter.setPen(Qt::blue);
for (qreal t = 0; t < 1; t += 0.01)
{
QPointF p = computeBezierPoint(bezierPoints, sizeof(bezierPoints)/sizeof(QPointF), t);
painter.drawPoint(p);
}
}
// 计算Bezier曲线上的点
QPointF computeBezierPoint(const QPointF *points, int count, qreal t)
{
if (count == 1)
return points[0];
// 计算插值点
QVector<QPointF> interpolatedPoints;
for (int i = 0; i < count - 1; i++)
interpolatedPoints.append((1-t)*points[i] + t*points[i+1]);
return computeBezierPoint(interpolatedPoints.data(), count-1, t);
}
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MyWidget widget;
widget.show();
return app.exec();
}