我用通常的方法实现了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;
}现在我想知道我为什么要这么做?视图(或其他组件)是否会自动调用此方法?
我希望在表单上有一个按钮,一旦单击该按钮,就会在用户当前选择的下面插入一行。我是否基本上在表中创建了一个插槽(连接到单击的按钮())来确定插入行的位置,然后该槽将调用table->insertRows()?这是insertRows()覆盖的目的类型吗?
发布于 2015-01-08 21:42:36
有点晚了,但无论如何:
现在我想知道我为什么要这么做?视图(或其他组件)是否会自动调用此方法?
是的,insertRows()是由QAbstractItemModel::dropMimeData()的默认实现调用的,当另一个Qt视图中的项被删除时会调用它。
同样,removeRows()是由QAbstractItemView::startDrag()的默认实现调用的。
我在来源中找不到其他用法。
发布于 2014-07-05 23:23:33
我是否基本上在表中创建了一个插槽(连接到单击的按钮())来确定插入行的位置,然后该槽将调用table->insertRows()?这是insertRows()覆盖的目的类型吗?
是的(有意通过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;
}https://stackoverflow.com/questions/24578969
复制相似问题