Ale*_*dar 2 python sorting pyqt qtablewidget
我需要将我的QTableWidget的第一列填充为:行:1,行:2 ...行:100,但排序不能按预期工作(数字).使用此代码排序工作正常,但我没有得到预期的文本:
for i in range(0, self.rows):
item = QtGui.QTableWidgetItem()
item.setData(Qt.DisplayRole, "Row: %s" %(i) )
item.setData(Qt.EditRole, i)
self.ui.tableWidget.setItem(i, 0, item)
Run Code Online (Sandbox Code Playgroud)
我得到:1,2,3,4 ......而不是Row:1,Row:2,Row:3 ...我期望EditRole将用于编辑目的(用于数字排序,它工作正常)但我还期望显示文本,因为它是使用DisplayRole设置的.我能以某种方式这样做,或者为了排序而编写函数是唯一的方法吗?
对于QTableWidgetItem
,Qt.DisplayRole
和Qt.EditRole
被对待的一样.
这意味着,在代码中:
item.setData(Qt.DisplayRole, "Row: %s" %(i) )
item.setData(Qt.EditRole, i)
Run Code Online (Sandbox Code Playgroud)
第二行将简单地覆盖第一行中的数据集.所以,实际上,没有单独的EditRole
(除非重新实现data
和setData
功能).
更改排序行为的标准方法是重新实现小于运算符QTableWidgetItem
(默认情况下,硬编码使用DisplayRole
数据进行排序).
以下子类将重现Qt通常用于数字排序的内容:
class TableWidgetItem(QtGui.QTableWidgetItem):
def __lt__(self, other):
return (self.data(QtCore.Qt.UserRole).toLongLong() <
other.data(QtCore.Qt.UserRole).toLongLong())
Run Code Online (Sandbox Code Playgroud)
我仍然对为什么 DisplayRole 和 EditRole 没有按照我的预期做事很感兴趣,但我已经解决了这样的问题:
class MyTableWidgetItem(QtGui.QTableWidgetItem):
def __init__(self, text, sortKey):
QtGui.QTableWidgetItem.__init__(self, text, QtGui.QTableWidgetItem.UserType)
self.sortKey = sortKey
#Qt uses a simple < check for sorting items, override this to use the sortKey
def __lt__(self, other):
return self.sortKey < other.sortKey
Run Code Online (Sandbox Code Playgroud)
...填充表:
for i in range(0, self.rows):
item = MyTableWidgetItem("Row: %s" %(i), i)
self.ui.tableWidget.setItem(i, 1, item)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2908 次 |
最近记录: |