qt 怎么用鼠标连续绘制贝塞尔曲线,用c++
时间: 2023-08-17 15:24:06 浏览: 148
vc++实现贝塞尔曲线的绘制
在 Qt 中,可以使用鼠标事件和 QPainter 绘图类来实现鼠标连续绘制贝塞尔曲线。下面是一个简单的实现示例:
```cpp
#include <QtWidgets>
class BezierWidget : public QWidget
{
public:
BezierWidget(QWidget *parent = 0);
protected:
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void paintEvent(QPaintEvent *event);
private:
QList<QPointF> m_points;
};
BezierWidget::BezierWidget(QWidget *parent)
: QWidget(parent)
{
setMouseTracking(true);
}
void BezierWidget::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
m_points.append(event->pos());
update();
}
}
void BezierWidget::mouseMoveEvent(QMouseEvent *event)
{
if (event->buttons() & Qt::LeftButton) {
m_points.append(event->pos());
update();
}
}
void BezierWidget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
if (m_points.size() < 2) {
return;
}
QPainterPath path(m_points.first());
for (int i = 1; i < m_points.size() - 1; ++i) {
QPointF p1 = m_points[i - 1];
QPointF p2 = m_points[i];
QPointF p3 = (m_points[i] + m_points[i + 1]) / 2;
path.cubicTo(p1, p2, p3);
}
path.lineTo(m_points.last());
painter.drawPath(path);
}
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
BezierWidget widget;
widget.resize(400, 400);
widget.show();
return app.exec();
}
```
这个示例程序会在窗口中实时绘制鼠标经过的点和贝塞尔曲线,每次鼠标按下或移动时都会将当前点添加到点列表中,然后使用 QPainterPath 类的 cubicTo() 函数绘制贝塞尔曲线。注意在构造函数中调用 setMouseTracking(true) 可以让窗口接收鼠标移动事件,即使没有按下鼠标键。
阅读全文