Как я могу сделать два разных слоя QML и QGraphicScene в одном и том же MainWindow (или аналогичном), чтобы QML? - PullRequest
0 голосов
/ 17 марта 2020

Я пытаюсь создать приложение "paintbru sh", используя пользовательский набор инструментов, созданный в QML, и QGraphicScene, управляемый в c ++. Практически я могу выбрать инструмент, нажав кнопку на панели инструментов QML и использовать его для рисования чего-либо на QGraphicScene.

Я пробовал так:

//MainWindow.h
class MainWindow : public QMainWindow
{
        Q_OBJECT
    public:
        MainWindow() {
           scene = new Scene(this);
           scene->setSceneRect(0, 0, 1920, 1200);

           QQuickWidget *quickwidget = new QQuickWidget();

           quickwidget->setSource(QUrl(QStringLiteral("qrc:/main.qml")));
           scene->addWidget(quickwidget);

           view = new QGraphicsView(scene);
           setCentralWidget(view);
        }

    private:
        QGraphicsView* view;
        Scene* scene;
};
//Scene.h
class Scene : public QGraphicsScene
{
    Q_OBJECT
    Q_PROPERTY(Enums::Mode sceneMode READ sceneMode NOTIFY sceneModeChanged)

public:
    Scene(QObject* parent = 0);

    Enums::Mode sceneMode() const { return m_sceneMode; }
    Q_INVOKABLE void setMode(Enums::Mode mode);

signals:
    void sceneModeChanged();

protected:
    void mousePressEvent(QGraphicsSceneMouseEvent *event);
    void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
    void keyPressEvent(QKeyEvent *event);

private:
    Enums::Mode m_sceneMode;
    QPointF origPoint;
    QGraphicsItem* itemToDraw;
    QPointF startPoint;
    void makeItemsControllable(bool areControllable);
};
//Main.qml 
Item {
    width: 1920
    height: 1200

    ColumnTopLeftButtons { id: topLeftButtonsColumn }
    ColumnTopRightButtons { id: topRightButtons }
    ColumnBottomLeftButtons { id:bottomLeftButtons }
    BarTopPanels { id:topPanelsBar }
    RightPanel { id: toolbox }
}

Делая так, я рисую QML на сцене, получая, что любое действие, которое я делаю на кнопках панелей или набор инструментов взят со сцены в качестве входных данных. Но если я сделаю для разных объектов, один для сцены и один для qml, также установив координаты друг для друга, чтобы видеть один над другим (я предпочитаю сцену под инструментами), они будут располагаться рядом. Итак, как я могу «изолировать» входные данные на панели инструментов относительно сцены (которая не всегда будет использоваться) или как я могу иметь два разных слоя как для инструментов qml, так и для сцены?

...