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

2023-11-10

指定某列共有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 <QtWidgets/QWidget>
#include "ui_Test.h"
#include <QHeaderView>
#include <QDebug>
#include <QTableWidget>
#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 <QTableWidgetItem>

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT笔记——QTableWidget 之 指定某列排序 的相关文章

  • 如何在 Qt-Embedded 中(正确)输出多语言文本?

    我的目标系统是 linux 3 3 7 Qt Embedded 开源版 4 8 Droid 字体 取自 fonts droid 20111207 git 1 all deb Debian 软件包并复制到 usr lib fonts目录 主要
  • Qt/c++ 随机字符串生成[重复]

    这个问题在这里已经有答案了 我正在创建一个应用程序 需要生成多个随机字符串 几乎就像一个由一定长度的 ASCII 字符组成的唯一 ID 这些字符混合有大写 小写 数字字符 有没有 Qt 库可以实现这一点 如果没有 在纯 C 中生成多个随机字
  • Qt Creator:如何区分 win32 和 win64

    我必须在 pro 文件中执行类似的操作 win32 LIBS L 3rdparty libusb win32 lib msvc llibusb else win64 LIBS L 3rdparty libusb win32 lib msvc
  • 如何创建QWidget的屏幕截图?

    我在 Qt Creator 中做作业 在其中绘制 QWidget 并且需要保存此 QWdiget 的某些部分 我试图解决这个问题 QPixmap pixmap pixmap copy rectangle rectangle is part
  • Qt WinRT 应用程序无法访问文件权限被拒绝

    我需要使用 Qt 和 FFMPEG 开发 WinRT 应用程序 我根据指令构建了 WinRT 的 ffmpeghere https github com Microsoft FFmpegInterop我可以将库与我的项目链接起来 现在我需要
  • 如何在模型更改时停止ListView“跳跃”

    我需要做什么 我需要创建一个聊天窗口用一个ListView在 QML 中存储聊天消息 我设置listView positionViewAtEnd 以便跟踪最后的消息 我禁用positionViewAtEnd当我向上滚动时 我可以阅读过去的消
  • 禁用 QML Slider 的鼠标滚轮

    我希望能够滚动Flickable使用鼠标滚轮 或触摸板上的两根手指 不改变Sliders它可能包含 示例代码及结果应用 import QtQuick 2 7 import QtQuick Window 2 2 import QtQuick
  • QGraphicsScene::clear 不会改变 sceneRect

    我有一个 QGraphicsScene 场景 和 QGraphicsView graphicsView 我有一个画图的方法 当我需要重绘所有图形时 我调用这个方法 一切都好 但我意识到 scene gt clear 不会改变 sceneRe
  • 如何创建用于 QML 的通用对象模型?

    我想知道是否有任何宏或方法如何将 Qt 模型注册为 QObject 的属性 例如 我有AnimalModel http doc qt io qt 5 qtquick modelviewsdata cppmodels html qabstra
  • 重定向 python 交互式帮助()

    我正在为使用 Qt 的应用程序开发交互式 python shell 但是我似乎无法获得重定向的交互式帮助 我的 python 代码中有这个 class OutputCatcher def init self self data def wr
  • QToolButton:更改菜单位置

    使用菜单时QToolButton菜单显示在按钮的正下方 有没有办法在按钮的左侧 右侧显示菜单 我知道这个问题不久前已得到回答 但我想为此问题添加新答案 因为接受的答案不再有效 实际上 更改 QToolButton 上的菜单位置非常容易 您需
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte
  • 在 MacOS 终端上运行 ffmpeg [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我对 MacOS 相当陌生 我发现使用终端来获取信息并不容易ffmpeg和我在 Window 上一样正常运行 我有 ffmpeg 二进制文件ffmpe
  • Qt 插槽是否与其他代码并行运行?

    在此函数示例中 void MyClass myFunction emit MySignal1 emit MySignal2 如果我有slot1倾听MySignal1 and slot2倾听MySignal2 1 Is slot1总是会在之前
  • QT从QTableWidgetItem继承到Widget并覆盖'<'运算符

    我想要一个QTableWidget具有定制的某些单元QProgressBars 并且我希望能够对包含这些的列进行排序 我的定制QProgressBar继承自两者QProgressBar and QTableWidgetItem 并且我正在覆
  • Qt - 设置不可编辑的QComboBox的显示文本

    我想将 QComboBox 的文本设置为某些自定义文本 不在 QComboBox 的列表中 而不将此文本添加为 QComboBox 的项目 此行为可以在可编辑的 QComboBox 上实现QComboBox setEditText cons
  • 如何在 QtQuick 2 中对 QML TableView 进行排序?

    我想使用 Qt 5 1 实现具有自定义角色的可排序 TableView 但我不知道当用户单击标题时该怎么做才能对其进行排序 在我的 Qt pro 文件中 我添加了 android ios blackberry qtHaveModule wi
  • QSerialPort 中的 readAll() 不包括最后发送的响应

    我正在使用 Qt 来控制串行设备 如果我向串行设备发送命令 我会执行类似的操作serial gt write command r n 我制作了一个按钮 它将纯文本小部件内的文本更改为串行端口的响应 为了获得串口的响应 我使用serial g
  • Qt GUI 应用程序中的控制台输出?

    我有一个在 Windows 上运行的 Qt GUI 应用程序 它允许传递命令行选项 在某些情况下我想向控制台输出一条消息 然后退出 例如 int main int argc char argv QApplication a argc arg
  • 如何访问Loader的sourceComponent中的QML对象?

    我可能需要读取或写入的一些属性Loader s sourceComponent来自一些外部函数 访问该房产的方式是什么x里面的对象的Loader s sourceComponent import QtQuick 2 0 Item width

随机推荐

  • redis一主二从时,主中读取不到从的信息

    一 错误情境描述 1 主 6379 2 从1 6380 3 从2 6381 二 错误原因 主中带有密码 三 解决办法 1 将主中配置文件中注释掉代码 2 在从的配置文件中添加主的密码 当master服务设置了密码保护时 slav服务连接ma
  • uniapp--- 微信小程序 用户隐私新规相关代码调整【vue3+ts+uView框架】

    uniapp 微信小程序 用户隐私新规相关代码调整 vue3 ts uView框架 官方公告地址 https developers weixin qq com community develop doc 00042e3ef54940ce85
  • elementUI中的$confirm调换两个按钮的位置

    confirm默认两个按钮的位置为 取消在前 确认在后 而我们在项目中经常要求 确认在前 取消在后 所以需要调换两个按钮的位置 修改后的样式如下图所示 用css样式调换两个按钮的位置 代码如下 给取消按钮添加样式 this confirm
  • 关于取模运算的特点与应用

    对于取模 取余 运算 比如A M 结果永远都是在 0 M 1 之间循环 并且如果A lt M 则结果和没有进行取模运算一样 这一特点有很多应用场景 1 最常见的就是对2取模来判断奇偶数 2 循环队列中通过对最大容量取模来控制数组下标 防止索
  • 资源记录

    AE插件 https zhuanlan zhihu com p 26304609 GLSL内置函数使用 https blog csdn net jeffasd article details 77989274 ops request mis
  • js中forEache()和Map()的区别

    定义剖析 我们首先来看一看MDN上对Map和ForEach的定义 forEach 针对每一个元素执行提供的函数 executes a provided function once for each array element map 创建一
  • 地埋式积水在线监测系统助力城市内涝解决方案

    一 方案背景 随着我国城镇化快速发展 城市建设产生的大量地面硬底化 大部分的降雨将形成地表径流 仅有少量雨水渗入地下 导致城市内涝等一系列问题 当前 全国多地发生洪涝 我国南北方全面进入主汛期 与往年相比 今年的汛期不仅提前4天 而且汛情呈
  • 3.app自动化项目

    app自动化项目 我们可以使用AirtestIDE工具进行脚本的调试 元素的定位等辅助功能 但是真正意义上的脚本 在 AirtestIDE 工具中实现还是比较麻烦 问题 1 如何使用pycharm实现airtest内容脚本 解决方案 如果是
  • JQuery入门

    JQuery jQuery 是一个 JavaScript 库 所谓的库 就是一个 JS 文件 里面封装了很多预定义的函数 比如获取元素 执行隐藏 移动等 目的就 是在使用时直接调用 不需要再重复定义 这样就可以极大地简化了 JavaScri
  • 华为OD机试 -求最大连续bit数(C++ & Java & JS & Python)

    描述 求一个int类型数字对应的二进制数字中1的最大连续数 例如3的二进制为00000011 最大连续2个1 数据范围 数据组数 1 5 1 t 5 1 500000 1 n 500000 进阶 时间复杂度 O logn 空间复杂度 1 O
  • 出现d3dcompiler_41.dll错误怎么解决

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或者损坏了 这时你只需下载这个d3dcompiler 41 dll文件进行安装
  • React+AntDesign结合Table、Modal+Form的使用,以及Ant Design 4.x Modal + Form搭配使用时,如何在Modal中使用表单验证

    React AntDesign结合Table Modal Form的使用 最近写React AntDesign时 使用到Modal和Form组件时候 因为Modal组件自带onOk按钮 因此不能使用Form自带的onFinish函数进行表单
  • 【转载】三十而已,信智依然

    1993年4月17日 我和丁健等几位留美学生在德克萨斯创立了AsiaInfo 亚信 如今正好30周年 图 亚信科技初期骨干人员合影 论语 讲 三十而立 对于人生来说 三十岁既意味着触摸到青春的峰值 也代表着爬上了成熟的阶梯 而对于企业来说
  • 一文了解快手广告生态:磁力智投、磁力金牛、磁力聚星、磁力万象、磁力方舟!

    抖音和快手的对照表 通过抖音和快手的对照表 我们可以知道磁力智投是快手的信息流投放平台 主要做站外引流 磁力金牛则对标巨量千川 主要做快手电商的站内闭环 磁力聚星则是围绕着达人营销 协助于品牌做出达播和自播兼具的经营阵地 也帮助达人在变现上
  • 【2023持续更新】网络安全工程师常用网站集合

    文章目录 信息搜集 子域名搜集 在线工具 信息处理 威胁情报及分析 在线靶场 综合学习 安全资讯技术 大会演讲PPT 安全社区 社工工程学 信息搜集 http www yunsee cn http finger tidesec com ht
  • Vue.js子级向父级传递数据

    组件之间的数据的传递 子传父 注意 html对大小写不敏感 事件名字最好用 隔开或全部小写 步骤 1 在父组件中在子组件上添加事件 自定义 监听 代表的含意 事件分两类 浏览器自带的事件 click mouseover mousedown
  • 11-2_Qt 5.9 C++开发指南_QSqlQueryModel的使用(QSqlQueryModel 只能作为只读数据源使用,不可以编辑数据)

    文章目录 1 QSqlQueryModel 功能概述 2 使用 QSqlQueryModel 实现数据查询 2 1 实例功能 2 2 可视化UI设计 2 3 主窗口类定义 去除自动生成的槽函数 2 4 打开数据库 2 5 记录移动 1 QS
  • java.lang.ClassCastException: java.math.BigDecimal cannot be cast to java.lang.Integer

    因为BigDecimal不能强制转换成 String类型 要用toString 作为中间桥梁转换 同理 Object BigDecimal转换成int doulbe long 也是一样的 List
  • 灰灰-判断是否存在重复数

    给定一个整数数组 判断是否存在重复元素 如果任何值在数组中出现至少两次 函数返回 true 如果数组中每个元素都不相同 则返回 false 示例 1 输入 1 2 3 1 输出 true 示例 2 输入 1 2 3 4 输出 false 示
  • QT笔记——QTableWidget 之 指定某列排序

    指定某列共有2种方式 1 重写 bool QTableWidgetItem operator lt const QTableWidgetItem other const 2 点击表头进行排序 connect ui tableWidget g