QAbstractTableModel :: insertRows()的基本用法

时间:2014-07-04 17:47:36

标签: qt

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

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());

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

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;
}

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

我想在表单上有一个按钮,一旦点击,就会在用户的当前选择下方插入一行。我是否基本上在表格中创建一个插槽(连接到按钮clicked()),找出插入行的位置,然后插槽将调用table-&gt; insertRows()?这是insertRows()重写用于?

的目的类型

2 个答案:

答案 0 :(得分:2)

  

我基本上是在桌面上创建一个插槽(连接到按钮   clicked())确定插入行的位置,然后插入插槽   会调用table-&gt; insertRows()?这是目的的类型吗?   insertRows()override用于?

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

void QTableWidget::insertRow(int row)
{
    Q_D(QTableWidget);
    d->tableModel()->insertRows(row);
}

你会注意到(h文件)insertRow这里是一个插槽(通常用来通知它) 选择模型信号的手段)。然后它调用insertRows( 你已经覆盖的功能)。典型的实现可以在 来源:

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;
}

答案 1 :(得分:2)

有点晚了,但无论如何:

  

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

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

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

我无法在源头找到其他用法。