سؤال

لدي الكود التالي لإعداد a 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/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 إلى تخطيط القطعة المركزية لواجهة المستخدم الخاصة بك إذا كنت ستستخدم نموذجًا.

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

أو إذا كانت واجهة المستخدم الخاصة بك تحتوي على تخطيط بالفعل، فستبدو كما يلي:

    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.إنها أدوات قوية جدًا للرسومات ثنائية الأبعاد ويمكن أن تحتوي على منحنى تعليمي قليل ولكنها تستحق ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top