QT QTableWidget :: item()即使在分配给它的小部件时也返回nullptr

时间:2014-12-12 03:12:35

标签: c++ qt

这让我疯了。这是相关代码:

//Inside UI class
QTableWidget *table_view;

后来,

QLabel* lb_param_id = new QLabel(this);
lb_param_id->setText(QString::number(param_id));

QLabel* lb_param_name = new QLabel(this);
lb_param_name->setText(QString(param_name));

QLineEdit* te_value = new QLineEdit(this);
te_value->setText(QString(value));

QPushButton* pb_command = new QPushButton();
pb_command->setText("Change");

...

if(ui->table_view->rowCount() <= param_id)
    ui->table_view->setRowCount(param_id + 1);

ui->table_view->setCellWidget(param_id, 0, lb_param_id);
ui->table_view->setCellWidget(param_id, 1, lb_param_name);
ui->table_view->setCellWidget(param_id, 2, te_value);
ui->table_view->setCellWidget(param_id, 3, pb_command);

for(int i =0; i < ui->table_view->rowCount(); ++i)
{
    for(int j = 0; j < ui->table_view->columnCount(); ++j)
    {
        QTableWidgetItem* item = ui->table_view->item(i, j);

        //Here, item is nullptr. Why?
        item->setForeground(QColor::fromRgb(255,255,255));
    }
}

我设置了小部件,然后尝试更改QTableWidget内所有小部件的前景。但是,从ui->table_view->item()返回的是nullptr。这里发生了什么?顺便说一句,列计数在初始化时设置。

1 个答案:

答案 0 :(得分:0)

添加以下几行代码。

if(ui->table_view->rowCount() <= param_id)
    ui->table_view->setRowCount(param_id + 1);

ui->table_view->setColumnCount(4);

ui->table_view->setItem(param_id, 0, new QTableWidgetItem());
ui->table_view->setItem(param_id, 1, new QTableWidgetItem());
ui->table_view->setItem(param_id, 2, new QTableWidgetItem());
ui->table_view->setItem(param_id, 3, new QTableWidgetItem());

ui->table_view->setCellWidget(param_id, 0, lb_param_id);
...

基本上,您需要先将数据插入单元格,然后才能设置窗口小部件。在您的情况下,您没有充分的数据意义。

检查qt源代码,这就是setCellWidget()如何实现的:

   void QTableWidget::setCellWidget(int row, int column, QWidget *widget)
   {
       QModelIndex index = model()->index(row, column, QModelIndex());
       QAbstractItemView::setIndexWidget(index, widget);
   }

不先设置单元格,模型索引是无效索引。我同意如果返回的索引无效,qt应该插入数据。目前,您必须使用qt代码。