锁定QGraphicsView上的视图

时间:2017-11-16 22:21:15

标签: c++ qt qt5 qgraphicsview qgraphicsscene

我正在创建一个原理图编辑,简单地说,用户可以绘制线条和矩形。为此,我使用带有重新实现的事件处理程序的子类QGraphicsView。 现在,当绘制线条时,视图会移动,以便将所有绘制线条的中心点放在应用程序窗口的中间(我猜?)。因为这在绘图程序中非常烦人,我该如何解决这个问题?

MWE:

#include <QApplication>
#include <QMainWindow>
#include <QGraphicsView>
#include <QMouseEvent>

class view : public QGraphicsView
{
public:
    view(QGraphicsScene* scene, QWidget* parent = 0) : QGraphicsView::QGraphicsView(scene, parent) { }

    void mousePressEvent(QMouseEvent* event)
    {
        static QPointF p;
        static bool active = false;
        if(!active)
        {
            p = mapToScene(event->pos());
            active = true;
        }
        else
        {
            QPointF p2 = mapToScene(event->pos());
            active = false;
            draw_line(p, p2);
        }
    }

    void draw_line(QPointF p1, QPointF p2)
    {
        QPen pen;
        pen.setWidth(2);
        this->scene()->addLine(p1.x(), p1.y(), p2.x(), p2.y(), pen);
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QMainWindow w;
    QGraphicsScene* scene = new QGraphicsScene;
    view* mview = new view(scene);
    w.setCentralWidget(mview);
    w.show();

    return a.exec();
}

1 个答案:

答案 0 :(得分:2)

问题是由于您未根据docssceneRect设置为QGraphicsScene而导致的:

  

sceneRect:QRectF

     

此属性包含场景矩形;的边界矩形   场景

     

场景矩形定义场景的范围。它主要是   QGraphicsView使用它来确定视图的默认可滚动区域,   并通过QGraphicsScene来管理项目索引。

     

如果未设置,或者设置为空QRectF,则sceneRect()将返回   自场景以来场景中所有项目的最大边界矩形   已创建(即,在项目添加或移动时增长的矩形)   在场景中,但从未缩小)。

因此,每当你添加一个新行时,如果它大于之前的QGraphicsScene,请尝试适应该大小,从而产生移动中心的感觉。

例如在您的情况下:

view(QGraphicsScene* scene, QWidget* parent = 0) : 
QGraphicsView::QGraphicsView(scene, parent) 
{
    scene->setSceneRect(QRectF(rect()));
    //scene->setSceneRect(0, 0, 640, 480)
}