2

QTとQMLでアプリケーションを開発して、いくつかのXMLデータにアクセスし、結果を表示しています。

XMLはC++からダウンロード/解析され、これは正常に機能します。カスタムレイアウトを表示するように設計されたQMLアプリケーションがあり、それも正常に機能します。

アプリをより洗練された外観にするために、C ++側が最初のダウンロード/解析を完了する間に表示される最初の「スプラッシュ画面」があります。メインのQMLビュー内に、現在のアプリケーションの「状態」を表すプロパティを作成して、スワップできるようにしました。データの準備ができたら、正しい画面に移動します。

Main.qml

Item
{
   id: mainScreen
   width: 800; height: 600;   
   property int activeState: 0       // This controls what screen is displayed

   Item 
   {
       // screen layout .. removed .. 
   }
}

C ++コードは、QTクリエーターアプリウィザードによって生成され、基本QmlApplicationViewerクラスに基づいています。

オンラインQTドキュメントを読んだ(そして再読した)ので、の個々のプロパティにアクセスするために必要なのは、アプリケーションビューアmainScreenのメソッドを呼び出してインスタンスへのポインタを返し、そのようにメソッドを呼び出すことだけです。 。findChild<QObject *>rootContext()QObjectmainScreensetProperty

QObject *mainView = ROOT_CONTEXT->findChild<QObject *>("mainScreen");

qDebug("mainView = %08X",(uint)mainView);

if(mainView)
{
    mainView->setProperty("activeState",1);
}
else
    qDebug("Unable to find the mainScreen QML object");

他の場所ROOT_CONTEXTで定義されている場所

QDeclarativeContext *ROOT_CONTEXT;
QDeclarativeEngine  *ROOT_ENGINE;
QGraphicsObject     *ROOT_OBJECT;

void QmlApplicationViewer::createMyApplication(void)
{
    ROOT_CONTEXT = this->rootContext();
    ROOT_OBJECT  = this->rootObject();
    ROOT_ENGINE  = this->engine();

    pMyApplication = new MyApplication(this);
}

void QmlApplicationViewer::createMyApplication(void)メインのQMLファイルがセットアップされた後に呼び出されます。

QmlApplicationViewer viewer;

viewer.setMainQmlFile(QLatin1String("main.qml"));
viewer.showExpanded();
viewer.createMyApplication();

しかし...

私が遭遇している問題は、から返される値findChild<QObject *>("mainScreen");が常にNULLであるということです。次のコードを使用して、QMLファイル内のオブジェクトの階層を列挙してみました

QList<QObject*> list = ROOT_OBJECT->findChildren<QObject*>();

qDebug("list = %d",list.count());
int i;

for(i=0;i<list.count();i++)
{
    QObject *obj = list[i];

    qDebug() << "Object" << i << obj->objectName();
}

約120個のアイテムのリストが表示されますが、名前に空白の文字列( "")が付いています。

QTドキュメントを振り返ると、すべての例は、このブログエントリhttp://xizhizhu.blogspotに示されているように、クラスを使用する代わりに、手動で個々のパーツを作成し(つまり、、、のインスタンスを作成し)、それらをリンクするQDeclarativeEngineことQDeclarativeComponentを示唆しているようです。 co.uk/2010/10/hybrid-application-using-qml-and-qt-c.htmlですが、私はすでに書いたコードに固執したいと思います。QDeclarativeItemQApplicationViewer

誰かが私が間違っているところを助けて提案するか、C++からQMLファイルのアイテムのプロパティを変更できる「簡単な」例を見つけることができる方向に私を向けることができますか?

事前に多くの(多くの)感謝します。

ジョン...

4

2 に答える 2

3

アップデート

次のコード

QList<QObject*> list = ROOT_OBJECT->findChildren<QObject*>();

qDebug("list = %d",list.count());
int i;

for(i=0;i<list.count();i++)
{
    QObject *obj = list[i];
    qDebug() << "Object" << i << obj->objectName();
}

オブジェクトのリストが機能してダンプされます。上記のようにQMLファイルでobjectName:プロパティを使用すると、アプリケーションでROOTアイテムの子を表示(およびアクセス)できます。

しかし、私ができないように見えるのは、実際にACTUAL ROOTアイテムにアクセスして、そのプロパティを設定することです。これは、私がすでにROOTオブジェクトを参照している典型的な顔の手のひらの瞬間に夜明けを迎えました。これは、ROOT_OBJECT変数にすでに格納されている値でした* sheesh *

要約すると...

上記のコードはすべて機能します-メインビューからCHILDのプロパティを実際に見つけて調整するにはobjectName:、ルートアイテムのプロパティを実際に変更する場合は、QDeclaritiveView::rootObject()関数によって返される値を使用するだけで、を設定することを忘れないでください。

私を正しい方向に向けてくれたIvanFelにもう一度感謝します。これがいつか検索に表示され、多くのstackOverflowエントリが過去に私を助けたのと同じように他の誰かを助けることを願っています。

8-)

于 2012-11-08T09:49:39.330 に答える
2

Main.qmlは

Item
{
   id: mainScreen
   objectName: "mainScreen"
   width: 800; height: 600;   
   property int activeState: 0       // This controls what screen is displayed

   Item 
   {
       // screen layout .. removed .. 
   }
}

objectName: "mainScreen"がありませんでした。これが、findChild <>()が子を見つける方法です。

于 2012-11-07T18:12:52.077 に答える