qt c++重写继承QGraphicsView批量传入点集显示在图上并且可以和图像一起进行缩放,选中其中一个点可以改变颜色
时间: 2023-05-17 20:04:23 浏览: 67
可以通过重写QGraphicsView的paintEvent函数,在其中使用QPainter绘制点集。同时,可以通过重写QGraphicsView的mousePressEvent和mouseReleaseEvent函数实现选中点并改变颜色的功能。缩放可以通过调用QGraphicsView的scale函数实现。以下是示例代码:
```
class MyGraphicsView : public QGraphicsView {
public:
MyGraphicsView(QWidget* parent = nullptr) : QGraphicsView(parent) {}
void setPoints(const QVector<QPointF>& points) {
m_points = points;
update();
}
protected:
void paintEvent(QPaintEvent* event) override {
QGraphicsView::paintEvent(event);
QPainter painter(viewport());
painter.setRenderHint(QPainter::Antialiasing);
// 绘制点集
painter.setPen(Qt::NoPen);
painter.setBrush(Qt::black);
for (const QPointF& point : m_points) {
painter.drawEllipse(point, 5, 5);
}
}
void mousePressEvent(QMouseEvent* event) override {
QGraphicsView::mousePressEvent(event);
// 选中点并改变颜色
QPointF pos = mapToScene(event->pos());
for (int i = 0; i < m_points.size(); ++i) {
if (QRectF(m_points[i] - QPointF(5, 5), QSizeF(10, 10)).contains(pos)) {
m_selectedIndex = i;
m_pointsColors[i] = Qt::red;
update();
break;
}
}
}
void mouseReleaseEvent(QMouseEvent* event) override {
QGraphicsView::mouseReleaseEvent(event);
// 取消选中点
if (m_selectedIndex != -1) {
m_pointsColors[m_selectedIndex] = Qt::black;
m_selectedIndex = -1;
update();
}
}
void wheelEvent(QWheelEvent* event) override {
QGraphicsView::wheelEvent(event);
// 缩放
if (event->modifiers() & Qt::ControlModifier) {
double factor = qPow(1.2, event->angleDelta().y() / 120.0);
scale(factor, factor);
}
}
private:
QVector<QPointF> m_points;
QVector<QColor> m_pointsColors;
int m_selectedIndex = -1;
};
```
使用时,可以这样调用:
```
MyGraphicsView* view = new MyGraphicsView;
view->setScene(new QGraphicsScene);
view->setPoints({{0, 0}, {100, 100}, {200, 200}});
view->show();
```
其中,setPoints函数用于设置点集,可以在任何时候调用。