Seite 1 von 1

QTreeWidget - Hinzufügen einer Referenz in setData

Verfasst: 8. März 2010 09:40
von Thomas_Z
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

Re: QTreeWidget - Hinzufügen einer Referenz in setData

Verfasst: 8. März 2010 09:54
von franzf
Thomas_Z hat geschrieben:Ist der Ansatz QVariant zu erweitern eher falsch? Ich hab gelesen diese Klasse soll nicht erweitert werden.
QVariant hat keinen virtuellen Destruktor. Du verwendest QVariant über Basisklassenreferenzen/Values. Das KANN nur schief gehen.
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.

Verfasst: 8. März 2010 10:15
von Thomas_Z
es würde nichts dagegen sprechen, nur hab ich da zu wenig Ahnung. Ich hab einfach mal angefangen das zu bauen und nun steck ich.
Wie kann ich in die DataRoles daten ablegen?

Verfasst: 8. März 2010 10:17
von franzf
Thomas_Z hat geschrieben:Wie kann ich in die DataRoles daten ablegen?
Hab ich dir in dem Codebeispiel gezeigt ;)
Musst dir nur merken, welchen Offset du für welchen Wert verwendest.

Verfasst: 8. März 2010 10:29
von Thomas_Z
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

Verfasst: 8. März 2010 10:37
von franzf
Google -> "store pointer in QVariant"
u.A.
-> http://doc.trolltech.com/4.6/qvariant.h ... tFromValue

Verfasst: 8. März 2010 10:38
von Thomas_Z
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