我用通常的方式实现了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()重写用于?
的目的类型答案 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()
的默认实现调用。
我无法在源头找到其他用法。