QTableView:即时更改行数
QTableView: change rowCount on the fly
我使用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()));
}
模型的所有逻辑都依赖于该项目,例如:
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()
够了,但似乎不够。
我应该怎么做才能通知视图我已经更改了模型的大小?
我试图避免 insert/remove 行机制,因为我不想更改 QList
中的实际数据,我只想获取一组不同的信息。
更改模型数据之前调用 QAbstractItemModel::beginResetModel()
,更改模型数据之后调用 QAbstractItemModel::endResetModel()
。
像这样:
void setCurrentItem(int idx)
{
beginResetModel();
currentItemIdx = idx;
endResetModel();
}
我使用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()));
}
模型的所有逻辑都依赖于该项目,例如:
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()
够了,但似乎不够。
我应该怎么做才能通知视图我已经更改了模型的大小?
我试图避免 insert/remove 行机制,因为我不想更改 QList
中的实际数据,我只想获取一组不同的信息。
更改模型数据之前调用 QAbstractItemModel::beginResetModel()
,更改模型数据之后调用 QAbstractItemModel::endResetModel()
。
像这样:
void setCurrentItem(int idx)
{
beginResetModel();
currentItemIdx = idx;
endResetModel();
}