Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : QT Listview Sortierung



BSW
23-08-2004, 15:09
Ich hab Probleme mit einem Listview
DasListview sollte so aussehen

Text1
+Text2
++Text3.1
++Text3.2
++Text3.3

Sie sieht aber so aus:
Text1
+Text2
++Text3.1
+++Text3.2
++++Text3.3

Was habe ich in meinem Code falschgemacht?
Ich hab eine Liste erstellt ung gehe diese mit einer for-Schleife mit dem Parameter list.at(i) durch!

Vielleicht kann mir hier einer helfen? Ich bin ratlos :confused:



QPtrList<CicdNode> list;
list.setAutoDelete( TRUE );
list.append( new CicdNode(&test,"Symptome und abnorme ...","Kapitel 9",1,0) );
list.append( new CicdNode(&test,"Allgemeinsymptome","R50",0,2) );
list.append( new CicdNode(&test,"Fieber unbekanter Ursache","R50.-",0,0) );
list.append( new CicdNode(&test,"Fieber mit Schüttelfrost","R50.0",0,0) );
list.append( new CicdNode(&test,"Anhaltendes Fieber","R50.1",0,0) );
list.append( new CicdNode(&test,"Fieber, nicht näher bezeichnet","R50.9",0,0) );
ICD10LView->clear();
ICD10LView->setSorting(-1);
ICD10LView->setRootIsDecorated( TRUE );
for (uint i = 0; i< list.count();++i)
{
if ( list.at(i) )
{
if( ( (list.at(i)->isSymptom==2) || (list.at(i)->isSymptom==0) ) && (list.at(i)->isDisease!=1) )
{
if((ICD10LView->currentItem() == NULL) )
{
QListViewItem *p_item = new QListViewItem( ICD10LView, list.at(i)->text, list.at(i)->code );
p_item->setOpen( TRUE );
}
else
{
if(list.at(i)->isSymptom < list.at(i-1)->isSymptom)
{
QMessageBox::critical( this, "ERROR","Erstes Child erstellen");
QListViewItem *sub_item = new QListViewItem( ICD10LView->currentItem(), 0);
sub_item->setText(0, list.at(i)->text);
sub_item->setText(1, list.at(i)->code);
sub_item->setOpen( TRUE );
}
//Kinder beim ersten Kind einfügen
else if( (list.at(i)->isSymptom == list.at(i-1)->isSymptom) && i==3)
{
QMessageBox::critical( this, "ERROR","List = List-1");
QListViewItem *sub_item2 = new QListViewItem( ICD10LView->lastItem()/*ICD10LView->currentItem()*/, 0/*ICD10LView->lastItem()*/ );
sub_item2->setText(0, list.at(i)->text);
sub_item2->setText(1, list.at(i)->code);
}
else
{
QMessageBox::critical( this, "ERROR","List = List-1 new S3");
QListViewItem *sub_item3 = new QListViewItem( ICD10LView->lastItem()/**/, ICD10LView->lastItem() );
sub_item3->setText(0, list.at(i)->text);
sub_item3->setText(1, list.at(i)->code);
}
}
}
}
}

anda_skoa
23-08-2004, 15:28
Dein Problem ist, dass du lastItem() als Parent jedes neuen Subitems angibst, also immer das zuletzt eingefügte.
Dadurch hat jeder Eintrag wieder genau ein Kind.

Du musst den Pointer für "Text2" als Parent aller seiner Kinder angeben.

Ciao,
_

BSW
23-08-2004, 15:41
Also müsste dann bei sub_item2 das so stehen:

QListViewItem *sub_item2 = new QListViewItem( sub_item, 0);

Dann krieg ich einen Error beim Compilieren
error C2065: 'sub_item' : undeclared identifier

anda_skoa
23-08-2004, 16:16
sub_item ist bei dir auch eine lokale Variable in einem inneren Block, die logischerweise im anderen Block nicht mehr sichtbar ist.

Ciao,
_

BSW
23-08-2004, 16:25
Ups, das ist ja tatsächlich eine lokale Var. :o

