2016-05-09 51 views
1

因此,我可以通過C++代碼更改某個QML對象的屬性,但我無法在屏幕上看到結果。 我有一個項目重複64次,我想要顯示一個特定的圖像只爲第32項(從C + +),所以我用invokeMethod通過C++訪問對象,然後我用setProperty來更改可見性,如果我查看它與qDebug屬性「可見」確實發生了變化,但我注意到在屏幕上沒有任何區別我仍然無法看到圖像,但是如果我從qml更改可見性,我可以看到它。QML對象屬性從C++更改,但我看不到結果

這是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" 
       } 
      } 
     } 
    } 
} 
+1

請縮進如果正常,你想讓別人看你的代碼在它 - 謝謝! –

+0

太糟糕了,沒有什麼可以縮進的C++代碼 –

+0

我說的是QML。 C++看起來不錯。 –

回答

1

QQuickViewQQmlApplicationEngine的替代方式來加載並顯示QML視圖。您加載到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"); 
+0

非常感謝你,我剛開始學習Qt,我不知道有很多方法可以加載和顯示QML,再次感謝您的幫助 –

+0

但是,您知道我可以使用任何方式替代QQmlApplicationEngine嗎? –

+0

我不明白這個問題。您的代碼可以正常使用QQmlApplicationEngine。你只需要獲取並顯示我發佈的窗口。 –