在qt图元连线中,如何使用qvector<Qpointf>容器记录节点,并生成折线,鼠标可自由拖动线段,线段随着变化
时间: 2024-02-20 13:57:17 浏览: 19
要使用 `QVector<QPointF>` 容器来记录节点,可以在每次鼠标移动或点击时,将当前的鼠标位置作为一个 `QPointF` 对象加入到该容器中。然后,可以根据这些节点来生成折线。
为了让线段随着鼠标的拖动而变化,可以在每次鼠标移动时,重新计算线段的路径并更新显示。具体来说,可以在 `mouseMoveEvent` 中计算新的线段路径,然后调用 `update` 函数来触发窗口的重绘,从而更新显示。
下面是一个简单的示例代码,演示了如何使用 `QVector<QPointF>` 容器记录节点,并根据节点生成折线,并实现鼠标拖动时线段随之变化:
```cpp
#include <QtWidgets>
class LineWidget : public QWidget {
public:
LineWidget(QWidget *parent = nullptr) : QWidget(parent) {
setMouseTracking(true);
}
protected:
void paintEvent(QPaintEvent *event) override {
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
// 画线段
painter.setPen(QPen(Qt::black, 2));
painter.drawPolyline(linePoints_);
// 画节点
painter.setPen(QPen(Qt::red, 5));
for (const QPointF &pt : linePoints_) {
painter.drawPoint(pt);
}
}
void mousePressEvent(QMouseEvent *event) override {
// 添加节点
linePoints_.append(event->posF());
// 更新显示
update();
}
void mouseMoveEvent(QMouseEvent *event) override {
if (event->buttons() & Qt::LeftButton) {
// 拖动时更新最后一个节点的位置
linePoints_.back() = event->posF();
// 更新显示
update();
}
}
private:
QVector<QPointF> linePoints_;
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
LineWidget widget;
widget.show();
return app.exec();
}
```
这个示例代码实现了一个简单的窗口,可以在其中用鼠标点击来添加节点,用鼠标拖动来改变线段的形状。注意到这个示例代码中,我们在 `paintEvent` 中使用 `drawPolyline` 函数来画出折线,并使用 `drawPoint` 函数来画出节点。在 `mousePressEvent` 和 `mouseMoveEvent` 中,我们分别处理了鼠标点击和拖动事件,并更新了 `linePoints_` 容器以及窗口的显示。