Базовое использование QAbstractTableModel ::insertRow()

#qt

#qt

Вопрос:

Я реализовал QAbstractTableModel с обычным:

 class PrintIntervalTableModel : public QAbstractTableModel
{
private:
  virtual int rowCount (const QModelIndex amp; parent = QModelIndex()) const;
  virtual int columnCount (const QModelIndex amp; parent = QModelIndex()) const;
  virtual QVariant data (const QModelIndex amp; index, int role = Qt::DisplayRole) const;
  virtual QVariant headerData (int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
  virtual bool setData (const QModelIndex amp; index, const QVariant amp; value, int role = Qt::EditRole);
  virtual Qt::ItemFlags flags (const QModelIndex amp; index) const;

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

Вот моя вставка строк, которая довольно проста:

 bool PrintIntervalTableModel::insertRows(int position, int rows, const QModelIndex amp; 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-> insertRow()? Является ли это типом цели, для которой используется переопределение insertRow ()?

Ответ №1:

Немного поздно, но в любом случае:

Теперь мне интересно, почему я на самом деле это сделал? Автоматически ли представления (или другие компоненты) вызывают этот метод?

Да, insertRows() вызывается реализацией по умолчанию QAbstractItemModel::dropMimeData() , которая вызывается, когда элементы из другого представления Qt отбрасываются туда.

Аналогично, removeRows() вызывается реализацией по умолчанию QAbstractItemView::startDrag() .

Я не смог найти других вариантов использования в исходном коде.

Ответ №2:

Должен ли я в принципе создать слот в таблице (подключенный к нажатию кнопки ()), который определяет, куда вставить строку, а затем слот будет вызывать table-> insertRow()? Является ли это типом цели, для которой используется переопределение insertRow ()?

Да (Предназначен для использования представлением через интерфейс QAbstractItemModel). Вы можете посмотреть на исходный код QTableWidget в качестве примера.

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

Вы заметите, что (h file) insertRow здесь является слотом (для уведомления об этом обычно используется
означает сигнал модели выбора). Затем он вызывает insertRow (the
функция, которую вы переопределили). Типичную реализацию можно найти в
источники:

 bool QTableModel::insertRows(int row, int count, const QModelIndex amp;)
{
    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;
}