Обновите QGraphicsLineItem правильно - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь нарисовать линию, используя функции 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();
}

1 Ответ

0 голосов
/ 30 апреля 2020

Проблема вызвана тем, что объект QGraphicsScene не инициализирован с помощью ограничительной рамки. В конструкторе используйте

Scene::Scene() : QGraphicsScene(0, 0, 400, 400), startPoint(0,0)

(например), и он будет работать как положено.

Если вы этого не сделаете, во время первого щелчка координаты сцены переместятся так что начальные координаты вашей линии (скажем, (x0, y0)) будут координатами сцены в верхнем левом углу. Поэтому, если вы немного переместите мышь, например, на (x0+1,y0), фактические координаты сцены станут равными (2*x0+1,2*y0).

Также рекомендуется вызывать обработчики событий родительского класса в конце ваши перегруженные.

Наконец, это может быть полезно: https://www.walletfox.com/course/qgraphicsitemruntimedrawing.php

...