在qt中使用Qvector<QPointf>记录路径节点,连接图元,鼠标移动线段,线段随着变动例子
时间: 2024-02-20 08:00:03 浏览: 79
好的,下面是一个简单的例子,演示如何在Qt中使用QVector<QPointF>记录路径节点,连接图元,鼠标移动线段,线段随着变动。
MainWindow.h文件:
```c++
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QPainter>
#include <QMouseEvent>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsLineItem>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
protected:
void paintEvent(QPaintEvent *event);
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
private:
Ui::MainWindow *ui;
QVector<QPointF> m_points;
bool m_isDrawing;
QGraphicsScene* m_scene;
QGraphicsView* m_view;
QGraphicsLineItem* m_line;
};
#endif // MAINWINDOW_H
```
MainWindow.cpp文件:
```c++
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 创建场景和视图
m_scene = new QGraphicsScene(this);
m_view = new QGraphicsView(m_scene, this);
m_view->setGeometry(10, 50, 780, 500);
m_view->setRenderHint(QPainter::Antialiasing);
// 初始化
m_isDrawing = false;
m_line = nullptr;
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
painter.setPen(QPen(Qt::red, 2));
// 绘制路径节点
for (int i = 0; i < m_points.size(); ++i)
{
painter.drawEllipse(m_points[i], 3, 3);
}
// 绘制线段
for (int i = 0; i < m_points.size() - 1; ++i)
{
painter.drawLine(m_points[i], m_points[i + 1]);
}
}
void MainWindow::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton)
{
// 添加节点
m_points.append(event->pos());
m_isDrawing = true;
// 创建线段item
m_line = new QGraphicsLineItem(QLineF(event->pos(), event->pos()));
m_line->setPen(QPen(Qt::red, 2));
m_scene->addItem(m_line);
}
}
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
if (m_isDrawing)
{
// 更新节点
m_points.last() = event->pos();
// 更新线段item
m_line->setLine(QLineF(m_points[m_points.size() - 2], event->pos()));
// 刷新窗口
update();
}
}
void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton)
{
// 添加节点
m_points.last() = event->pos();
m_isDrawing = false;
// 更新线段item
m_line->setLine(QLineF(m_points[m_points.size() - 2], event->pos()));
// 刷新窗口
update();
}
}
```
在这个例子中,我们使用QPainter在窗口中绘制路径节点和线段,并使用QGraphicsView和QGraphicsScene来实现鼠标移动线段和线段随着变动的效果。
希望这个例子能够帮助您理解如何在Qt中使用QVector<QPointF>记录路径节点,连接图元,鼠标移动线段,线段随着变动。
阅读全文