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