首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QTableView:动态更改rowCount

QTableView:动态更改rowCount
EN

Stack Overflow用户
提问于 2017-08-08 18:11:56
回答 1查看 1.6K关注 0票数 2

我使用QTableView来显示只读数据。该模型基于包含另一个QList的自定义类型的QList。如下所示:

代码语言:javascript
复制
typedef struct
{
    int range;
    QString description;
} Field;

typedef struct
{
    QString name;
    QList<Field> fields;
} Item;

QList<Item> items;

在我的QAbstractTableModel实现中,我有一个选择当前item的槽

代码语言:javascript
复制
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()));
}

模型的所有逻辑都依赖于该项目,例如:

代码语言:javascript
复制
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中的实际数据,我只想获取一组不同的信息。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-08 19:29:29

在更改模型数据之前调用QAbstractItemModel::​beginResetModel(),在更改模型数据之后调用QAbstractItemModel::​endResetModel()

如下所示:

代码语言:javascript
复制
void setCurrentItem(int idx)
{
  beginResetModel();
  currentItemIdx = idx;
  endResetModel();
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45565520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档