web-dev-qa-db-ja.com

QVariantをカスタムクラスにキャストするにはどうすればよいですか?

Momentics IDE(native SDK)を使用してBlackBerry 10モバイルアプリケーションを開発しています。

C++でクリックしたアイテムを処理したいリストビューがあります(QMLではなくC++を使用する必要があります)。

「接続」命令を使用してインデックスパスを取得できますが、QVariantをカスタムクラスに解析する際に問題があります。

Q_ASSERT(QObject::connect(list1, SIGNAL(triggered(QVariantList)), this, SLOT(openSheet(QVariantList))));

QVariant selectItem = m_categoriesListDataModel->data(indexPath);

以下のような静的キャストを使用してみました

Category* custType = static_cast<Category*>(selectItem);

しかしそれは返します:

"invalid static_cast from type 'QVariant' to type 'Category*'"

誰かがこれを手伝ってくれる?

13
J.M.J

qvariant_cast および qobject_cast を使用してみてください。

QObject *object = qvariant_cast<QObject*>(selectItem);
Category *category = qobject_cast<Category*>(object);

また、Q_ASSERTに永続的なステートメントを入れないでください。アサートが有効でない場合は使用されません。

19
lpapp

編集:QObject以外の派生型で機能します(この場合のファイナルコンテストの回答を参照)

まず、QVariantマネージ型の一部になるように型を登録する必要があります

//customtype.h
class CustomType {
};

Q_DECLARE_METATYPE(CustomType)

次に、この方法でQVariantからカスタムタイプを取得できます。

CustomType ct = myVariant.value<CustomType>();

これは次と同等です:

CustomType ct = qvariant_cast<CustomType>(myVariant);
22
epsilon