QT笔记——QTableWidget 之 指定某列排序

指定某列共有2种方式:

1.重写:bool QTableWidgetItem::operator<(const QTableWidgetItem& other) const		
2.点击表头进行排序:connect(ui.tableWidget->horizontalHeader(), SIGNAL(sectionClicked(int)), this, SLOT(slotHeaderClicked(int)));
3.使用sortByColumn(int column, Qt::SortOrder order)函数进行排序

在写代码的过程中,总是会字符串排序,会遇到数字排序为:2,20,3,33,和我们的预期不太一样,我们的理论应该是:2,3,20,33。这是因为QTableWidgetItem比较大小的时候用的是字符串比较,而不是我们想要的数字比较,所以我们在写数据或者添加数目的时候,可以直接写为添加数字而不是字符串;或者重写我们的item比较

添加数据为数字,就是用数字进行排序:

写法1:
QTableWidgetItem* item = new QTableWidgetItem();
item->setData(Qt::DisplayRole, m_list[i].age);
ui.tableWidget->setItem(i, 1, item);

写法二:
QTableWidgetItem* item = new QTableWidgetItem;
ui.tableWidget->setItem(i, 1, item);
ui.tableWidget->item(i, 1)->setData(Qt::DisplayRole, m_list[i].age);

添加数据为字符串,就是用字符串排序:

ui.tableWidget->setItem(i, 0, new QTableWidgetItem(m_list[i].name));

Test .h

#include 
#include "ui_Test.h"
#include 
#include 
#include 
#include "MyTableWidgetItem.h"
class Test : public QWidget
{
	Q_OBJECT
	struct Person
	{
		QString name;
		int age;
		int socre;
		QString sex;
	};
public:
	Test(QWidget *parent = Q_NULLPTR);
	~Test();
private slots:
	void  slotHeaderClicked(int);
	void  on_sortBtn_clicked();
private:
	Ui::TestClass ui;

	QList <Person> m_list;
};

Test .cpp

#include "Test.h"

