Можно так сделать:
| Код | struct Item { int posIndex; bool isWrite; }; // объявляем новый мета-тип, чтобы можно было поместить в QVariant Q_DECLARE_METATYPE(Item) ... Item item; item.isWrite = false; item.posIndex = 2; // создаем динамическое свойство item и конвертируем в QVariant label->setProperty("item", qVariantFromValue(item)); ... QVariant var = label->property("item"); // проверяем возможно ли конвертирование, если нет, то выводим отладочное сообщение (debug) Q_ASSERT(qVariantCanConvert<Item>(var)); // преобразуем из QVariant в Item Item labelItem = qvariant_cast<Item>(var);
|
Или так:
| Код | typedef QPair<int, bool> Item; Q_DECLARE_METATYPE(Item) ... Item item; item.first = 2; item.second = false; ui->label->setProperty("item", qVariantFromValue(item)); QVariant var = ui->label->property("item"); Q_ASSERT(qVariantCanConvert<Item>(var)); Item labelItem = qvariant_cast<Item>(var);
|
Или так:
| Код | struct Item { int posIndex; bool isWrite; }; typedef QSharedPointer<Item> psItem; typedef QWeakPointer<Item> pwItem; Q_DECLARE_METATYPE(pwItem) ... psItem item(new Item); item->posIndex = 2; item->isWrite = false; // получаем слабый указатель, чтобы контролировать время жизни объекта ui->label->setProperty("item", qVariantFromValue(item.toWeakRef())); ... QVariant var = ui->label->property("item"); Q_ASSERT(qVariantCanConvert<pwItem>(var)); pwItem pwLabelItem = qvariant_cast<pwItem>(var); // пытаемся преобразовать слабый указатель на умный указатель psItem psLabelItem = pwLabelItem.toStrongRef(); // если объект уже удален сообщаем об этом в консоль Q_ASSERT(psLabelItem);
|
Я намеренно убрал указатель на QLabel, чтобы не смешивать GUI и бизнес логику. И если уж вообще никак не получается не смешивать, то лучше тогда держать указатель на QObject.
| Код | struct Item { QWeakPointer<QObject> object; int posIndex; bool isWrite; };
typedef QSharedPointer<Item> psItem; typedef QWeakPointer<Item> pwItem; Q_DECLARE_METATYPE(pwItem) ... psItem item(new Item); { item->object = QWeakPointer<QObject>(ui->label); item->posIndex = 2; item->isWrite = false;
ui->label->setProperty("item", qVariantFromValue(item.toWeakRef())); }
QVariant var = ui->label->property("item"); { Q_ASSERT(qVariantCanConvert<pwItem>(var)); pwItem pwLabelItem = qvariant_cast<pwItem>(var);
psItem psLabelItem = pwLabelItem.toStrongRef(); QObject* object = psLabelItem->object.data();
Q_CHECK_PTR(object); Q_ASSERT(psLabelItem);
QLabel* label = 0;
if (object->isWidgetType() && object->inherits("QLabel")) label = qobject_cast<QLabel*>(object);
Q_CHECK_PTR(label);
qDebug() << psLabelItem->isWrite << psLabelItem->posIndex << label->text(); }
|
|