PyQt5 之 QTableWidget 数字和字符混合的列排序

PyQt5 之 QTableWidget 数字和字符混合的列排序


前言

PyQt5中的QTableWidget 是按照string类型进行排序的,所以遇到数字或数字和字符混合的情况,排序的结果就和预期不太一样,这里记录下如何解决此问题


一、QTableWidget 自带排序

1.完整示例代码

import sys
from PyQt5 import QtCore, QtWidgets

class Window(QtWidgets.QTableWidget):
    def __init__(self):
        super(Window, self).__init__(6, 3)
        for column, values in enumerate((
            ('第1天', '第350天', '第100天', '第10天', '第2天', '第30天'),
            ("1天", "10天", "20天","2天", "100天", "30天"),
            ('1天5小时', "10天5小时", "10天6小时", "20天5小时", "30天3小时", "2天1小时"),
            )):
            for row, value in enumerate(values):
                item = QtWidgets.QTableWidgetItem(value)
                self.setItem(row, column, item)
        self.setSortingEnabled(True)
  
if __name__ == '__main__':

    app = QtWidgets.QApplication(sys.argv)
    window = Window()
    window.setGeometry(600, 100, 350, 250)
    window.show()
    sys.exit(app.exec_())

2.排序结果

第一列排序结果如下图
在这里插入图片描述
第二列排序结果如下图
在这里插入图片描述
第三节排序结果如下图
在这里插入图片描述
以上排序结果和我们预期的不太一样。

二、解决措施

1.新建一个类

类代码如下:

class SortItem(QtWidgets.QTableWidgetItem):
    def __lt__(self, other):
        collator=QtCore.QCollator()
        collator.setNumericMode(True)
        res=collator.compare(self.text(),other.text())
        if res<0:
            return True
        else:
            return False

2.修改局部示例代码

只需对item的赋值进行修改如下:

item = SortItem(str(value))

3.修改后完整示例代码

import sys
from PyQt5 import QtCore, QtWidgets

class SortItem(QtWidgets.QTableWidgetItem):
    def __lt__(self, other):
        collator=QtCore.QCollator()
        collator.setNumericMode(True)
        res=collator.compare(self.text(),other.text())
        if res<0:
            return True
        else:
            return False

class Window(QtWidgets.QTableWidget):
    def __init__(self):
        super(Window, self).__init__(6, 3)
        for column, values in enumerate((
            ('第1天', '第350天', '第100天', '第10天', '第2天', '第30天'),
            ("1天", "10天", "20天","2天", "100天", "30天"),
            ('1天5小时', "10天5小时", "10天6小时", "20天5小时", "30天3小时", "2天1小时"),
            )):
            for row, value in enumerate(values):
                # item = QtWidgets.QTableWidgetItem(value)
                item = SortItem(str(value))
                self.setItem(row, column, item)
        self.setSortingEnabled(True)
  
if __name__ == '__main__':

    app = QtWidgets.QApplication(sys.argv)
    window = Window()
    window.setGeometry(600, 100, 350, 250)
    window.show()
    sys.exit(app.exec_())

3.修改后排序结果

第一列修改后排序结果如下图
在这里插入图片描述
第二列修改后排序结果如下图
在这里插入图片描述
第三列修改后排序结果如下图
在这里插入图片描述


提示

