因此,我可以通过C++代码更改某个QML对象的属性,但是在屏幕上看不到结果。
我有一个重复项64次的项目,并且我只希望显示第32个项目的特定图像(来自C++),所以我使用invokeMethod通过C++访问对象,然后使用setProperty更改可见性,如果使用qDebug属性“visible”确实发生了变化,但是我注意到在屏幕上没有区别,我仍然看不到图像,但是如果我从qml更改可见性,则可以看到它。

这是C++代码:

int main(int argc, char *argv[])
{
  QGuiApplication app(argc, argv);
  QQuickView view;
  view.setSource(QUrl("qrc:///main.qml"));
  view.show();
  QQuickItem* child;
  QQmlApplicationEngine engine;
  engine.load(QUrl(QStringLiteral("qrc:///Board.qml")));
  QObject *rootObject = engine.rootObjects().first();
  QQuickItem *qmlObject = rootObject->findChild<QQuickItem*>("grid")->findChild<QQuickItem*>("repeter");
  QMetaObject::invokeMethod(qmlObject,"itemAt",Qt::DirectConnection,   Q_RETURN_ARG (QQuickItem*,child), Q_ARG(int,32));
  child=child->findChild<QQuickItem*>("pleaseWork");
  qDebug() << child->property("visible");
  child->setProperty("visible","true");
  qDebug() << child->property("visible");
  return app.exec();
}

我使用qDebug来验证属性是否已更改

这是QML代码:
Item
{
    id: root
    width: 8*45
    height: 8*45
    Grid
    {
        id: grid
        objectName: "grid"
        rows: 8
        Repeater
        {
            objectName: "repeter"
            model: 64
            Image
            {
                objectName: "test"
                width: 45; height: 45
                source: "images/dark_square.png"
                Image
                {
                    id: isit
                    objectName: "pleaseWork"
                    visible: false
                    source: "images/avail_dark.png"
                }
            }
        }
    }
}

最佳答案

QQuickViewQQmlApplicationEngine是加载和显示QML View 的替代方法。您要加载到QQmlApplicationEngine中的内容与QQuickView的可见输出无关。

为了使事情顺利进行,您需要将QML文件的顶部元素从Item更改为Window并在屏幕上显示:

QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:///Board.qml")));
// end of your code

QObject *rootObject = engine.rootObjects().first();
QQuickWindow *window = qobject_cast<QQuickWindow *>(rootObject);
if (!window) {
    qDebug() << "Error: Your root item has to be a window.";
    return -1;
}
window->show();

// continue with your code
QQuickItem *qmlObject = rootObject->findChild<QQuickItem*>("grid")->findChild<QQuickItem*>("repeter");

关于c++ - QML对象属性从c++更改,但是我看不到结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37117876/

10-13 09:08