2017-05-22 12 views
0

QQuickApplicationWindowのQMLフォームがあります。 QtVirtualKeyboardのBaseKey要素のポインタをQQuickItemにする必要があります(実装は別のQMLファイルに配置され、プログラムが実行されるときにレイアウトのLoaderで読み込まれます)が、このBaseKey_QMLTYPE_XXのような動的(実行時)タイプがあります。数。QObject :: findChildren()QMLオブジェクトの検索

私はQObject::findChildren()ファンクションhttp://doc.qt.io/qt-4.8/qobject.html#findChildを見つけましたが、typenameに数字 "XX"が見つかりません。

C++コードからBaseKey上のQQuickItemポインタを見つけるにはどうすればよいですか?

+0

QObject :: findChildren()は、あなたの質問だった場合、 'objectName'を検索します。 – folibis

+0

@folibis、そうですが、実行時の依存関係の部分インデックス番号がある場合、どのようにオブジェクト名を見つけることができますか? – Nikxp

+0

仮想キーボードを使用するアプリケーションをテストしようとしましたか? – Mitch

答えて

1

BaseKey_QMLTYPE_XXは、オブジェクト(print(myObject))を印刷した場合の表示と似ています。私はそれがQMetaObject::className()から来ると思います。

オブジェクトにobjectNameが設定されていない場合は、findChild()を使用してオブジェクトを検索することはできません(C++タイプにアクセスでき、そのタイプのオブジェクトが1つしかない場合)。

私はあなたが後にしているものと同様の何かをするhacky test helper functionを持っている:

QObject *TestHelper::findPopupFromTypeName(const QString &typeName) const 
{ 
    QObject *popup = nullptr; 
    foreach (QQuickItem *child, overlay->childItems()) { 
     if (QString::fromLatin1(child->metaObject()->className()) == "QQuickPopupItem") { 
      if (QString::fromLatin1(child->parent()->metaObject()->className()).contains(typeName)) { 
       popup = child->parent(); 
       break; 
      } 
     } 
    } 
    return popup; 
} 

はあなたが渡したオブジェクトの子を反復処理するためにこれを適応させる可能性がカップルがより変化よりもあります。それはそれを働かせるが、一般的なアイデアはそこにある。

関連する問題