Test::Test(QWidget *parent)
	: QWidget(parent)
{
	ui.setupUi(this);
	ui.tableWidget->setColumnCount(4);

	QStringList headList;
	headList << QStringLiteral("姓名") << QStringLiteral("年龄") << QStringLiteral("分数") << QStringLiteral("性别");
	ui.tableWidget->setHorizontalHeaderLabels(headList);

	ui.tableWidget->horizontalHeader()->setDefaultAlignment(Qt::AlignCenter);
	Person p = { QStringLiteral("cxq_lion"),20,5,QStringLiteral("男") };
	Person p1 = { QStringLiteral("小杨"),24,2,QStringLiteral("女") };
	Person p2 = { QStringLiteral("小明"),48,44,QStringLiteral("男") };
	Person p3 = { QStringLiteral("小李"),50,4,QStringLiteral("男") };
	Person p4 = { QStringLiteral("小陈"),4,90,QStringLiteral("男") };
	Person p5 = { QStringLiteral("小胡"),66,70,QStringLiteral("女") };

	ui.indexComBobox->addItem("1");
	ui.indexComBobox->addItem("2");
	ui.sortComboBox->addItem(QStringLiteral("升序"));
	ui.sortComboBox->addItem(QStringLiteral("降序"));

	ui.tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
	ui.tableWidget->horizontalHeader()->setStyleSheet("QHeaderView::section{background-color:lightblue;color: black;padding-left: 4px;border: 1px solid#6c6c6c;}");
		
	ui.tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
	ui.tableWidget->verticalHeader()->setVisible(true);
	ui.tableWidget->setAlternatingRowColors(true);
	//ui.tableWidget->setStyleSheet("alternate-background-color:rgb(48,51,55);selection-background-color:qlineargradient(x1:0,y1:0, x2:0, y2:1, stop:0 rgb(56,56,56),stop:1 rgb(76,76,76));");

	m_list << p << p1 << p2 << p3 << p4 << p5;

	int row = m_list.size();
	ui.tableWidget->setRowCount(row);

	for (int i = 0; i < row; i++)
	{
		//第一种方式:
		//QTableWidgetItem* item = new QTableWidgetItem();
		//item->setData(Qt::DisplayRole, m_list[i].age);
		//QTableWidgetItem* item1 = new QTableWidgetItem();
		//item1->setData(Qt::DisplayRole, m_list[i].socre);
		//ui.tableWidget->setItem(i, 0, new QTableWidgetItem(m_list[i].name));
		//ui.tableWidget->setItem(i, 1, item);
		//ui.tableWidget->setItem(i, 2, item1);
		//ui.tableWidget->setItem(i, 3, new QTableWidgetItem(m_list[i].sex));

		//第二种写法
		//QTableWidgetItem* item = new QTableWidgetItem;
		//QTableWidgetItem* item1 = new QTableWidgetItem;
		//ui.tableWidget->setItem(i, 1, item);
		//ui.tableWidget->setItem(i, 2, item1);
		//ui.tableWidget->item(i, 1)->setData(Qt::DisplayRole, m_list[i].age);
		//ui.tableWidget->item(i, 2)->setData(Qt::DisplayRole, m_list[i].socre);
		//ui.tableWidget->setItem(i, 0, new QTableWidgetItem(m_list[i].name));
		//ui.tableWidget->setItem(i, 3, new QTableWidgetItem(m_list[i].sex));

	    //第三种写法
		ui.tableWidget->setItem(i, 0, new QTableWidgetItem(m_list[i].name));
		ui.tableWidget->setItem(i, 1, new MyTableWidgetItem(QString::number(m_list[i].age)));
		ui.tableWidget->setItem(i, 2, new MyTableWidgetItem(QString::number(m_list[i].socre)));
		ui.tableWidget->setItem(i, 3, new QTableWidgetItem(m_list[i].sex));
	}

	connect(ui.tableWidget->horizontalHeader(), SIGNAL(sectionClicked(int)), this, SLOT(slotHeaderClicked(int)));

}

Test::~Test()
{

}

void Test::slotHeaderClicked(int index)
{
	if (index == 1 || index == 2)
		ui.tableWidget->sortItems(index, Qt::AscendingOrder);
}

void Test::on_sortBtn_clicked()
{
	QString str = ui.sortComboBox->currentText();
	int col = ui.indexComBobox->currentText().toInt();
	if (str == QStringLiteral("降序"))
		ui.tableWidget->sortByColumn(col,Qt::DescendingOrder);
	else
		ui.tableWidget->sortByColumn(col, Qt::AscendingOrder);
}

MyTableWidgetItem .h

#pragma once
#include 

class MyTableWidgetItem : public QTableWidgetItem
{

public:
	MyTableWidgetItem();
	MyTableWidgetItem(const QString& text);
	MyTableWidgetItem(const QIcon& icon, const QString& text);
	~MyTableWidgetItem();
	bool operator <(const QTableWidgetItem& other) const;
};

MyTableWidgetItem .cpp

#include "MyTableWidgetItem.h"
MyTableWidgetItem::MyTableWidgetItem():QTableWidgetItem()
{

}

MyTableWidgetItem::MyTableWidgetItem(const QString& text)
{
	setText(text);
}

MyTableWidgetItem::MyTableWidgetItem(const QIcon& icon, const QString& text)
{
	setIcon(icon);
	setText(text);
}

MyTableWidgetItem::~MyTableWidgetItem()
{

}

bool MyTableWidgetItem::operator<(const QTableWidgetItem& other) const
{
	return text().toInt() < other.text().toInt();
}

运行结果:
QT笔记——QTableWidget 之 指定某列排序_第1张图片
参考博客:
http://www.cppblog.com/gaimor/archive/2016/03/28/213140.html
https://blog.51cto.com/walkerqt/990848

你可能感兴趣的:(QT,qt)