Ich will in einem QTreeWidgetItem eine Referenz zu einem Objekt in setData hinzufügen, da ich beim anklicken, den ausgewählten Knoten, aktivieren will.
Momentan nehme ich die ID (ist später nicht mehr brauchbar) zum testen.
BeispielCode:
QTreeWidgetItem *twi_tbi = new QTreeWidgetItem();
CometNodeVariant *itemVariant = new CometNodeVariant(QVariant::STRING);
itemVariant->setValue(node);
// funktioniert nicht twi_tbi->setData(0,Qt::UserRole, itemVariant);
/* -> wegen Testzwecke */ twi_tbi->setData(0,Qt::UserRole, node->nodeId());
itemVariant ist von QVariant abgeleitet und besitzt zusätzlich eine ObjectReferenz zu einem Knoten des Types CometSvgNode.
Ist der Ansatz QVariant zu erweitern eher falsch? Ich hab gelesen diese Klasse soll nicht erweitert werden.
Wie werden Referenzen in einem QTreeWidgetItem, bzw. QTreeWidget gehandhabt? Ist das Signal Slot Konzept zu verwenden?
SIGNAL clicked beim QTreeWidget
SLOT activate beim Knoten?
Ich Danke um Hilfe,
Thomas
QTreeWidget - Hinzufügen einer Referenz in setData
Re: QTreeWidget - Hinzufügen einer Referenz in setData
QVariant hat keinen virtuellen Destruktor. Du verwendest QVariant über Basisklassenreferenzen/Values. Das KANN nur schief gehen.Thomas_Z hat geschrieben:Ist der Ansatz QVariant zu erweitern eher falsch? Ich hab gelesen diese Klasse soll nicht erweitert werden.
Das ist übrigens das selbe Problem, wenn du anfängst std::list oder andere STL-Container abzuleiten, das ist NICHT vorgesehen.
Was spricht denn dagegen, einfach in verschiedenen dataroles deine Daten abzulegen?
Code: Alles auswählen
twi_tbi->setData(0,Qt::UserRole+1, nodeId);
twi_tbi->setData(0,Qt::UserRole+2, cometSvgNodePtr);
// usw.ich bekomm da:
void CometSvgTree::startAddSvgNode(CometSvgNode *node){
//NEW TREE ITEM
QTreeWidgetItem *twi_tbi = new QTreeWidgetItem();
twi_tbi->setData(0,Qt::UserRole+1, node);
}
nen fehler:
____________________-
c:\Qt\2010.02\qt\include/QtCore/../../src/corelib/kernel/qvariant.h:425: error: 'QVariant::QVariant(void*)' is private
____________________-
C:/Users/Arbeit/Documents/Qt_Projects/Comet_1_0_0_2/Comet_Handler/svg/cometsvgtree.cpp:75: error: within this context
void CometSvgTree::startAddSvgNode(CometSvgNode *node){
//NEW TREE ITEM
QTreeWidgetItem *twi_tbi = new QTreeWidgetItem();
twi_tbi->setData(0,Qt::UserRole+1, node);
}
nen fehler:
____________________-
c:\Qt\2010.02\qt\include/QtCore/../../src/corelib/kernel/qvariant.h:425: error: 'QVariant::QVariant(void*)' is private
____________________-
C:/Users/Arbeit/Documents/Qt_Projects/Comet_1_0_0_2/Comet_Handler/svg/cometsvgtree.cpp:75: error: within this context
Google -> "store pointer in QVariant"
u.A.
-> http://doc.trolltech.com/4.6/qvariant.h ... tFromValue
u.A.
-> http://doc.trolltech.com/4.6/qvariant.h ... tFromValue
genau das war es!
Zirka die Lösung, falls es wen interessiert:
das setzen der Reference:
QVariant data = qVariantFromValue(node);
qVariantSetValue(data, node);
twi_tbi->setData(0,Qt::UserRole, data);
____________________________________
das lesen der Reference:
QTreeWidgetItem *item = currentItem();
QVariant dataID = item->data(0,Qt::UserRole);
CometSvgNode *nodeRef = qVariantValue<CometSvgNode *>(item->data(0, Qt::UserRole));
if(nodeRef != NULL)
nodeRef->activate();
____________________________________
in der <headerdatei.h>:
Q_DECLARE_METATYPE(CometSvgNode*)
vielen Dank für die Hilfe
Zirka die Lösung, falls es wen interessiert:
das setzen der Reference:
QVariant data = qVariantFromValue(node);
qVariantSetValue(data, node);
twi_tbi->setData(0,Qt::UserRole, data);
____________________________________
das lesen der Reference:
QTreeWidgetItem *item = currentItem();
QVariant dataID = item->data(0,Qt::UserRole);
CometSvgNode *nodeRef = qVariantValue<CometSvgNode *>(item->data(0, Qt::UserRole));
if(nodeRef != NULL)
nodeRef->activate();
____________________________________
in der <headerdatei.h>:
Q_DECLARE_METATYPE(CometSvgNode*)
vielen Dank für die Hilfe