指定某列共有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();
}
运行结果:
参考博客:
http://www.cppblog.com/gaimor/archive/2016/03/28/213140.html
https://blog.51cto.com/walkerqt/990848