2011-10-20 12 views
13

Mam następujący kod, aby skonfigurować QGraphicsScene. Chciałbym kliknąć scenę i narysować punkt w miejscu, które kliknąłem. Jak mogłem to zrobić? To jest mój bieżący kod:Jak narysować punkt (na mouseclick) w 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); 
} 

Odpowiedz

31

UPDATE: Jest nowa klasa o nazwie QGraphicsSceneMouseEvent sprawia, że ​​to trochę łatwiejsze. Właśnie skończyłem przykład używając go tutaj:

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

Różni się z odpowiedzią poniżej że podklas QGraphicsScene, nie QGraphicsView i wykorzystuje mouseEvent->scenePos() więc nie ma potrzeby ręcznego współrzędnych na mapie.


Jesteś na dobrej drodze, ale nadal masz niewiele do zrobienia.

Potrzebujesz podklasy QGraphicsView, aby móc coś zrobić za pomocą myszy lub wersji myszy, używając 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 nie ma natywnie punktów bez wymiarów. Prawdopodobnie będziesz chciał użyć elementu QGraphicsEllipse lub po prostu, scene->addEllipseItem() o bardzo małym promieniu.

#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)); 
    } 

Uwaga wykorzystanie mapToScene() aby pos() mapy zdarzeń poprawnie gdzie mysz kliknięciu na scenie.

Musisz dodać instancję swojego subklasowanego QGraphicsView do układu centralnego widgetu twojego interfejsu użytkownika, jeśli zamierzasz użyć formularza.

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

lub jeśli ui ma już układ będzie wyglądać następująco:

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

Jeśli nie używać QMainWindow i formę, można dodać go do QWidget jeśli ustawisz układ dla niego, a następnie dodaj swój QGraphicsView do tego układu w podobny sposób. Jeśli nie chcesz mieć marginesu wokół swojego QGraphicsView, po prostu wywołaj pokaz na nim i nie umieszczaj go w innym układzie.

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

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

     MyQGraphicsView view; 
     view.show(); 

     return a.exec(); 
    } 

I to wszystko. Teraz jesteś niebezpieczny z QGraphicsView i ich interakcji z myszą.

Pamiętaj, aby czytać i uczyć się o Qt Graphics View Framework i powiązanego examples być skuteczne przy stosowaniu QGraphicsView i QGraphicsScene. Są bardzo potężnymi narzędziami do grafiki 2D i mogą mieć trochę krzywej uczenia się, ale są tego warte.

+0

phyatt, dziękuję bardzo o "Zauważ użycie mapToScene(), aby pos() mapy zdarzeń poprawnie, tam, gdzie kliknięto myszą na scenie." – mathieug