PyQt:如何sortingQTableView列(string和数字)

self.tableView.setSortingEnabled(True)行在单击标题时sorting表视图,但sorting不正确。 也就是说,它认为每一列都是一个string(例如它像1,11,12,2,22,3等数字sorting)。 我该如何纠正?

我的代码:

 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) 

更新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窗口中却不显示表格?

你不显示你是如何创build模型的项目,但可能你正在做这样的事情:

 item = QtGui.QStandardItem(str(value)) 

其中value是一个python数字types。

要获得数字sorting,请改为像这样设置值:

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

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

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

最后,对于完全自定义的sorting,您还可以QStandardItem

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

更新

这是一个演示脚本,它将csv文件读入表格,自动将字段转换为正确的数据types进行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_())