7

QVariantQList<QVariant>は noではなく、受け入れるようにQVector<QVariant>見えますQLinkedList<QVariant>。それは単純に を見て、QList基本的に (抽象的な意味で) データ構造が似ているからですか?QVectorQLinkedList

と を に追加しstd::vectorていQVariantます。手動変換ではなく Qt API のみを使用する場合は、次の 2 つの変換が必要です。

  1. からstd::vectorまでQVector
  2. からQVectorまでQList

PS:これstd::vectorQVariant直接追加できることは承知していますが、その場合、それがオブジェクトのベクトルであることを認識できないと思います。

4

4 に答える 4

12

qRegisterMetaType 関数を呼び出した後、すべてを QVariant に保存できます。

したがって、qRegisterMetaType<std::vector<SomeObject> >("std::vector<SomeObject>");QVariant を呼び出すと、std::vector が格納されます。実行関数からそのような値を読み取りT QVariant::value () const、使用関数を書き込むためにvoid QVariant::setValue ( const T & value )

PS:これを使用して std::vector を QVariant に直接追加できることは承知していますが、その場合、それがオブジェクトのベクトルであることを認識できないと思います。

タイプをQVariantに登録すると、そのタイプのアイテムを操作しながら、デフォルトのコンストラクタ、コピーコンストラクタ、およびデストラクタが呼び出されます。したがって、クラスやオブジェクトで使用しても害はありません。

于 2011-05-30T15:20:13.493 に答える
7

QList が最も一般的に使用されるコンテナー タイプであり、他のすべてのコンテナー タイプにオーバーロードを追加すると、QVariant インターフェイスが以前よりもさらに複雑になるためです。いずれにせよ、あなたの問題は QVariant が QVector をサポートしていないこと (少しの作業でサポートされている) ではなく、QJson がサポートしていないことです。QVector::toList() への余分な呼び出しが重大なパフォーマンスのオーバーヘッドを引き起こすとは思えません。

于 2011-05-30T20:18:52.990 に答える
2

このようなテンプレート化されたクラスの場合、特定のインスタンス化をそれぞれメタ システムに個別に登録する必要があります。どうやら、トロールは を使用する必要性を感じていたようQList<QVariant>ですが、他のものは使用しなかったため、1 つだけを登録しました。自分で登録できなかった特別な理由はありません。

于 2011-05-30T16:01:51.897 に答える
0

QVariant の実装について 100% 確信があるわけではありませんが、QVariant のサイズは実行時まで決定されないと思います。これは、QVector< QVariant > を書き込もうとすると、コンパイラは割り当てるスペースを認識できないため、エラーが報告されることを意味します。LinkedList についても同様です。QList は、実装がポインターに厳密に依存しているため機能します。

QVector< QVariant* > が問題なくコンパイルされることがわかると思います。

大きな注意点: 私は Qt の専門家ではないので、これについては間違っているかもしれません。しかし、うまくいけば、少なくともこれにより、正しい方向に考えることができます.

于 2011-05-30T15:19:45.207 に答える