2017-10-19 2 views
1

Ich habe dieses Signal auf QPushButton:QTWidgets QTableWidget Absturz mit segfault

void MainWindow::on_addNode_clicked() 
{ 
    ui->nodesTable->insertRow(ui->nodesTable->rowCount()); 
    if(ui->nodesTable->rowCount()>1) 
    { 
     ui->nodesTable->item(ui->nodesTable->rowCount()-1, 0)->setText(ui->nodesTable->item(ui->nodesTable->rowCount()-2,0)->text()); 
    } 
    else 
    { 
     ui->nodesTable->item(ui->nodesTable->rowCount()-1, 0)->setText(QString::fromStdString("0")); 
    } 
} 

Aber es stürzt mit Zugriffsfehlern jedes Mal, wenn ich auf die Schaltfläche klicken. Wie ich verstanden habe, geben (...) nullptr aber warum?

Antwort

0

Beim ersten Mal ist kein Element in Ihrer Tabelle, Ihre Anwendung stürzte ab, wenn der Zeiger nicht zeigte und wenn Sie es erreichen wollen!

versuchen Sie dies;

void MainWindow::on_addNode_clicked() 
{ 
    ui->nodesTable->insertRow(ui->nodesTable->rowCount()); 
    if(!ui->nodesTable->rowCount()) 
    { 
     ui->nodesTable->item(ui->nodesTable->rowCount()-1, 0)->setText(ui->nodesTable->item(ui->nodesTable->rowCount()-2,0)->text()); 
    } 
    else 
    { 
     ui->nodesTable->setItem(0, 0,new QTableWidgetItem(QString("New Item"))); 
    } 
} 
0

Sie haben die Spaltenanzahl festlegen und Sie müssen den Artikel manuell einstellen:

ui->nodesTable->setColumnCount(1); 
ui->nodesTable->insertRow(ui->nodesTable->rowCount()); 
ui->nodesTable->setItem(ui->nodesTable->rowCount()-1, 0, new QTableWidgetItem("0")); 
if(ui->nodesTable->rowCount()>1) 
{ 
    ui->nodesTable->item(ui->nodesTable->rowCount()-1, 0)->setText(ui->nodesTable->item(ui->nodesTable->rowCount()-2,0)->text()); 
} 
else 
{ 
    ui->nodesTable->item(ui->nodesTable->rowCount()-1, 0)->setText(QString::fromStdString("0")); 
} 
+0

Aber ich habe Spalten in UI Disigner in QTCreator gemacht. Und ich muss den Wert aus einer anderen Zeile setzen, wenn sie da ist. – dimas

2

Da Sie nicht die Anzahl der Zeilen und Spalten Ihre QTableWidget beginnt mit 0 Zeilen und Spalten 0 angegeben haben, Zugabe von 1 Zeile lässt Sie immer noch mit 0 Spalten.

Zusätzlich müssen Sie Ihre Artikel zuerst über setItem erstellen, bevor Sie sie über item

Bitte werfen Sie einen Blick auf die overview in der Dokumentation zugreifen können.

Auf einer anderen Anmerkung:
Im else Filiale Ihrer if (ui->nodesTable->rowCount() > 1) rowCount() == 0 und damit Zugriff auf Sie ui->nodesTable->item(-1, 0), die außerhalb der Grenzen ist.