2016-05-09 6 views
1

So konnte ich die Eigenschaft eines bestimmten QML-Objekts über C++ - Code ändern, aber ich konnte das Ergebnis auf dem Bildschirm nicht sehen. Ich habe ein Element 64 Mal wiederholt, und ich möchte ein bestimmtes Bild nur für das 32. Element (aus C++) angezeigt werden, so habe ich InvokeMethod verwendet, um das Objekt über C++ zugreifen, dann habe ich setProperty verwendet, um die Sichtbarkeit zu ändern, wenn ich es anzeigen mit qDebug hat sich die Eigenschaft "visible" geändert, aber ich merke keinen Unterschied auf dem Bildschirm Ich kann das Bild immer noch nicht sehen, aber wenn ich die Sichtbarkeit von qml ändere, kann ich es sehen.QML-Objekt-Eigenschaft geändert von C++, aber ich kann das Ergebnis nicht sehen

Dies ist der C++ Code:

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(); 
} 

I qDebug verwendet die Eigenschaft

geändert

Dies ist der QML-Code zu überprüfen:

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

Bitte einrücken Ihren Code richtig, wenn Sie andere Leute wollen aussehen daran - danke! –

+0

Schade, dass es im C++ Code keine Einrückung gibt –

+0

Ich spreche von der QML. C++ sieht gut aus. –

Antwort

1

QQuickView und QQmlApplicationEngine sind alternative Wege zu laden und zeigen QML-Ansichten. Was Sie in QQmlApplicationEngine laden, hat nichts mit dem sichtbaren Ausgang von QQuickView zu tun.

Um die Dinge laufen zu lassen, müssen Sie das oberste Element der QML-Datei Item-Window und es auf dem Bildschirm zeigen ändern:

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

Vielen Dank, ich habe gerade begonnen, Qt zu lernen, und ich wusste nicht, dass es viele Möglichkeiten gibt, QML zu laden und zu zeigen, danke nochmal für deine Hilfe. –

+0

Aber weißt du irgendeine Art wie ich die QQmlApplicationEngine benutzen kann? –

+0

Ich verstehe die Frage nicht. Ihr Code funktioniert gut mit QQmlApplicationEngine. Sie müssen nur die Fenster holen und zeigen, wie ich gepostet habe. –