为什么QTableView的行数不会更新?

3
我创建了一个名为PresetTableModel的QAbstractTableModel,并将其连接到一个QTableView。我实现了rowCount、columnCount和data函数。如果我让rowCount返回一个固定的数字,一切都能正常工作,但是一旦我让它返回一个可变值,列表视图就不会显示任何行。下面代码中的调试语句显示大小值从0开始,但一旦列表被填充,就会改变为9。
int PresetTableModel::rowCount(const QModelIndex & /*parent*/) const
{
    qDebug() << preset_list.count();
    return preset_list.size();
}

有没有其他需要我做的事情来强制更新行数?

为什么不在qDebug和return语句中调用同一个函数? - Karlson
谢谢Karlson,我试过了,但没有任何改变。 - user672033
尝试一下:将列表的长度设置为变量并尝试返回它。看看是否会有任何不同。我不确定为什么会有差别,但试试也无妨。 - Karlson
2个回答

7

在修改底层数据时,必须使用模型的通知机制来通知视图。例如,在添加数据时:

beginInsertRows(QModelIndex(), preset_list.size(), preset_list.size()+1); //notify that two rows will be appended (rows size() and size() + 1)
preset_list.append(something);
preset_list.append(somethingelse);
endInsertRows(); //notify views that you're done with modifying the underlying data 

因此,在删除行时,需要调用beginRemoveRows()和endRemoveRows()函数,并在更新现有条目时发射dataChanged()信号。
另外,您的rowCount()方法应该如下所示。
if (!parent.isValid())
    return preset_list.size(); //top-level: return list size
else
    return 0; //list item: no further children (flat list)

限制深度。否则列表中的每个项目都会再次具有 preset_list.size() 个条目。

3

我使用:

 void refresh() {
    emit dataChanged(index(0, 0),
                     index(rowCount(), columnCount()));  // update whole view
    emit layoutChanged();
  }

这个确实可以工作,但是你应该使用:emit dataChanged(index(0, 0), index(rowCount() - 1, columnCount() - 1));因为这些值是索引,而不是计数。 - Ph0t0n

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接