Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

delete QTableWidgetItem



  • Hallo,

    ich habe ein Programm gebaut, in dem ich eine QStringList in einem QTableWidget darstelle.
    Meine QStringList ändert sich regelmäßig im Programm. Es kommen nicht nur Zeilen hinzu oder weg, sondern es kann auch mal eine komplett neue Liste sein. Um die Liste darzustellen, rufe ich bei Änderung der Liste folgende Funktion auf:

    void classX::List_to_widget()
    {
        QStringList stringList = objectX->List(); 
        ui->tableWidget->setSortingEnabled(false);
        int z=  ui->tableWidget->rowCount();
        for(int a=0; a < z; a++){
            ui->tableWidget->removeRow(0);
        }
    
    
        for(int i = 0; i< stringList.size(); i++){
    
            ui->tableWidget->insertRow(ui->tableWidget->rowCount());
            ui->tableWidget->setItem(i,0, new QTableWidgetItem());
            ui->tableWidget->setItem(i,1, new QTableWidgetItem());
            ui->tableWidget->setItem(i,2, new QTableWidgetItem());
            ui->tableWidget->setItem(i,3, new QTableWidgetItem());
            ui->tableWidget->setItem(i,4, new QTableWidgetItem());
            ui->tableWidget->setItem(i,5, new QTableWidgetItem());
            ui->tableWidget->setItem(i,6, new QTableWidgetItem());
            ui->tableWidget->setItem(i,7, new QTableWidgetItem());
            ui->tableWidget->item(i,0)->setText(stringList[i].section(";",0,0));
            ui->tableWidget->item(i,1)->setText(stringList[i].section(";",1,1));
            ui->tableWidget->item(i,2)->setText(stringList[i].section(";",2,2));
            ui->tableWidget->item(i,3)->setText(stringList[i].section(";",3,3));
            ui->tableWidget->item(i,4)->setText(stringList[i].section(";",4,4));
            ui->tableWidget->item(i,5)->setText(stringList[i].section(";",5,5));
            ui->tableWidget->item(i,6)->setText(stringList[i].section(";",6,6));
        }
    
        ui->tableWidget->setSortingEnabled(true);
        ui->tableWidget->sortByColumn(0,Qt::AscendingOrder);
    
    }
    

    Da ich die Funktion immer wieder aufrufe, erstelle ich ja auch immer wieder neue "QTableWdigetItems". Da man Objekte, die mit "new" erzeugt wurden, auch wieder löschen sollte, stehe ich nun vor der Frage: wie kann ich das in diesem Fall machen? Oder übernimmt das sogar die Funktion tableWidget->removeRow(0); für mich? Ich finde einfach keinen Weg, auf die items zuzugreifen um diese zu löschen.
    Könnt ihr mir einen Tipp geben?

    Außerdem: Was kann passieren, wenn ich das löschen nicht tue? Das Programm funktioniert ohne Probleme, auch nach 10000 aufrufen der Funktion. (Getestet mit Schleife). Klar, es wir unnötig Speicher belegt, aber kann das auch zu einem Absturz oder ähnlichem führen?

    Danke für die Hilfe.


  • Lifetime Qt Champion

    Ich wüsste nicht warum Du hier QTableWidgetItems löschen solltest denn die Dokumentation dazu ist eindeutig: 'The table takes ownership of the item.'


  • Moderators

    @tobaias meinst du nicht, das hier wäre hier nen guter Zeitpunkt, um der Geschichte ein richtiges TableModel zu spendieren?



  • Danke für eure Antworten. Wenn delete nicht notwendig ist, passt das ja.

    Zum Vorschlag "QTableModel": ja, ich schätze du hast Recht. Allerdings müsste ich mich da nochmal einarbeiten, da ich die Klasse nicht kenne. Und mit meiner Funktion habe ich meine Anforderungen eigentlichen erfüllt.... mehr mache ich mit der Tabelle nicht.


Log in to reply