更新:QGraphicsSceneMouseEvent
これを少し簡単にするという新しいクラスがあります。ここでそれを使用した例を終了しました:
https://stackoverflow.com/a/26903599/999943
QGraphicsScene
をサブクラス化するのではなく、サブクラス化するという点で以下の回答とは異なります。またQGraphicsView
、を使用するmouseEvent->scenePos()
ため、手動で座標をマッピングする必要はありません。
あなたは正しい方向に進んでいますが、まだもう少し先があります。
QGraphicsView
マウスを押したり、を使用してマウスを離したりして何かを実行できるようにするには、サブクラス化する必要があります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
ネイティブに次元のないポイントはありません。おそらく、半径が非常に小さいQGraphicsEllipse
アイテムまたは単純に使用することをお勧めします。scene->addEllipseItem()
#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));
}
の使用法に注意してmapToScene()
、pos()
イベントをシーン上でマウスがクリックされた場所に正しくマップします。
QGraphicsView
フォームを使用する場合は、サブクラス化されたインスタンスをuiのcentralWidgetのレイアウトに 追加する必要があります。
QGridLayout * gridLayout = new QGridLayout(ui->centralWidget);
gridLayout->addWidget( new MyQGraphicsView() );
または、UIにすでにレイアウトがある場合は、次のようになります。
ui->centralWidget->layout()->addWidget( new MyGraphicsView() );
QMainWindow
とフォームを使用しない場合はQWidget
、レイアウトを設定してフォームをに追加QGraphicsView
し、同様の方法でそのレイアウトに追加できます。周囲に余白が必要ない場合は、QGraphicsView
showを呼び出して、別のレイアウト内に配置しないでください。
#include <QtGui/QApplication>
#include "myqgraphicsview.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyQGraphicsView view;
view.show();
return a.exec();
}
以上です。今、あなたはとQGraphicsView
マウスとの相互作用で危険です。
とを使用するときに効果的であるために、 QtのGraphicsViewFrameworkと関連する例を必ず読んで学習してください。これらは2Dグラフィックス用の非常に強力なツールであり、少し学習曲線を描くことができますが、それだけの価値があります。QGraphicsView
QGraphicsScene