PyQt:如何对 QTableView 列进行排序(字符串和数字)

2024-01-06

线路self.tableView.setSortingEnabled(True)单击标题时对表视图进行排序,但排序不正确。也就是说,它认为每一列都是一个字符串(例如,它对数字进行排序,例如1,11,12,2,22,3, ETC)。我该如何纠正这个问题?

My code:

self.model = QtGui.QStandardItemModel()

with open(file_name_temp, "rt") as fileInput:
    i = 1
    for row in csv.reader(fileInput):
        item = QtGui.QStandardItem()
        for field in row:
            items = [
                item.setData(field, QtCore.Qt.UserRole)
            ]
            print(items)
        self.model.appendRow(items)

    tab_table_view = QtGui.QWidget()
    self.Tab.insertTab(0, tab_table_view, self.File_Name)
    self.tableView = QtGui.QTableView(tab_table_view)
    self.tableView.setGeometry(QtCore.QRect(0, 0, 721, 571))
    self.model = QtGui.QStandardItemModel(self)
    self.tableView.setModel(self.model)
    colll = self.Datas.dtypes.index
    col_names = np.array(colll)
    col_names = np.insert(col_names, 0, self.Datas.index.name)
    self.model.setHorizontalHeaderLabels(col_names)
    self.tableView.hideRow(0)
    self.model.setSortRole(QtCore.Qt.UserRole)

Update 1:

if (".csv" or ".txt") in self.File_Name:
        with open(file_name_temp, "rt") as fileInput:
            i = 1
            reader = csv.reader(fileInput)
            next(reader, None)
            for row in reader:
                for x in range(0,Num_col+1):
                    try:
                        int(row[x])
                        row[x]=int(row[x])
                    except ValueError:
                        print('Not Int')
                items = []
                for field in row:
                    item = QtGui.QStandardItem(field)
                    if type(field)==int:
                        print('yyy')
                        data = int(field)
                    else:
                        data = field
                    item.setData(data, QtCore.Qt.UserRole)
                    items.append(item)
                print(items)
                self.model.appendRow(items)

输出如下:

yyy
yyy
yyy
yyy
yyy
yyy
yyy
yyy
yyy
[<PyQt4.QtGui.QStandardItem object at 0x0000000006DF3948>, <PyQt4.QtGui.QStandardItem object at 0x0000000006DF38B8>, <PyQt4.QtGui.QStandardItem object at 0x0000000006DF3828>, <PyQt4.QtGui.QStandardItem object at 0x0000000006DF3798>, <PyQt4.QtGui.QStandardItem object at 0x0000000006DF3678>, <PyQt4.QtGui.QStandardItem object at 0x0000000006DF3EE8>, <PyQt4.QtGui.QStandardItem object at 0x0000000006DF3F78>, <PyQt4.QtGui.QStandardItem object at 0x00000000095D4048>, <PyQt4.QtGui.QStandardItem object at 0x00000000095D40D8>]

在控制台中一切似乎都很好,但在 GUI 窗口上它不显示表格?


您没有展示如何为模型创建项目,但大概您正在做这样的事情:

item = QtGui.QStandardItem(str(value))

where value是一个Python数字类型。

要进行数字排序,请设置如下值:

item = QtGui.QStandardItem()
item.setData(value, QtCore.Qt.DisplayRole)

但请注意,这也会使表格自动使用旋转框来编辑单元格,而您可能不希望这样做。因此,替代解决方案是:

item = QtGui.QStandardItem(str(value))
item.setData(value, QtCore.Qt.UserRole)
...
model.setSortRole(QtCore.Qt.UserRole)

最后,为了完全自定义排序,您还可以子类化QStandardItem:

class StandardItem(QtGui.QStandardItem):
    def __lt__(self, other):
        return int(self.text()) < int(other.text())

item = StandardItem(str(value))

UPDATE:

这是一个演示脚本,它将 csv 文件读入表中,自动将字段转换为正确的数据类型以进行排序:

import sys, csv
from PyQt4 import QtCore, QtGui

class Window(QtGui.QWidget):
    def __init__(self):
        super(Window, self).__init__()
        self.model = QtGui.QStandardItemModel(self)
        self.model.setSortRole(QtCore.Qt.UserRole)
        self.tableView = QtGui.QTableView()
        self.tableView.setSortingEnabled(True)
        self.tableView.setModel(self.model)
        self.button = QtGui.QPushButton('Open CSV', self)
        self.button.clicked.connect(self.handleButton)
        layout = QtGui.QVBoxLayout(self)
        layout.addWidget(self.tableView)
        layout.addWidget(self.button)

    def handleButton(self):
        path = QtGui.QFileDialog.getOpenFileName(
            self, 'Open CSV', '', 'CSV files (*.csv *.txt)')
        if path:
            self.model.setRowCount(0)
            with open(path) as stream:
                reader = csv.reader(stream)
                next(reader, None)
                for row in reader:
                    items = []
                    for field in row:
                        item = QtGui.QStandardItem(field)
                        for numtype in (int, float):
                            try:
                                data = numtype(field)
                                break
                            except (ValueError, OverflowError):
                                pass
                        else:
                            print('Not a number: %r' % field)
                            data = field
                        item.setData(data, QtCore.Qt.UserRole)
                        items.append(item)
                    self.model.appendRow(items)

