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);
}
更新:これを少し簡単にするQGraphicsSceneMouseEvent
という新しいクラスがあります。ここでそれを使用した例を終了しました:
https://stackoverflow.com/a/26903599/99994
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
itemを使用するか、単に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
とそのマウスとの相互作用が危険になります。
QGraphicsView
とQGraphicsScene
を使用するときに効果的であるために、Qtの Graphics View Framework および関連する examples について必ず読んで学習してください。これらは2Dグラフィックス用の非常に強力なツールであり、少し学習曲線を描くことができますが、それだけの価値があります。