如何对QTableWidget列值排序?Qt5.10字符串排序问题求助
解决QTableWidget数字列按字符串排序的问题
嘿,我太懂你这个困扰了——QTableWidget默认把单元格内容当成字符串来排序,结果两位数的数字排起来全乱套,比如12会排在2前面,简直头疼!不用费劲自己写排序脚本,Qt本身就有内置的简单办法解决这个问题,核心就是让控件识别到列里的内容是数字类型,而不是字符串。
下面给你具体的实现步骤:
1. 正确设置单元格的数字数据
如果你是刚往表格里添加内容,别只调用setText()把数字转成字符串塞进去,而是要用setData()方法直接把数字绑定到单元格的Qt.DisplayRole上:
from PyQt5.QtWidgets import QTableWidgetItem from PyQt5.QtCore import Qt # 假设table_widget是你的QTableWidget实例 row = 0 number = 12 item = QTableWidgetItem() item.setData(Qt.DisplayRole, number) # 这里传的是数字,不是字符串! table_widget.setItem(row, 0, item)
这样Qt会自动识别这个单元格的内容是数值,排序时就会按数字大小来比较,而不是字符串的字符顺序。
2. 给已有的字符串数字列“转类型”
如果你的表格已经填好了内容,都是字符串形式的数字,也不用重新填一遍,遍历列把内容转成数字类型就行:
for row in range(table_widget.rowCount()): item = table_widget.item(row, 0) if item is not None: try: # 如果是浮点数就换成float() num_value = int(item.text()) item.setData(Qt.DisplayRole, num_value) except ValueError: # 遇到非数字内容就跳过,保持原样 continue
3. 触发排序(对应你的“Çiz”按钮点击事件)
最后在按钮的点击槽函数里调用排序方法就行,指定按第0列排序:
def on_ciz_button_clicked(): # Qt.AscendingOrder是升序,Qt.DescendingOrder是降序 table_widget.sortItems(0, Qt.AscendingOrder)
别忘了确保你的表格开启了排序支持(如果没开的话加一句table_widget.setSortingEnabled(True))。
这样操作之后,再点击“Çiz”按钮,两位数的数字就会按实际数值大小排序了,完全不用自己写复杂的排序逻辑,Qt的内置机制就帮你搞定啦!
内容的提问来源于stack exchange,提问作者Mustafa Uçar
相关产品推荐
相关产品推荐

