首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QAbstractTableModel的基本用法::insertRows()

QAbstractTableModel的基本用法::insertRows()
EN

Stack Overflow用户
提问于 2014-07-04 17:47:35
回答 2查看 9.9K关注 0票数 5

我用通常的方法实现了QAbstractTableModel:

代码语言:javascript
复制
class PrintIntervalTableModel : public QAbstractTableModel
{
private:
  virtual int rowCount (const QModelIndex & parent = QModelIndex()) const;
  virtual int columnCount (const QModelIndex & parent = QModelIndex()) const;
  virtual QVariant data (const QModelIndex & index, int role = Qt::DisplayRole) const;
  virtual QVariant headerData (int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
  virtual bool setData (const QModelIndex & index, const QVariant & value, int role = Qt::EditRole);
  virtual Qt::ItemFlags flags (const QModelIndex & index) const;

  virtual bool insertRows (int position, int rows, const QModelIndex & parent = QModelIndex());
  virtual bool removeRows (int position, int rows, const QModelIndex & parent = QModelIndex());

下面是我的插入行,非常简单:

代码语言:javascript
复制
bool PrintIntervalTableModel::insertRows(int position, int rows, const QModelIndex & parent)
{
  beginInsertRows(QModelIndex(), position, position + rows - 1);

  for (int row = 0; row < rows; ++row)
  {
    std::deque<moment_value_pair_type>::iterator it = printIntervalPairs.begin() + position;
    printIntervalPairs.insert(it, moment_value_pair_type());
  }

  endInsertRows();

  return true;
}

现在我想知道我为什么要这么做?视图(或其他组件)是否会自动调用此方法?

我希望在表单上有一个按钮,一旦单击该按钮,就会在用户当前选择的下面插入一行。我是否基本上在表中创建了一个插槽(连接到单击的按钮())来确定插入行的位置,然后该槽将调用table->insertRows()?这是insertRows()覆盖的目的类型吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-08 21:42:36

有点晚了,但无论如何:

现在我想知道我为什么要这么做?视图(或其他组件)是否会自动调用此方法?

是的,insertRows()是由QAbstractItemModel::dropMimeData()的默认实现调用的,当另一个Qt视图中的项被删除时会调用它。

同样,removeRows()是由QAbstractItemView::startDrag()的默认实现调用的。

我在来源中找不到其他用法。

票数 4
EN

Stack Overflow用户

发布于 2014-07-05 23:23:33

我是否基本上在表中创建了一个插槽(连接到单击的按钮())来确定插入行的位置,然后该槽将调用table->insertRows()?这是insertRows()覆盖的目的类型吗?

是的(有意通过QAbstractItemModel接口由视图使用)。您可以查看QTableWidget的源代码作为示例。

代码语言:javascript
复制
void QTableWidget::insertRow(int row)
{
    Q_D(QTableWidget);
    d->tableModel()->insertRows(row);
}

您将注意到(h文件) insertRow在这里是一个插槽(通常通过选择模型信号通知它)。然后它调用insertRows (您重写的函数)。在源中可以找到一个典型的实现:

代码语言:javascript
复制
bool QTableModel::insertRows(int row, int count, const QModelIndex &)
{
    if (count < 1 || row < 0 || row > verticalHeaderItems.count())
        return false;

    beginInsertRows(QModelIndex(), row, row + count - 1);
    int rc = verticalHeaderItems.count();
    int cc = horizontalHeaderItems.count();
    verticalHeaderItems.insert(row, count, 0);
    if (rc == 0)
        tableItems.resize(cc * count);
    else
        tableItems.insert(tableIndex(row, 0), cc * count, 0);
    endInsertRows();
    return true;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24578969

复制
相关文章

相似问题

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