QAbstractTableModel::insertRows() 的基本用法

5 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());
Run Code Online (Sandbox Code Playgroud)

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

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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Tho*_*ire 4

有点晚了,但无论如何:

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

是的,insertRows()由 的默认实现调用QAbstractItemModel::dropMimeData(),当来自另一个 Qt 视图的项目被拖放到那里时,它会被调用。

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

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