QTWidgets QTableWidget 因段错误而崩溃
QTWidgets QTableWidget crash with segfault
我在 QPushButton 上有这个信号:
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"));
}
}
但是每次单击按钮时它都会因分段错误而崩溃。据我了解, item(...) 给出 nullptr 但为什么呢?
您必须设置列数并且必须手动设置项目:
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"));
}
由于您没有指定行数和列数,因此您的 QTableWidget
从 0 行和 0 列开始,添加 1 行仍然会留下 0 列。
此外,您必须先通过 setItem
before you can access them via item
创建您的项目
请查看文档中的 overview。
另一个注意事项:
在 if (ui->nodesTable->rowCount() > 1)
的 else
分支中
rowCount() == 0
,因此您访问了 ui->nodesTable->item(-1, 0)
,这是越界的。
第一次在您的 table 中没有项目时,如果指针指向非指针并且当您想要访问它时,您的应用程序崩溃了!
试试这个;
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")));
}
}
我在 QPushButton 上有这个信号:
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"));
}
}
但是每次单击按钮时它都会因分段错误而崩溃。据我了解, item(...) 给出 nullptr 但为什么呢?
您必须设置列数并且必须手动设置项目:
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"));
}
由于您没有指定行数和列数,因此您的 QTableWidget
从 0 行和 0 列开始,添加 1 行仍然会留下 0 列。
此外,您必须先通过 setItem
before you can access them via item
请查看文档中的 overview。
另一个注意事项:
在 if (ui->nodesTable->rowCount() > 1)
的 else
分支中
rowCount() == 0
,因此您访问了 ui->nodesTable->item(-1, 0)
,这是越界的。
第一次在您的 table 中没有项目时,如果指针指向非指针并且当您想要访问它时,您的应用程序崩溃了!
试试这个;
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")));
}
}