Хранение указателей с использованием QListWidgetItem :: setData - PullRequest
10 голосов
/ 12 февраля 2012

У меня есть QListWidget календарей. Каждый QListWidgetItem логически связан с экземпляром Calendar, который является классом, относящимся к стороне модели приложения.

Могу ли я сохранить эту ассоциацию в виде указателя, используя QListWidgetItem::setData? Когда я пытаюсь сделать это, я получаю следующую ошибку:

ошибка: 'QVariant :: QVariant (void *)' является приватным

Ответы [ 2 ]

26 голосов
/ 12 февраля 2012

Существует другой конструктор для void *: QVariant::QVariant(int typeOrUserType, const void * copy), где вы должны передать уникальное целое число для представления типа указателя.

Но, как указано в документации, вы можете объявить тип указателя с помощью Q_DECLARE_METATYPE(Calendar*)и используйте QVariant::fromValue<Calendar*>(...) и QVariant::value<Calendar*>() для хранения и извлечения значения.

Или вместо этого, поскольку вы используете QListWidget вместо обычной модели, вы можете просто создать подкласс QListWidgetItem и добавитьCalendar* переменная-член с необходимыми средствами доступа, чтобы избежать накладных расходов при использовании QVariant.

0 голосов
/ 10 октября 2012

Я бы посоветовал взглянуть и на это решение, которое я считаю довольно элегантным: (есть небольшие синтаксические ошибки, но вы быстро их обнаружите, иначе компилятор выдаст ошибку)

http://blog.bigpixel.ro/2010/04/storing-pointer-in-qvariant/

...