Сохранение указателей с помощью QListWidgetItem:: setData

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

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

error: 'QVariant:: QVariant (void *)' является закрытым

Ответ 1

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

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

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

Ответ 2

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

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