请教一个QT里面的多字段排序的问题。

sgyiliya 2020-11-11 03:43:40
common.h


#ifndef COMMON_H
#define COMMON_H

#include <QString>

struct StatusCode {
QString EN;
QString order;
QString CN;

StatusCode(){}

StatusCode(const StatusCode& a):EN(a.EN) ,order(a.order) ,CN(a.CN){}
};

#endif // COMMON_H



widget.h


#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QSqlTableModel>
#include <QStandardItemModel>
#include "common.h"
#include <string.h>
#include <string>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
Q_OBJECT

public:
explicit Widget(QWidget *parent = nullptr);
~Widget();

void getData();
void setData();
QList<struct StatusCode *> StatusCode_List;
bool static stdSort(StatusCode *StatusCode1, StatusCode *StatusCode2);

private slots:
void on_pushButton_clicked();

private:
Ui::Widget *ui;
QStandardItemModel *model_tableView;
};

#endif // WIDGET_H





widget.cpp


#include "widget.h"
#include "ui_widget.h"

#include "QMessageBox"
#include "QDebug"
#include <QDesktopWidget>
#include <QStandardItemModel>
#include <QString>
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include <QLocale>
#include <QCollator>
#include <qmessagebox.h>


Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);

model_tableView = new QStandardItemModel(this);

}

Widget::~Widget()
{
delete ui;
}


void Widget::setData()
{
StatusCode *entity = new StatusCode();

entity->EN = "BBC";
entity->order = "1";
entity->CN = "中";
StatusCode_List.append(entity);

entity = nullptr;
entity = new StatusCode();

entity->EN = "BBC";
entity->order = "1";
entity->CN = "英";
StatusCode_List.append(entity);

entity = nullptr;
entity = new StatusCode();

entity->EN = "ABC";
entity->order = "3";
entity->CN = "中1";
StatusCode_List.append(entity);

entity = nullptr;
entity = new StatusCode();

entity->EN = "ABC";
entity->order = "2";
entity->CN = "中2";
StatusCode_List.append(entity);

std::sort(StatusCode_List.begin(),StatusCode_List.end(),stdSort);

entity = nullptr;
}



void Widget::getData()
{
model_tableView->setHorizontalHeaderItem(0, new QStandardItem("英文"));
model_tableView->setHorizontalHeaderItem(1, new QStandardItem("数字"));
model_tableView->setHorizontalHeaderItem(2, new QStandardItem("中文"));

for(int i=0;i<StatusCode_List.count();i++)
{
int k=0;
model_tableView->setItem(i, k, new QStandardItem(StatusCode_List[i]->EN));
k++;
model_tableView->setItem(i, k, new QStandardItem(StatusCode_List[i]->order));
k++;
model_tableView->setItem(i, k, new QStandardItem(StatusCode_List[i]->CN));
k++;
}

ui->tableView->setModel(model_tableView);
}



void Widget::on_pushButton_clicked()
{
setData();
getData();
}

bool Widget::stdSort(StatusCode *StatusCode1, StatusCode *StatusCode2)
{
if(QString::compare(StatusCode1->EN,StatusCode2->EN)<0)
{
return true;
}else if(QString::compare(StatusCode1->EN,StatusCode2->EN)>0)
{
return false;
}

if(QString::compare(StatusCode1->order,StatusCode2->order)<0)
{
return true;
}else if(QString::compare(StatusCode1->order,StatusCode2->order)>0)
{
return false;
}

QLocale loc(QLocale::Chinese, QLocale::China);
QCollator qcol(loc);
QLocale cn(QLocale::Chinese);
QCollator cr(cn);
int nResult = 0;

char* ch1;
QByteArray ba1 = StatusCode1->CN.toLatin1();
ch1=ba1.data();
QString str1;
str1 = QString::fromLocal8Bit(ch1);

char* ch2;
QByteArray ba2 = StatusCode2->CN.toLatin1();
ch2=ba2.data();
QString str2;
str2= QString::fromLocal8Bit(ch2);

nResult = cr.compare(str1, str2);

if(nResult<0)
{
return true;
}else if(nResult>0)
{
return false;
}
}




原始顺序是 :

BBC 1 中
BBC 1 英
ABC 3 中1
ABC 2 中2


on_pushButton_clicked()执行后,排好的顺序是:

ABC 2 中2
ABC 3 中1
BBC 1 中
BBC 1 英

但是我希望得到的顺序是:

ABC 2 中2
ABC 3 中1
BBC 1 英
BBC 1 中

也就是,中文没有按照拼音的顺序来排列,请问这个问题该怎么解决?代码应该怎么改?

环境:QT5.9.8,CentOS8.2

...全文
14184 2 打赏 收藏 举报
写回复
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
sgyiliya 2020-11-12


    QLocale cn(QLocale::Chinese);
    QCollator cr(cn);
    int nResult = 0;

    nResult = cr.compare(StatusCode1->CN, StatusCode2->CN);

问题已经解决了,就是直接这样就可以了,来个人结贴好吗?
  • 打赏
  • 举报
回复
潮汐小鱼人 2020-11-12
来了老弟,我来帮你!
  • 打赏
  • 举报
回复
发帖
Linux/Unix社区

2.2w+

社区成员

Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
帖子事件
创建了帖子
2020-11-11 03:43
社区公告
暂无公告