Weißt DU vielleicht eine andere Lösung?

anda_skoa
23-08-2004, 19:19
Du musst sub_var nur eine Stufe höher deklarieren.

Ciao,
_

BSW
23-08-2004, 19:38
Ich bin heute abend etwas begriffsstutzig!
Sub-var eine Stufe höher deklarieren?

Haste vielleicht mal ein Code-Beispiel?

Vielleicht bin ich morgen wieder wach und kapier es dann!

anda_skoa
23-08-2004, 20:06
for (uint i = 0; i< list.count();++i)
{
if ( list.at(i) )
{
if( ( (list.at(i)->isSymptom==2) || (list.at(i)->isSymptom==0) ) && (list.at(i)->isDisease!=1) )
{
if((ICD10LView->currentItem() == NULL) )
{
QListViewItem *p_item = new QListViewItem( ICD10LView, list.at(i)->text, list.at(i)->code );
p_item->setOpen( TRUE );
}
else
{
QListViewItem *sub_item = 0; // <--- hier deklarieren
if(list.at(i)->isSymptom < list.at(i-1)->isSymptom)
{
QMessageBox::critical( this, "ERROR","Erstes Child erstellen");
sub_item = new QListViewItem( ICD10LView->currentItem(), 0);
sub_item->setText(0, list.at(i)->text);
sub_item->setText(1, list.at(i)->code);
sub_item->setOpen( TRUE );
}
//Kinder beim ersten Kind einfügen
else if( (list.at(i)->isSymptom == list.at(i-1)->isSymptom) && i==3)
{
QMessageBox::critical( this, "ERROR","List = List-1");
QListViewItem *sub_item2 = new QListViewItem( ICD10LView->lastItem()/*ICD10LView->currentItem()*/, 0/*ICD10LView->lastItem()*/ );
sub_item2->setText(0, list.at(i)->text);
sub_item2->setText(1, list.at(i)->code);
}
else
{
QMessageBox::critical( this, "ERROR","List = List-1 new S3");
QListViewItem *sub_item3 = new QListViewItem( ICD10LView->lastItem()/**/, ICD10LView->lastItem() );
sub_item3->setText(0, list.at(i)->text);
sub_item3->setText(1, list.at(i)->code);
}
}
}
}
}

BSW
24-08-2004, 08:12
Ich hasb das sub_item wie beschrieben deklariert und das sub_item wie unten im Code eingefügt!

Jetzt schmiert das Prog nach QMessageBox::critical( this, "ERROR","List = List-1"); ab.
Siehe Bild: Absturz Bild (http://www.shadow-zone.com/Error.jpg)

QT ist echt grausig! :(



else
{
QListViewItem *sub_item = 0; // <--- hier deklarieren
if(list.at(i)->isSymptom < list.at(i-1)->isSymptom)
{
QMessageBox::critical( this, "ERROR","Erstes Child erstellen");
sub_item = new QListViewItem( ICD10LView->currentItem(), 0);
sub_item->setText(0, list.at(i)->text);
sub_item->setText(1, list.at(i)->code);
sub_item->setOpen( TRUE );
}
//Kinder beim ersten Kind einfügen
else if( (list.at(i)->isSymptom == list.at(i-1)->isSymptom) && i==3)
{
QMessageBox::critical( this, "ERROR","List = List-1");
QListViewItem *sub_item2 = new QListViewItem( sub_item, 0 );
sub_item2->setText(0, list.at(i)->text);
sub_item2->setText(1, list.at(i)->code);
}
else
{
QMessageBox::critical( this, "ERROR","List = List-1 new S3");
QListViewItem *sub_item3 = new QListViewItem( sub_item, 0/*ICD10LView->lastItem()*/ );
sub_item3->setText(0, list.at(i)->text);
sub_item3->setText(1, list.at(i)->code);
}
}

anda_skoa
24-08-2004, 19:39
Fehler meinerseits: du musst die Deklaration außerhalb der Schleife machen.

Am besten vor der Verwendung von sub_item im Konstruktoraufruf des Kinder überprüfen, ob es != 0 ist.

Ciao,
_