【问题标题】:QTableWidget setItem() segmentation fault using Qt使用 Qt 的 QTableWidget setItem() 分段错误
【发布时间】:2011-03-26 17:01:42
【问题描述】:

我正在使用以下代码向 QTableWidget 添加一行。

QTableWidgetItem *item = new QTableWidgetItem(fileName);
item->setCheckState(Qt::Checked);

QComboBox *cmb = new QComboBox(this->list);
cmb->addItem("one");
cmb->addItem("two");

this->list->setRowCount(this->list->rowCount()+1);
this->list->setItem(this->list->rowCount()-1,0,item);
this->list->setCellWidget(this->list->rowCount()-1,1,cmb);

表格中有 2 列。 “item”放在第一个,“cmb”放在第二个。使用此代码,我可以成功地将 1 行添加到表中,但是当我尝试添加第二行时,出现分段错误。 它在 this->list->setItem() 调用时崩溃。

知道它为什么会崩溃吗?

谢谢!

【问题讨论】:

  • 试过你的代码,它对我来说很好;没有分段错误向表格小部件添加超过 1 行。我正在使用 ubuntu 10.10 Qt 4.7.1

标签: qt segmentation-fault fault qtablewidget


【解决方案1】:

我不知道为什么您的代码不能按原样运行,但请执行以下操作:

int N = list->rowCount(); //The problem may lie in multiple rowCount() calls somehow
list->insertRow(N);
list->setItem(N,0,item);
list->setCellWidget(N,1,cmb);

另外,你使用“this->”有什么特别的原因吗?在这种情况下,它通常是完全多余的。

【讨论】:

  • 我只是用这个-> 因为我觉得它更清楚......我现在通过两次使用 setCellWidget 并删除 setItem.. 来解决它
【解决方案2】:

我的代码和你非常相似,它也崩溃了......

QTableWidgetItem* columnOne = new QTableWidgetItem();
columnOne->setCheckState(Qt::Checked);
QTableWidgetItem* columnTwo = new QTableWidgetItem("Some Text");

int row = tableWidget->rowCount();
tableWidget->insertRow(row);
tableWidget->setItem(row, 0, columnOne);
tableWidget->setItem(row, 1, columnTwo);

但是,如果我更改了 setItem 调用的顺序以便最后添加检查状态,那么它就起作用了。所以这是代码工作......

QTableWidgetItem* columnOne = new QTableWidgetItem();
columnOne->setCheckState(Qt::Checked);
QTableWidgetItem* columnTwo = new QTableWidgetItem("Some Text");

int row = tableWidget->rowCount();
tableWidget->insertRow(row);
tableWidget->setItem(row, 1, columnTwo);
tableWidget->setItem(row, 0, columnOne);

【讨论】:

    【解决方案3】:

    问题在这一行(您将一些列表和 QTableWidget 命名为相同:“列表”):

    this->list->setRowCount(this->list->rowCount()+1)

    this->list->rowCount()+1 将始终返回 0+1=1,因此您可以将第一行添加到表中,但不能添加第二行。

    解决方案:将 QTableWidget 命名为“list”以外的名称,例如:

    this->myTableWidget->setRowCount(this->list->rowCount()+1);
    this->myTableWidget->setItem(this->list->rowCount()-1,0,item);
    this->myTableWidget->setCellWidget(this->list->rowCount()-1,1,cmb);
    

    【讨论】:

      【解决方案4】:

      我的代码中的这个问题是由于 cellChanged SLOT 中的逻辑而发生的。我试图在尚未实际创建的 QTableWidget 中设置文本。

      【讨论】:

        猜你喜欢
        • 2023-04-01
        • 2018-08-02
        • 1970-01-01
        • 2019-01-12
        • 1970-01-01
        • 1970-01-01
        • 2021-10-28
        • 1970-01-01
        • 2018-09-14
        相关资源
        最近更新 更多