前言
网上找了很久QTableView使用QStandardItemModel模型进行排序,都是使用QSortFilterProxyModel模型进行排序,这里就不说这个方式了,因为我试了重写 bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const override 函数,能实现自定义排序了,但是排序号使用QStandardItemModel获取数据却还是排序之前的,后面使用自定义QStandardItem实现QStandardItemModel的自定义排序功能。
提示:以下是本篇文章正文内容,下面案例可供参考
效果展示
.h
代码如下(示例):
//自定义数字排序StandardItem
class CustomNumberStandardItem : public QStandardItem
{
public:
virtual bool operator<(const QStandardItem &other) const {
QCollator collator;
collator.setNumericMode(true);
QString curText = this->text();
QString otherText = other.text();
curText = curText.replace("P-", "").replace("槽位", "");
otherText = otherText.replace("P-", "").replace("槽位", "");
auto ret = collator.compare(curText, otherText);
if(ret < 0)
return true;
else
return false;
}
};
//自定义节点IP排序StandardItem
class CustomNodeIpStandardItem : public QObject, public QStandardItem
{
Q_OBJECT
public:
CustomNodeIpStandardItem(QString strTset = QString());
virtual bool operator<(const QStandardItem &other) const;
};
.cpp
代码如下(示例):
CustomNodeIpStandardItem::CustomNodeIpStandardItem(QString strTset)
:QStandardItem(strTset)
{
}
bool CustomNodeIpStandardItem::operator<(const QStandardItem &other) const
{
QString left = this->text();
QString right = other.text();
QStringList leftList = left.split(".");
QStringList rightList= right.split(".");
if(leftList.count() != 4 || rightList.count() != 4)
return false;
QMap<int, int> listMap;
for (int i = 0; i < 4; i++)
listMap.insert(i, 0);
for (int i = 0; i < 4; i++){
QString ipLeft = leftList.at(i);
QString ipRihht = rightList.at(i);
if(ipLeft.toInt() < ipRihht.toInt())
listMap.insert(i, 1);
else if(ipLeft.toInt() == ipRihht.toInt())
continue;
else
break;
}
if(listMap.value(0) == 1)
return true;
if(listMap.value(1) == 1)
return true;
if(listMap.value(2) == 1)
return true;
if(listMap.value(3) == 1)
return true;
return false;
}
使用
//rowDataList为自己添加的表格一行数据
//pStandardTableModel为QStandardItemModel *pStandardTableModel;
//这里知道表格第一列和第二列为数字排序,添加时使用的CustomNumberStandardItem
//第四列为IP列,所以使用的CustomNodeIpStandardItem
//其他列按照字符串排序,所以没有使用自定义QStandardItem
//设置表格可以排序
your_tableView->setSortingEnabled(true);
//设置排序指示器可见![请添加图片描述](https://i-blog.csdnimg.cn/direct/60b6878476964dd6b556a14a7dadcc91.gif)
your_tableView->horizontalHeader()->setSortIndicatorShown(true);
QStringList rowDataList;
int curRow = pStandardTableModel->rowCount();
for (int i = 0; i < pStandardTableModel->columnCount(); ++i) {
if(i == 0 || i == 1){
CustomNumberStandardItem *numberStandardItem = new CustomNumberStandardItem;
numberStandardItem->setText(rowDataList.at(i));
pStandardTableModel->setItem(curRow, i, numberStandardItem);
}
else if(i == 4) {
CustomNodeIpStandardItem *nodeIpStandardItem = new CustomNodeIpStandardItem;
nodeIpStandardItem->setText(rowDataList.at(i));
pStandardTableModel->setItem(curRow, i, nodeIpStandardItem);
}
else{
pStandardTableModel->setItem(curRow, i, new QStandardItem(rowDataList.at(i)));
}
}