相关文章推荐
淡定的蚂蚁  ·  QTreeView 修改节点字体 ...·  1 周前    · 
玩足球的夕阳  ·  qt c++ qtreewidget - ...·  1 周前    · 
温柔的遥控器  ·  QTreeView 和 ...·  1 周前    · 
至今单身的伏特加  ·  QTreeWidget ...·  1 周前    · 
有爱心的松鼠  ·  python - Colab ...·  1 年前    · 
温文尔雅的大象  ·  c# - Error in create ...·  1 年前    · 
帅气的地瓜  ·  [SIGMOD 07] Execution ...·  1 年前    · 
深沉的金鱼  ·  Java安全之Mojarra ...·  1 年前    · 

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提供了“&lt;”的虚函数,重写一下就可以实现自定义排序规格: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 对列表进行排序。 希望这个示例能够帮助您解决问题,如果您有任何其他问题或者需要进一步的帮助,请随时提出,我将尽力为您提供帮助。