QT中QTreeWidget的叶子QTreeWidgetItem默认只支持大小写排序,但QTreeWidgetItem提供了“<”的虚函数,重写一下就可以实现自定义排序规格:
QTreeWidgetItem:
void QTreeWidgetItem::sortChildren(int column, Qt::SortOrder order)
enum Qt::SortOrder
This enum describes how the items in a widget are sorted.
Constant Value Description
Qt::AscendingOrder 0
The items are sorted ascending e.g. starts with 'AAA' ends with 'ZZZ' in Latin-1 locales
Qt::DescendingOrder 1
The items are sorted descending e.g. starts with 'ZZZ' ends with 'AAA' in Latin-1 locales
假如需要排序的是:
"1","1_1","1_1_1","1_2_1","1_3_1", "1_1_3_1", "1_1_3_1_1", "1_1_3_1_2", "1_1_3_1_3"
这种数据的话,我们的思路是首先用正则表达式匹配字符串中的数值,放入容器中,在对比两个容器中数字的大小,这样就可以根据自己的需要对QTreeWidgetItem进行排序,主要代码如下:
TreeWidgetItem.h
#ifndef TREEWIDGETITEM_H
#define TREEWIDGETITEM_H
#include <QTreeWidgetItem>
#include <QRegExp>
class TreeWidgetItem : public QTreeWidgetItem
public:
TreeWidgetItem(const QStringList &strings = QStringList(), int type = 0);
~TreeWidgetItem();
private:
bool operator<(const TreeWidgetItem& other) const;
QVector<int> RegNum(QString str) const;
#endif // TREEWIDGETITEM_H
TreeWidgetItem.cpp
#include "TreeWidgetItem.h"
TreeWidgetItem::TreeWidgetItem(const QStringList &strings, int type)
: QTreeWidgetItem(strings, type)
TreeWidgetItem::~TreeWidgetItem()
bool TreeWidgetItem::operator<(const TreeWidgetItem& other) const
QVector<int> vec = RegNum(text(0));
QVector<int> vecother = RegNum(other.text(0));
if (vec.size() != vecother.size())
return vec.size() < vecother.size();
for (int i = 0; i < vec.size(); ++i)
if (vec[i] != vecother[i])
return vec[i] < vecother[i];
return false;
QVector<int> TreeWidgetItem::RegNum(QString str) const
QVector<int> vec;
QRegExp rx("(\\d+)");
int pos = 0;
while ((pos = rx.indexIn(str, pos)) != -1) {
vec.push_back(rx.cap(1).toInt());
pos += rx.matchedLength();
return vec;
插入叶子完成之后,每个父节点调用排序函数:
sortItems(0, Qt::AscendingOrder);
测试数据如下:
PolyonUnit unit1;
unit1.name = "1";
PolyonUnit unit1_1;
unit1_1.name = "1_1";
PolyonUnit unit1_2;
unit1_2.name = "1_2";
PolyonUnit unit1_1_1;
unit1_1_1.name = "1_1_1";
PolyonUnit unit1_2_1;
unit1_2_1.name = "1_2_1";
PolyonUnit unit1_3_1;
unit1_3_1.name = "1_3_1";
PolyonUnit unit1_1_2;
unit1_1_2.name = "1_1_2";
PolyonUnit unit1_1_3;
unit1_1_3.name = "1_1_3";
PolyonUnit unit1_1_3_1;
unit1_1_3_1.name = "1_1_3_1";
PolyonUnit unit1_1_3_2;
unit1_1_3_2.name = "1_1_3_2";
PolyonUnit unit1_1_3_1_1;
unit1_1_3_1_1.name = "1_1_3_1_1";
PolyonUnit unit1_1_3_1_2;
unit1_1_3_1_2.name = "1_1_3_1_2";
PolyonUnit unit1_1_3_1_3;
unit1_1_3_1_3.name = "1_1_3_1_3";
unit1_1_3_1._children.push_back(unit1_1_3_1_1);
unit1_1_3_1._children.push_back(unit1_1_3_1_2);
unit1_1_3_1._children.push_back(unit1_1_3_1_3);
unit1_1_3._children.push_back(unit1_1_3_1);
unit1_1_3._children.push_back(unit1_1_3_2);
//unit1_2._children.push_back(unit1_1_3_1);
unit1_1._children.push_back(unit1_1_1);
unit1_1._children.push_back(unit1_2_1);
unit1_1._children.push_back(unit1_3_1);
unit1_1._children.push_back(unit1_1_2);
unit1_1._children.push_back(unit1_1_3);
unit1._children.push_back(unit1_1);
//unit1._children.push_back(unit1_2);
pdata.push_back(unit1);
PolyonUnit是我自己定义的数据结构,类似QTreeWidgetItem的树形结构,详细代码稍后上传,测试结果如下:
QT中QTreeWidget的叶子QTreeWidgetItem默认只支持大小写排序,但QTreeWidgetItem提供了“<”的虚函数,重写一下就可以实现自定义排序规格:QTreeWidgetItem:void QTreeWidgetItem::sortChildren(int column, Qt::SortOrder order)enum Qt::SortOrderThis enum describes how the items in a widget are sorted.
ui->listWidget->setViewMode(QListView::IconMode);
ui->listWidget->setGridSize(QSize(64,90));
//设置QListWidget中单元项的图片大小
ui->listWidget->setIconSize(QSize(45,45));
//设置QListWidget中单元项的间距
QTreeWidget树结构,然后,它是可以像tableWidget那样有多行多列,排序,设置图标等,这里只简单使用下,更多的再查一查就好,和tableWidget大多很类似,tableWidget也有个示列,有需要点这Qt tableWidget排序等
.cpp中
#include "treewidget.h"
#include "ui_treewidget.h"
#include <QTreeWidget>
#include <QTreeWidgetItem&g
今天,我在进行Qt编程的时候,关于界面的编制遇到了一些问题,如果一个ComboBox控件的选项直接有关联的话,如何在已经选择的选项前面加上提示,如何动态的改变ComboBox,如何使用右键菜单。在读别人的代码的过程中发现了这些,特此记录一下,以防忘记。
为了将所有例子都在一个程序中表示出来,我设计一个简单的对话框,其特点是可以使用右键菜单进行增加条目,如图:也可以在对应的条目上右键进行删除,如图:
Qt的 QTableWidget 和 QTreeWidget 对item的排序,一直都存在一个问题,例如有三个item,text分别为1、3、15,排序的结果必然为1、15、3,这样不是我们想要的结果,所以需要通过重载QTreeWidgetItem的 operator函数,改变排序比较的方式,达到我们想要的效果。
class CTreeWidgetItemEx : publi
非常感谢您的提问。对于您的问题,我可以提供一些参考信息。 Qt 中,可以通过自定义类实现按照时间排序的功能。这需要实现一个比较函数,比较两个对象的时间属性,然后在排序算法中调用这个比较函数来进行排序。
以下是一个简单的按照时间排序的示例代码:
```c++
class MyClass {
public:
MyClass(QDateTime timestamp, QString data) :
m_timestamp(timestamp), m_data(data) {}
QDateTime timestamp() const { return m_timestamp; }
QString data() const { return m_data; }
friend bool operator<(const MyClass &lhs, const MyClass &rhs) {
return lhs.timestamp() < rhs.timestamp();
private:
QDateTime m_timestamp;
QString m_data;
QList<MyClass> myList;
// 添加数据
myList << MyClass(QDateTime::currentDateTime(), "data 1");
myList << MyClass(QDateTime::currentDateTime().addSecs(-60), "data 2");
myList << MyClass(QDateTime::currentDateTime().addSecs(60), "data 3");
// 按照时间排序
qSort(myList);
这个示例中,定义了一个 MyClass 类,包含一个时间戳和一段数据。在类中重载了小于运算符,根据时间戳比较两个对象。然后在主程序中创建一个 QList,添加 MyClass 对象,最后使用 qSort 对列表进行排序。
希望这个示例能够帮助您解决问题,如果您有任何其他问题或者需要进一步的帮助,请随时提出,我将尽力为您提供帮助。