2017-11-16 3 views
0

Ich erstelle eine Schaltplanbearbeitung, bei der der Benutzer einfach Linien und Rechtecke zeichnen kann. Dazu verwende ich eine untergeordnete QGraphicsView mit neu implementierten Event-Handlern. Jetzt, wenn Linien gezeichnet werden, verschiebt sich die Ansicht, um den Mittelpunkt aller gezeichneten Linien in der Mitte des Anwendungsfensters zusammen zu setzen (ich denke?). Das ist in einem Zeichenprogramm sehr nervig, wie kann ich das beheben?Sperransicht in 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(); 
} 

Antwort

1

Das Problem verursacht, weil Sie nicht sceneRect-QGraphicsScene gesetzt haben, nach dem docs:

sceneRect: QRectF

Diese Eigenschaft enthält die Szenenrechteck; das Begrenzungsrechteck der Szene

Das Szenenrechteck definiert die Ausdehnung der Szene. Es ist in erster Linie , die von QGraphicsView verwendet wird, um den standardmäßig scrollbaren Bereich der Ansicht zu bestimmen, und von QGraphicsScene, um Itemindizierung zu verwalten.

Wenn nicht gesetzt, oder wenn auf einen Null-QRectF gesetzt, sceneRect() die größten Begrenzungs rect aller Elemente auf der Szene zurückkehren, da die Szene erstellt wurde (dh ein Rechteck, das wächst, wenn Elemente hinzugefügt oder bewegt in der Szene, aber nie schrumpft).

Also jedes Mal, wenn Sie fügen Sie eine neue Zeile, wenn er größer ist als die vorherigen QGraphicsScene versuchen auf diese Größe passen das Gefühl zu geben, dass das Zentrum bewegt.

Zum Beispiel in Ihrem Fall:

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

Manchmal so einfach! Vielen Dank! – pschulz