2011-10-20 10 views
13

Ho il seguente codice per impostare un QGraphicsScene. Vorrei cliccare sulla scena e disegnare un punto nella posizione in cui ho cliccato. Come potrei farlo? Questo è il mio codice corrente:Come disegnare un punto (sul mouseclick) su un QGraphicsScene?

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 

    QGraphicsScene *scene; 
    QGraphicsView *view = new QGraphicsView(this); 

    view->setGeometry(QRect(20, 50, 400, 400)); 
    scene = new QGraphicsScene(50, 50, 350, 350); 
    view->setScene(scene); 
} 

risposta

31

UPDATE: C'è una nuova classe chiamata QGraphicsSceneMouseEvent che rende questo un po 'più facile. Ho appena finito un esempio usando qui:

https://stackoverflow.com/a/26903599/999943

Differisce con la risposta qui sotto in quanto le sottoclassi QGraphicsScene, non QGraphicsView, e utilizza mouseEvent->scenePos() quindi non v'è la necessità di mappare manualmente coordinate.


Sei sulla strada giusta, ma hai ancora un po 'di più da percorrere.

È necessario creare una sottoclasse di QGraphicsView per poter eseguire operazioni con le presse del mouse o con il rilascio del mouse utilizzando QMouseEvent.

#include <QGraphicsView> 
    #include <QGraphicsScene> 
    #include <QGraphicsEllipseItem> 
    #include <QMouseEvent> 

    class MyQGraphicsView : public QGraphicsView 
    { 
     Q_OBJECT 
    public: 
     explicit MyQGraphicsView(QWidget *parent = 0); 

    signals: 

    public slots: 
     void mousePressEvent(QMouseEvent * e); 
     // void mouseReleaseEvent(QMouseEvent * e); 
     // void mouseDoubleClickEvent(QMouseEvent * e); 
     // void mouseMoveEvent(QMouseEvent * e); 
    private: 
     QGraphicsScene * scene; 
    }; 

QGraphicsView non ha punti di dimensione nativi. Probabilmente vorrete usare l'articolo QGraphicsEllipse o semplicemente, scene->addEllipseItem() con un raggio molto piccolo.

#include "myqgraphicsview.h" 
    #include <QPointF> 

    MyQGraphicsView::MyQGraphicsView(QWidget *parent) : 
     QGraphicsView(parent) 
    { 
     scene = new QGraphicsScene(); 
     this->setSceneRect(50, 50, 350, 350); 
     this->setScene(scene); 
    } 

    void MyQGraphicsView::mousePressEvent(QMouseEvent * e) 
    { 
     double rad = 1; 
     QPointF pt = mapToScene(e->pos()); 
     scene->addEllipse(pt.x()-rad, pt.y()-rad, rad*2.0, rad*2.0, 
      QPen(), QBrush(Qt::SolidPattern)); 
    } 

nota l'utilizzo di mapToScene() per rendere la pos() della mappa evento correttamente al punto in cui il mouse si fa clic sulla scena.

È necessario aggiungere un'istanza della sottoclasse QGraphicsView al layout del tuo ui di centralWidget se si intende utilizzare un modulo.

QGridLayout * gridLayout = new QGridLayout(ui->centralWidget); 
    gridLayout->addWidget(new MyQGraphicsView()); 

o se l'interfaccia utente ha già un layout che sarà simile a questa:

ui->centralWidget->layout()->addWidget(new MyGraphicsView()); 

Se non si utilizza un modulo e un QMainWindow, è possibile aggiungerlo a una QWidget se si imposta un layout per questo e quindi aggiungere il tuo QGraphicsView a tale layout in modo simile. Se non vuoi un margine attorno al tuo QGraphicsView, basta chiamare show su di esso e non metterlo in un layout diverso.

#include <QtGui/QApplication> 
    #include "myqgraphicsview.h" 

    int main(int argc, char *argv[]) 
    { 
     QApplication a(argc, argv); 

     MyQGraphicsView view; 
     view.show(); 

     return a.exec(); 
    } 

E questo è tutto. Ora sei pericoloso con QGraphicsView e la loro interazione con il mouse.

Leggere e studiare in merito a Qt Graphics View Framework e la relativa examples per essere efficace quando si utilizzano QGraphicsView e QGraphicsScene. Sono strumenti molto potenti per la grafica 2D e possono avere un po 'di curva di apprendimento, ma ne valgono la pena.

+0

phyatt, grazie mille "Si noti l'uso di mapToScene() per posizionare correttamente la posizione() della mappa eventi sul punto in cui si fa clic sul mouse sulla scena." – mathieug

Problemi correlati