QQuickWidget和C++交互

Nik*_*las 7 c++ qt qquickwidget

我正在体验新的QQuickWidget.我如何在QQuickWidget和C++之间进行交互?

C++

QQuickWidget *view = new QQuickWidget();
view->setSource(QUrl::fromLocalFile("myqml.qml"));
view->setProperty("test", 0);

myLayout->addWidget(view);
Run Code Online (Sandbox Code Playgroud)

QML

import QtQuick 2.1

Rectangle {
    id: mainWindow
    width: parent.width
    height: parent.height

    Text {
        id: text
        width: mainWindow.width
        font.pixelSize: 20
        horizontalAlignment: Text.AlignHCenter
        verticalAlignment: Text.AlignVCenter
        text: test
    }
}
Run Code Online (Sandbox Code Playgroud)

text: test 不起作用: ReferenceError: test is not defined

如何通过C++为我的QML文件提供一些属性?

是否也可以在C++中获取Text对象并更新其文本?

Evg*_*nko 4

试一试:

view->rootContext()->setContextProperty("test", "some random text");
Run Code Online (Sandbox Code Playgroud)

代替

view->setProperty("test", 0);
Run Code Online (Sandbox Code Playgroud)

setProperty(name, val)name如果对象具有定义为 的属性,则有效Q_PROPERTY

可以将QObject派生对象作为view的上下文属性传递:

class Controller : public QObject
{
    Q_OBJECT
    QString m_test;

public:
    explicit Controller(QObject *parent = 0);

    Q_PROPERTY(QString test READ test WRITE setTest NOTIFY testChanged)

    QDate test() const
    {
        return m_test;
    }

signals:

    void testChanged(QString arg);

public slots:

    void setTest(QDate arg)
    {
        if (m_test != arg) {
            m_test = arg;
            emit testChanged(arg);
        }
    }
};
Run Code Online (Sandbox Code Playgroud)
Controller c;
view->rootContext()->setContextProperty("controller", &c);
Run Code Online (Sandbox Code Playgroud)
Text {
        id: text
        width: mainWindow.width
        font.pixelSize: 20
        horizontalAlignment: Text.AlignHCenter
        verticalAlignment: Text.AlignVCenter
        text: controller.test
    }
Run Code Online (Sandbox Code Playgroud)

是否也可以获取 C++ 中的 Text 对象并更新其文本?

一般来说,这似乎不是最好的方法——c++如果代码遵循模型视图模式,则代码不应该意识到表示。

然而,正如此处所述,这是可能的。