web-dev-qa-db-ja.com

QGraphicsSceneに(マウスクリックで)ポイントを描画する方法は?

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);
}
17
user189320

更新:これを少し簡単にする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とそのマウスとの相互作用が危険になります。

QGraphicsViewQGraphicsSceneを使用するときに効果的であるために、Qtの Graphics View Framework および関連する examples について必ず読んで学習してください。これらは2Dグラフィックス用の非常に強力なツールであり、少し学習曲線を描くことができますが、それだけの価値があります。

34
phyatt