正确更新QGraphicsLineItem

问题描述 投票:0回答:1

[我正在尝试使用mouseEvent中的QGraphicsScene函数绘制一条线,当我按下鼠标按钮并移至场景上方时,该线应从左上角[0,0]开始开始在我按下鼠标按钮的那一点,但是当我松开鼠标并再次这样做时,通常会画线,请问出现这种现象的原因是什么以及如何解决?


这里是完整的代码:

Scene.h:

#ifndef SCENE_H
#define SCENE_H

#include <QGraphicsScene>
#include <QGraphicsLineItem>
#include <QGraphicsSceneMouseEvent>

class Scene : public QGraphicsScene
{

public:
    Scene();

private:
    QGraphicsLineItem* line;
    QPointF startPoint;

protected:
    void mousePressEvent(QGraphicsSceneMouseEvent *event) override;
    void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override;
};

#endif // SCENE_H

Scene.cpp:

#include "Scene.h"

Scene::Scene() : startPoint(0,0)
{
    line = new QGraphicsLineItem();
    this->addItem(line);
}

void Scene::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    startPoint = event->scenePos();
}

void Scene::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
    qreal x = event->scenePos().x();
    qreal y = event->scenePos().y();
    line->setLine(startPoint.x(),startPoint.y(),x,y);
}

Main:

#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include "Scene.h"

int main(int argc,char* argv[])
{
    QApplication app(argc,argv);
    Scene scene;
    QGraphicsView view(&scene);
    view.setMinimumSize(800,600);
    view.setAlignment(Qt::AlignLeft|Qt::AlignTop);
    view.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
    view.show();
    return app.exec();
}
c++ qt qgraphicsscene
1个回答
0
投票

问题很简单:当您按下鼠标时,您不会更新鼠标线。

void Scene::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    QLineF l(event->scenePos(), event->scenePos());
    line->setLine(l);
}

void Scene::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
    QLineF l = line->line();
    l.setP2(event->scenePos());
    line->setLine(l);
}
© www.soinside.com 2019 - 2024. All rights reserved.