2016-05-09 32 views
1

C++コードで特定のQMLオブジェクトのプロパティを変更できましたが、結果が画面に表示されませんでした。 私は項目を64回繰り返したので、C++から32番目の項目(C++から)のみを表示したいので、invokeMethodを使用してC++でオブジェクトにアクセスし、setPropertyを使用して可視性を変更しましたqDebugプロパティで "visible"が変更されましたが、画面に違いはないことがわかりましたが、まだ画像は表示されませんが、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(); 
} 

Iプロパティを検証するために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とは関係ありません。

物事を実行している得るために、あなたはWindowItemからQMLファイルの先頭の要素を変更し、画面上にそれを表示する必要があります。

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でうまく動作します。投稿したウィンドウを取得して表示するだけです。 –

関連する問題