提问人:Lisitrx 提问时间:11/8/2023 更新时间:11/8/2023 访问量:35
Pyside6 QTableWidget 按列排序 - 正确排序和性能问题
Pyside6 QTableWidget sorting by column - problems with correct sorting and performance
问:
我有一个 Pyside6 应用程序,其中包含一个具有 10 列和大约 4000 行的 QTableWidget。当我单击列名称时,我想按单击的列的值对表进行排序。除第一列外,所有列都包含小数点后两位的数字(我知道单元格将它们显示为文本)。
尝试对值进行排序时,我遇到以下问题:
如果用于排序的列内的数字具有不同的长度(例如 100.00、3500.00、10.00),则排序在不同长度内是正确的,但不会按预期从 0.00 到最大数字进行排序。
当我的表中有几千行时,排序本身非常慢。在排序过程中,应用程序会冻结,并且在排序完成之前无法使用。这最多可能需要 10 秒。
这是我如何将数据填充到表中的代码:
#Set results df as row in table widget
# Get the current row count
current_row_count = self.table_widget.rowCount()
# Insert a new row at the end
self.table_widget.insertRow(current_row_count)
column_count = 0
#for result in results_list:
for column in results_df:
current_value = results_df[column].values[0]
#print("Current value: ", current_value)
if not column_count == 0:
table_item = QTableWidgetItem(f"{current_value:.2f}")
else:
table_item = QTableWidgetItem(current_value)
table_item.setFlags(table_item.flags() & ~Qt.ItemIsEditable)
# Set alignment to center
table_item.setTextAlignment(Qt.AlignCenter)
self.table_widget.setItem(current_row_count, column_count, table_item)
column_count += 1
这是我通过单击列标题对表格进行排序的代码:
self.table_widget.setSortingEnabled(True)
self.table_widget.horizontalHeader().sectionClicked.connect(self.sort_table)
def sort_table(self, column):
current_order = self.table_widget.horizontalHeader().sortIndicatorOrder()
if current_order == Qt.AscendingOrder:
new_order = Qt.DescendingOrder
else:
new_order = Qt.AscendingOrder
self.table_widget.sortItems(column, new_order)
为了解决第一个问题(排序不正确),我尝试使用此代码(使用 setData)以不同的方式填充我的表格,但我只是得到空单元格,我不知道为什么:
#Set results df as row in table widget
# Get the current row count
current_row_count = self.table_widget.rowCount()
# Insert a new row at the end
self.table_widget.insertRow(current_row_count)
column_count = 0
#for result in results_list:
for column in results_df:
current_value = results_df[column].values[0]
#print("Current value: ", current_value)
if not column_count == 0:
current_value_rounded = round(current_value, 2)
table_item = QTableWidgetItem()
table_item.setData(Qt.DisplayRole, current_value_rounded)
else:
table_item = QTableWidgetItem(current_value)
table_item.setFlags(table_item.flags() & ~Qt.ItemIsEditable)
# Set alignment to center
table_item.setTextAlignment(Qt.AlignCenter)
self.table_widget.setItem(current_row_count, column_count, table_item)
column_count += 1
对于第一个问题: 有人知道为什么第二个代码示例不能使用 setData 来填充我的表吗? 对于第二个问题: 有人知道如何在分拣过程正常工作时加快分拣过程吗?
答: 暂无答案
上一个:创建半透明布局
评论
values()
返回数据的 numpy 表示。这些不是实际的 python 浮点数(或整数),但可能是不同类型的(long、double 等)。更改为 .请注意,如果您有 DataFrame,则在 QTableView 中实现 QAbstractTableModel 子类而不是 QTableWidget 通常更有意义。results_df
current_value_rounded = float(round(current_value, 2))
sort()