以上示例中没有纯数字列,纯数字列也适用以上方法。

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用QHeaderView来实现QTableWidget的表头筛选功能。具体步骤如下: 1. 创建QHeaderView对象,并将其设置为QTableWidget的水平表头。 2. 为QHeaderView的每个表头项设置一个过滤器,用于筛选该的数据。 3. 在过滤器中,使用QSortFilterProxyModel来过滤数据,并将其设置为QTableWidget的模型。 4. 在过滤器中,根据用户输入的筛选条件,使用QRegExp来匹配数据。 5. 在过滤器中,根据匹配结果,使用QModelIndexList来获取需要显示的行,并将其设置为QSortFilterProxyModel的过滤结果。 6. 在过滤器中,使用QHeaderView的setFilterBoxesVisible方法来显示过滤器输入框。 7. 在过滤器中,使用QHeaderView的setFilterBoxStyle方法来设置过滤器输入框的样式。 8. 在过滤器中,使用QHeaderView的setFilterBoxToolTip方法来设置过滤器输入框的提示信息。 9. 在过滤器中,使用QHeaderView的filterBoxTextChanged信号来响应用户输入的筛选条件,并更新QSortFilterProxyModel的过滤结果。 10. 在过滤器中,使用QHeaderView的filterBoxClearButtonClicked信号来响应用户清空筛选条件的操作,并更新QSortFilterProxyModel的过滤结果。 以上就是使用QHeaderView来实现QTableWidget的表头筛选功能的步骤。 ### 回答2: QTableWidgetPyQt5中用于创建表格视图的类之一,它可以通过设置行、单元格数及其内容等属性来实现对表格视图的管理。在实际开发中,为了方便对大量数据进行分类检索,我们经常会涉及到表头筛选(也称为头过滤),即在QTableWidget的表头视图中添加一个下拉框或弹出窗口,用于选择需要显示的QTableWidget表头筛选的基本实现方式是通过QComboBox来自定义表头菜单,并通过connect()方法和activated()信号实现菜单选中事件的响应,进而调用hideColumn()和showColumn()方法控制的显示与隐藏。下面是一个简单的流程示意图: 1.创建QTableWidget对象; 2.设置表格的行数和数; 3.通过setHorizontalHeaderLabels()方法设置表头标签; 4.通过setCellContent()方法设置表格单元的内容; 5.创建QComboBox对象,设置下拉框中的菜单项; 6.将QComboBox对象添加到表头视图中; 7.通过activated()信号设置菜单选中事件的响应函数; 8.在响应函数中调用hideColumn()和showColumn()方法实现的隐藏和显示。 在实现表头筛选时,还需要注意以下几点: 1.筛选菜单对应只需要在第一次打开筛选菜单时添加,后续打开不需要再重新添加; 2.在菜单选中事件的响应函数内,要先清空原有的筛选条件再应用新的筛选条件; 3.如果表格的数据是动态改变的,需要在数据更新时重新生成筛选菜单。 对于表头筛选的高级功能,可以考虑使用QHeaderView和QAbstractProxyModel等组件和类来实现。通过对这些类和组件的深入学习和实践,将可以更加精准、高效地实现表头筛选和数据处理等任务。 ### 回答3: PyQt5是一个Python编程语言的图形用户界面(GUI)开发框架,能够完美地与Qt5进行交互。其中,QTableWidget是用于显示二维表格数据的Qt5控件,能够方便地进行数据的编辑、排序和筛选。 PyQt5中,我们可以通过设置QTableWidget表头的点击事件来实现表头筛选。具体可以采用以下的方式: 1. 首先,将表头的点击信号连接到自定义的处理函数上,在这个处理函数中负责调用QTableWidget排序函数和刷新UI界面。 ``` self.tableWidget.horizontalHeader().sectionClicked.connect(self.sortTable) def sortTable(self, index): self.tableWidget.sortByColumn(index) self.tableWidget.update() ``` 2. 然后,我们可以通过前缀匹配的方式来实现基于表头的筛选功能。即在表格中输入一个字符串,然后只显示前缀匹配的行。 ``` # 在筛选框内输入字符串 filter_text = self.lineEdit.text().lower() # 遍历每一行,只显示前缀匹配的行 for row in range(self.tableWidget.rowCount()): if filter_text in str(self.tableWidget.item(row, 0).text().lower()): # 这里以第一为例 self.tableWidget.setRowHidden(row, False) else: self.tableWidget.setRowHidden(row, True) ``` 通过以上方式,我们就可以实现基于表头的筛选功能了。需要注意的是,由于QTableWidget的数据实际上是存放在QTableWidgetItem中的,所以在筛选时需要先将数据转换为字符串进行操作。另外,这里只是简单的实现了基于前缀匹配的筛选,实际上可以根据需要进行各种自定义筛选操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值