c++ - QTableView:动态更改 rowCount

标签 c++ qt qtableview

我使用QTableView来显示只读数据。该模型基于包含另一个 QList 的自定义类型的 QList。像这样的事情:

typedef struct
{
    int range;
    QString description;
} Field;

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

QList<Item> items;

在我的 QAbstractTableModel 实现中,我有一个用于选择当前项目的槽:

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 不会更改其行,然后也不会' t 请求新内容。

我认为 emit dataChanged() 就足够了,但似乎还不够。 我应该怎么做才能通知 View 我已经更改了模型的大小?

我试图避免插入/删除行机制,因为我不想更改QList中的实际数据,我只想获取一组不同的信息。

最佳答案

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

像这样:

void setCurrentItem(int idx)
{
  beginResetModel();
  currentItemIdx = idx;
  endResetModel();
}

关于c++ - QTableView:动态更改 rowCount,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45565520/

相关文章:

c++ - 删除指向小部件 Qt C++ 的指针

QTableView:dataChanged 事件清除正在编辑的单元格

c++ - 在大量插入后,向 QTableView 添加行会降低应用程序的速度

c++ - 函数指针和继承

python - 在 QMainWindow 中添加 QWidget,该窗口在 PyQt 中已经有一个中央小部件

c++ - 视差图的 OpenCv 深度估计

c++ - 使用单调堆栈背后的直觉

c++ - 为什么scanf要求两次输入

c++ - 如何更新 QFileSystemModel 中的文件权限

qt - 从QErrorMessage删除复选框