QAbstractTableModel最后一行为空,不进行排序

QAbstractTableModel empty last row, without sorting

本文关键字:排序 一行 最后 QAbstractTableModel      更新时间:2023-10-16

我有自己的表模型(DragDropTableModel),它是从QAbstractTableModel派生而来的。在里面,我希望最后一排永远是空的。

我通过在setData()函数中添加insertRows()来实现它:

bool  DragDropTableModel  :: setData (const QModelIndex &index, const QVariant &value, int role)
{ 
...   
  if (role == Qt::EditRole) 
    {
      ...
      if (row == this->rowCount() - 1)
         insertRows(this->rowCount(), 1);
    }
}

之后我在上面安装了QSortFilterProxyModel。问题是:当我进行排序时,最后一行也会被排序。但我想让它不服从排序,站在最后一个位置。因此,无论排序顺序是(升序还是降序),最后一行都应该是空的。

如何制作?也许我应该用另一种方法来实现我的模型中的"造空行"?

谢谢,murison。你的想法奏效了。我为空行的项设置了Qt::UserRole的值"EMPTY_ROW"。之后,我在QSortFilterProxyModel:中重新实现了lessThan()方法

bool MySortFilterProxyModel::lessThan(const QModelIndex &left, const QModelIndex &right) const
{
    if (left.data(Qt::UserRole) == "EMPTY_ROW")
        return (this->sortOrder() == Qt::DescendingOrder);
    else if (right.data(Qt::UserRole) == "EMPTY_ROW")
        return (this->sortOrder() == Qt::AscendingOrder);
    else
        return QSortFilterProxyModel::lessThan(left, right);
}

因此,这一行在排序后总是出现在表的底部。此外,当这一空行充满数据时,最好不要忘记清除Qt::UserRole。