第一个示例:QList排序
数据类型:
class Student
{
public:
Student();
QString name;
int age;
int num;
void insertData(); // 初始化数据
QList<Student> m_stu; // Qlist列表数据
static bool compareBarData(const Student &stu1, const Student &stu2);// 用于对比的 函数
int m_value = 1;
};
添加 初始化数据 ,可以用按钮调用一直添加.
void Dialog::insertData()
{
Student a;
m_value ++;
a.age =10 + m_value;
a.num = 20 + m_value*2;
a.name = "asdf";
m_stu.append(a);
}
对比函数声明
bool Dialog::compareBarData(const Student &stu1, const Student &stu2)
{
return stu1.age > stu2.age;
}
需要排序的地方调用:
qSort(m_stu.begin(),m_stu.end(),compareBarData);
第二个示例:QList强制类型转换QSet实现排序
有很多场景需要我们通过QT的代码调用自身的容器,例如保存时间秒值,时间有顺序的,如何做到容器安升序或者降序进行排序呢,下面有个方法帮助到我们,希望有用。
常用的QT的容器都是自动排序或者无序,也没有可以调用的排序函数,那么我们怎么来实现容器内部数据的排序呢?
第一定义 Qlist<int>m_list;
将乱序的数据push进去链表当中;
第二步:替重
由于list没有替重的功能,相同时间会有重复项,那么如下操作:
重复的list项只需简单转成QSet即可,因为set是没有重复项的
m_list = m_list.toSet().toList();
第三步:排序
bool student::compareBarData(const int &stu1, const int &stu2)
{
//升序或者降序,这里可以调整一下大小关系
return stu2 > stu1;
}
qSort为QT的全局函数,类似qDebug;
qSort(m_listQueryTime.begin(),m_listQueryTime.end(),compareBarData);
很完美。,,尝试一下!!
第三个经验分享:
系统QT的全局函数qDebug() 函数很方便打印出日志信息, 也可以重定向数据流到文件当中,但是如果应用对时间效率要求比较高的时候,还是特别需要注意的:
根据测试,查询数据库大数据情况下,处理数据的循环当中尽量不要打印日志,严重影响效率,一下几点建议:
线程中控制打印日志打印频率;
在超大循环中不要打印日志;
可以通过在prowe文件中增加:DEFINES += QT_NO_DEBUG_OUTPUT 发布版本的时候禁止日志输出;
当然很多程序关键日志需要打印出来并保存到文件中,出现问题的时候可以进行问题分析;
第四:关于容器
QMap 属于键值对,键值保持唯一,会自动完成降序排序;
QVector 类似数据组,数据的排列方式是根据放入的数据顺序一致;查询效率很低;
QSet 没有提供排序函数接口,并且具有自动替重的特点;
QHash 类似QMap,属于键值对,键值保持唯一,内部的数据是无序的,数据的序列不确定怎么排列;但是查询的效率特表高,对于无顺序要求的地方是很好的选择;
QList 插入元素,元素也是没有自动完成排序,并且元素是可以重复的,高效查询;QList对象可以强制类型转换QSet对象,然后在强制转换过来,实现数据替重的功能;
第五种的情况,可以结合qSort系统全局函数实现排序功能,具体请参考上面的第二章节的说明。