2011-10-20 15 views
13

Tengo el siguiente código para configurar un QGraphicsScene. Deseo hacer clic en la escena y dibujar un punto en la ubicación en la que hice clic. ¿Cómo podría hacer esto? Este es mi código actual:Cómo dibujar un punto (sobre el mouseclick) en 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); 
} 

Respuesta

31

UPDATE: Hay una nueva clase llamada QGraphicsSceneMouseEvent que haga esto un poco más fácil. acabo de terminar un ejemplo de usarlo aquí:

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

Se diferencia con la respuesta más adelante en que las subclases QGraphicsScene, no QGraphicsView, y utiliza mouseEvent->scenePos() así que no hay necesidad de asignar manualmente las coordenadas.


Estás en el camino correcto, pero aún tienes un poco más por delante.

Necesita crear la subclase QGraphicsView para poder hacer algo con las pulsaciones del mouse o con lanzamientos de mouse con 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 no tiene puntos sin dimensión de forma nativa. Probablemente desee utilizar el artículo QGraphicsEllipse o simplemente, scene->addEllipseItem() con un radio muy pequeño.

#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 el uso de mapToScene() para hacer la pos() del mapa de eventos correctamente al lugar donde se hace clic con el ratón en la escena.

Debe agregar una instancia de su subclase QGraphicsView al diseño del widget central de su interfaz de usuario si va a utilizar un formulario.

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

o si su interfaz de usuario tiene un diseño ya que se verá así:

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

Si no utiliza un formulario y una QMainWindow, puede agregarlo a una QWidget si se establece un diseño para él y luego agregue su QGraphicsView a ese diseño de una manera similar. Si no desea un margen alrededor de su QGraphicsView, simplemente llame a show en él y no lo coloque dentro de un diseño diferente.

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

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

     MyQGraphicsView view; 
     view.show(); 

     return a.exec(); 
    } 

Y eso es todo. Ahora eres peligroso con QGraphicsView y su interacción con el mouse.

Asegúrese de leer y estudiar acerca de Qt Graphics View Framework y la relacionada examples para ser eficaz cuando se utiliza QGraphicsView y QGraphicsScene. Son herramientas muy poderosas para gráficos en 2D y pueden tener una curva de aprendizaje, pero valen la pena.

+0

phyatt, muchas gracias por "Tenga en cuenta el uso de mapToScene() para hacer que la posición() del mapa de eventos se corresponda correctamente con el lugar donde se hace clic en la escena." – mathieug

Cuestiones relacionadas