if __name__ == '__main__':

    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.setGeometry(500, 150, 600, 400)
    window.show()
    sys.exit(app.exec_())
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PyQt:如何对 QTableView 列进行排序(字符串和数字) 的相关文章

  • iOS 中的 CSV 逐行解析

    我正在 Objective c 中解析 CSV 文件 该文件包含如下内容 line 40 Rising searches line 41 nabi avc Breakout line 42 stonewall 700 line 43 med
  • SpreadsheetML 文件扩展名被 IE 和 FF 更改 - 内容类型错误?

    我正在 PHP 中生成 SpreadsheetML 文件 当用户下载文件并保存时 默认情况下文件会另存为 Report xml 并在 Excel 中打开 但是 如果选择在 Excel 中打开文件而不是保存文件 则文件名将更改为 Report
  • jQuery 表格排序

    我有一个非常简单的 HTML 表格 有 4 列 Facility Name Phone City Specialty 我希望用户能够排序设备名称 and City only 我如何使用 jQuery 进行编码 我发现了这个 我想我应该投入
  • 将 Excel 范围转换为 VBA 字符串

    我想将给定范围内的值转换为 VBA 字符串 其中原始单元格值由任何选定的列分隔符和行分隔符分隔 分隔符可以是一个字符或更长的字符串 行分隔符是行末尾的字符串 该字符串应该像我们从左上角 从左到右 到右下角读取文本一样完成 以下是范围 A1
  • Excel:#CALC!使用 MAP 函数计算间隔重叠时出现错误(嵌套数组)

    我正在努力解决以下公式 它适用于某些情况 但不适用于所有情况 名字input有失败的数据集 得到一个 CALC 描述 嵌套数组 错误 LET input N1 0 0 N1 0 10 N1 10 20 names INDEX input 1
  • 将大型 CSV 加载到 Google BigQuery 时出错

    将大型 CSV 加载到 bigquery 时出现错误 我在网上阅读的所有地方都发现压缩文件有 5GB 大小限制 但 CSV 没有限制 加载操作中的 BigQuery 错误 处理作业 bqjob r3016bbfad3037f 0000015
  • numpy NPV 和 Excel NPV 有区别吗?

    我的 Excel 中有一行包含 11 个值 TotalSavings 0 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 贴现率为 0 08 我在 Excel 中使用 计算 NPVNPV
  • 如何(重新)命名 pandas 数据框中的空列标题而不导出到 csv

    我有一个熊猫数据框df1带有一个索引列和一系列未命名的值 我想为未命名的系列指定一个名称 到目前为止 我知道的唯一方法是导出到df1 csv using df1 to csv df1 csv header Signal 然后使用以下命令重新
  • 如何在清除排序描述后删除wpf网格排序箭头

    我单击网格标题对列进行排序 然后单击 重置 按钮以通过其集合视图清除排序描述 但排序箭头图标仍然保留在标题中 如何去除它 我在尝试弄清楚如何完全清除网格中的排序时遇到了这个问题 感谢 krishnaaditya 回答如何清除标题中的排序箭头
  • 对 std::vector 进行排序但忽略某个数字

    我有一个std vector
  • 启动时的 Excel 加载项

    我正在使用 Visual C 创建 Microsoft Excel 的加载项 当我第一次创建解决方案时 它包含一个名为 ThisAddIn Startup 的函数 我在这个函数中添加了以下代码 private void ThisAddIn
  • 如何通过电子邮件发送 Excel 文件?

    我有一个 excel 文件 Excel 2003 xls 格式 我想用 c 通过电子邮件发送它 我的代码成功发送它 但是当我尝试打开响应文件时 它似乎编码错误 例如 这里是响应文件名 utf 8 B RWxzesOhbW9sw6FzXzIw
  • 如何消除 QTableWidget 中的空白?

    How do I get rid of the whitespace in my application 我想摆脱 QTableWidget 中的空白 蓝色箭头 我该怎么做 这是我的应用程序的代码 gridLayout QGridLayou
  • 使用 VBA 将 Excel 电子表格中嵌入的 Word 文档保存到磁盘

    我们有一个 Excel 电子表格 当前使用存储在公司 LAN 上的 Word 模板生成报告 这对于内部用户来说效果很好 但对于没有连接到 LAN 的任何人来说就不行了 例如 笔记本电脑用户 管理层不希望将模板作为单独的文件分发给外部用户 而
  • HTML/VBA Click 事件未触发

    这是我第一次在 StackOverflow 上发布问题 到目前为止 我已经能够通过 VBA 帮助论坛解决我的大部分问题 我的问题很简单 我有一个自动数据拉取 我需要在其中导出数据 我过去曾在这方面取得过成功 但这次略有不同 我尝试单击以生成
  • 替换字符串变量中的多个字符 (VBA)

    如何替换字符串变量中的多个内容 这是我在 VBA 中的示例函数 Private Function ExampleFunc ByVal unitNr As String If InStr unitNr OE gt 0 Then unitNr
  • 在Javascript中按降序对字符串进行排序(最有效)?

    W3Schools 有这个例子 var fruits Banana Orange Apple Mango fruits sort fruits reverse 这是在 Javascript 中按降序对字符串进行排序的最有效方法吗 Updat
  • 如何使用列表作为pandas数据框中的值?

    我有一个数据框 需要列的子集包含具有多个值的条目 下面是一个带有 运行时 列的数据框 其中包含程序在各种条件下的运行时 df condition a runtimes 1 1 5 2 condition b runtimes 0 5 0 7
  • VBA (Excel) 中 =Empty 和 IsEmpty() 有什么区别?

    我使用了以下 VBA 代码 Do While Cell i 1 lt gt Empty doing things i i 1 Loop 在 Excel 中迭代列 具有双精度 整数值 然后我发现了一种情况 每当单元格的值为 0 时 测试的计算
  • Excel 公式从单元格中获取字符串值并按字母顺序对其字符进行排序

    你能帮我制作一个 Excel 公式 从单元格中获取字符串值并按字母顺序对其字符进行排序吗 Ex 原始单元格值 BACR 已排序的字符单元格 ABCR 编辑 2022 年 4 月 29 日 随着 Office 365 Excel 中引入的动态

随机推荐