PDA

View Full Version : Reimplemented QStandardItem. Drag&Drop



Miga
21st May 2012, 10:32
Hello!
I would like to realize drag&drop with reimplemented QStandardItemModel. QStandardItem also reimplemented. It looks like:

class _DLL_PREFIX_ TMyItem : public QStandardItem
{
public:
virtual QVariant data(int role = Qt::UserRole + 1) const;
virtual void setData(const QVariant &value, int role = Qt::UserRole + 1);

private:
TElementData *m_pElementData;
}

QVariant TMyItem::data(int role) const
{
if (role == Qt::UserRole+1)
{
return QVariant::fromValue(m_pElementData);
}
return QStandardItem::data(role);
}

void TMyItem::setData(const QVariant &value, int role)
{
if (role == Qt::UserRole+1)
{
ASSERT(value.canConvert<TElementData *>())
m_pElementData = value.value<TElementData*>()->clone();
return;
}

QStandardItem::setData(value, role);
}



When I try to drag an element within the model (to reorder elements) I find out that user data is not copied (m_pElementData = NULL in the dropped element). I think I should reimplement some other functions to make all this work correctly. But I'm not quite sure what functions and in what classes. It seems to me that: QStandardItemModel::mimeData(...), maybe QStandardItemModel::itemData (...)? Something else?

Thanks in advance.

Miga
3rd July 2012, 07:12
So, maybe this will be useful for somebody. The following was done.
TMyModel : public QStandardItemModel
Reimplemented metods: itemData, setItemData, data, setData.
TMyItem : public QStandardItem
Reimplemented methods: data, setData

Don't forget:

Q_DECLARE_METATYPE(TElementData*)

qRegisterMetaType<TElementData*>("TDataPtr");
qRegisterMetaTypeStreamOperators<TElementData*>("TDataPtr");

Realize functions:

QDataStream &operator<<(QDataStream &Out, const TElementData* pElement)
QDataStream &operator>>(QDataStream &In, TElementData* &pElement)