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()
QObject
mainScreen
setProperty
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ですが、私はすでに書いたコードに固執したいと思います。QDeclarativeItem
QApplicationViewer
誰かが私が間違っているところを助けて提案するか、C++からQMLファイルのアイテムのプロパティを変更できる「簡単な」例を見つけることができる方向に私を向けることができますか?
事前に多くの(多くの)感謝します。
ジョン...