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