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对象并更新其文本?
试一试:
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++如果代码遵循模型视图模式,则代码不应该意识到表示。
然而,正如此处所述,这是可能的。