PyQt:如何排序QTableView列(字符串和数字) [英] PyQt: How to sort QTableView columns(strings and numericals)

查看:5673
本文介绍了PyQt:如何排序QTableView列(字符串和数字)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



我的代码:

  model = QtGui.QStandardItemModel()

打开(file_name_temp,rt)as fileInput:
i = 1
对于csv.reader(fileInput)中的行:
item = QtGui.QStandardItem()
在行中的字段:
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 b $ b 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.setHorizo​​ntalHeaderLabels(col_names)
self.tableView.hideRow(0)
self.model.setSortRole(QtCore.Qt.UserRole)

更新1


$ b self.File_Name中的b

  if(.csv或.txt):
with open(file_name_temp,rt)as fileInput:
i = 1
reader = csv.reader(fileInput)
下一个(读者,无)
读取器中的行:
对于范围内的x(0,Num_col + 1):
try:
int(row [x])
row [x] = int(row [x])
除了ValueError:
print('Not Int'
items = []
在行中的字段:
item = QtGui.QStandardItem(field)
如果type(field)== int:
print('yyy ')
data = int(field)
else:
data = field
item.setData(data,QtCore.Qt.UserRole)
items.append )
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对象在0x0000000006DF3828>,< PyQt4.QtGui.QStandardItem对象0x0000000006DF3798>,< PyQt4.QtGui.QStandardItem对象0x0000000006DF3678> ;,< PyQt4.QtGui.QStandardItem对象0x0000000006DF3EE8>,< PyQt4 .QtGui.QStandardItem对象在0x0000000006DF3F78>,< PyQt4.QtGui.QStandardItem对象在0x00000000095D4048>,< PyQt4.QtGui.QStandardItem对象在0x00000000095D40D8>]

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

解决方案

您不会显示如何为模型创建项目,但可能您正在做这样的操作:

  item = QtGui.QStandardItem(str(value))



要获得数字排序,请改为设置以下值:

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

但是请注意,这也会使表格自动使用旋转框编辑单元格,这可能不是你想要的。所以一个替代的解决方案是:

  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))


$ b b

UPDATE



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

  import sys,csv 
从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 $ b self,'打开CSV','','CSV文件(* .csv * .txt)')
如果路径:
self.model.setRowCount(0)
with open (路径)作为流:
reader = csv.reader(stream)
next(阅读器,无)
读取器中的行:
items = []
字段:
item = QtGui.QStandardItem(field)
对于numtype in(int,float):
try:
data = numtype(field)
break
except(ValueError,OverflowError):
pass
else:
print('不是数字:%r'%字段)
数据=字段
item.setData(data,QtCore.Qt.UserRole)
items.append(item)
self.model.appendRow(items)

如果__name__ =='__main__':

app = QtGui.QApplication(sys.argv)
window = Window()
window.setGeometry(500,150,600,400)
window.show ()
sys.exit(app.exec_())


The line self.tableView.setSortingEnabled(True) sorts a table view when clicking on the header, but it sorts incorrectly. That is, it thinks every column is a string (e.g. it sorts numbers like 1,11,12,2,22,3, etc). How do I correct this?

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)

gives the output as:

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>]

everything seems good in console but on the GUI window it does not show the table?

解决方案

You don't show how you are creating the items for the model, but presumably you are doing something like this:

item = QtGui.QStandardItem(str(value))

where value is a python numeric type.

To get numeric sorting, set the values like this instead:

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

But note that this will also make the table automatically use spin-boxes for editing cells, which you may not want. So an alternative solution would be:

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

Finally, for fully customised sorting, you can also subclass QStandardItem:

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

item = StandardItem(str(value))

UPDATE:

Here is a demo script that reads csv files into a table, automatically converting the fields into the correct data-type for sorting:

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_())

这篇关于PyQt:如何排序QTableView列(字符串和数字)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