如何从C ++设置QML属性

时间:2014-12-20 22:14:09

标签: c++ qml qt5.4

我正在尝试做一个简单的任务,比如从C ++更改某个QML对象的属性(text :),但我却失败了。任何帮助表示赞赏。

我没有收到任何错误,窗口显示,只是文本属性不会改变(至少我认为)它应该。 甚至是我在这里做错了什么?!!

我正在尝试的是:

的main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQuickView>
#include <QQuickItem>
#include <QQmlEngine>
#include <QQmlComponent>
#include <QString>

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;


    QQmlComponent component(&engine, QUrl::fromLocalFile("main.qml"));
    QObject *object = component.create();

     engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    QString thisString = "Dr. Perry Cox";

    object->setProperty("text", thisString);  //<--- tried  instead of thisString putting "Dr. ..." but nope.
    delete object;



    return app.exec();
}

main.qml

import QtQuick 2.2
import QtQuick.Window 2.1

Window {
    visible: true
    width: 360
    height: 360

    MouseArea {
        anchors.fill: parent
        onClicked: {
            Qt.quit();
        }
    }

    Text {
        id: whot
        text: ""
        anchors.centerIn: parent
        font.pixelSize: 20
        color: "green"
    }
}

3 个答案:

答案 0 :(得分:4)

当您致电QObject *object = component.create();时,您可以访问根上下文,即Window组件及其属性。

要访问Text属性,您可以创建如下属性别名:

Window {
    property alias text: whot.text
    ...
    Text {
        id: whot
        text: ""
        ...
    }
}

这样,您就可以在whot的上下文中访问text的{​​{1}}媒体资源。

还有另一种略微圆润的方式。将Window属性而不是objectName(或两者,如果您仍然需要id)分配给id

whot

现在您可以在代码中执行此操作:

Text {
    id: whot // <--- optional
    objectName: "whot" // <--- required
    text: ""
    ...
 }

旁注:在调用QObject *whot = object->findChild<QObject*>("whot"); if (whot) whot->setProperty("text", thisString); 之前,我不认为您应该删除object。否则,它会......好吧,被删除。 :)

答案 1 :(得分:0)

f(std::ostream& stream) 
{
  BIT16* m_pMeans, x;
  int iSize = 32;
  x = (BIT16*) Alloc16Address((void**)&m_pMeans,MEAN_SIZE*iSize);
  stream.read((char*)m_pMeans, MEAN_SIZE*iSize); // <<<< access volation
}

用于qml

#include <QQmlContext>
#include <qquickview.h>
#include <qdir.h>

QQmlApplicationEngine engine;
QString root = QCoreApplication::applicationDirPath();
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
        return -1;
QObject *topLevel = engine.rootObjects().value(0);
QQuickWindow *window = qobject_cast<QQuickWindow*>(topLevel);
window->setProperty("root", root);

答案 2 :(得分:0)

对于 QML 属性,您应该使用 QQmlProperty 代替:

QQmlProperty::write(whot, "text", thisString);