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 边框颜色?

QTableView() 仅在选择时更新更改

动态添加 QTableView 到动态创建的标签页 (QTabWidget) [已解决]

更改模型后重新调整 QTableView

使用 QStandardItemModel 更改 QTableView 的行颜色

PyQt:更改 QTableView 中复选框的对齐方式