QTableView:动态更改rowCount
Posted
技术标签:
【中文标题】QTableView:动态更改rowCount【英文标题】:QTableView: change rowCount on the fly 【发布时间】:2017-08-08 10:11:55 【问题描述】:我使用QTableView
来显示只读数据。该模型基于包含另一个QList
的自定义类型的QList
。像这样的:
typedef struct
int range;
QString description;
Field;
typedef struct
QString name;
QList<Field> fields;
Item;
QList<Item> items;
在我的QAbstractTableModel
实现中,我有一个插槽可以选择当前的item
:
void setCurrentItem(int idx)
// checks for errors (omissis)
currentItemIdx = idx;
// ask to redraw the table
emit dataChanged(this->index(0, 0), this->index(rowCount(), columnCount()));
所有模型的逻辑都依赖于那个item,例如:
int MyModel::rowCount(const QModelIndex&) const
return items.at(m_currentItemIdx).fields.count();
QVariant MyModel::data(const QModelIndex &index, int role) const
if (!index.isValid()) return QVariant();
if (index.row() >= items.at(m_currentItemIdx).fields.count()) return QVariant();
Field f = items.at(m_currentItemIdx).fields.at(index.row);
switch (role)
case Qt::DisplayRole:
switch (index.column())
case 0:
return f.range;
break;
case 1:
return f.description;
break;
default:
return QVariant();
break;
return QVariant();
问题是当我使用 setCurrentItem()
更改当前项目时,代码使用新数据,但 QTableView
不会更改其行,然后不会请求新内容。
我认为emit dataChanged()
足够了,但似乎没有。
我应该怎么做才能通知视图我更改了模型的大小?
我试图避免插入/删除行机制,因为我不想更改QList
中的实际数据,我只想获取一组不同的信息。
【问题讨论】:
我认为,由于您完全更新了表的数据,因此调用QAbstractItemModel::reset()
将执行您想要的操作。 IE。 void setCurrentItem(int idx) currentItemIdx = idx; reset();
【参考方案1】:
更改模型数据之前调用QAbstractItemModel::beginResetModel()
,之后调用QAbstractItemModel::endResetModel()
。
像这样:
void setCurrentItem(int idx)
beginResetModel();
currentItemIdx = idx;
endResetModel();
【讨论】:
以上是关于QTableView:动态更改rowCount的主要内容,如果未能解决你的问题,请参考以下文章
动态添加 QTableView 到动态创建的标签页 (QTabWidget) [已解决]