python - 排序后 QTableWidget 的填充不完整

标签 python sorting pyqt qtablewidget

我有一个 QTableWidget,它将填充一些随机值。 该表已启用排序:tableWidget.setSortingEnabled(True)。 排序工作正常(我知道,在这个最小的示例中,它将是按字母数字排序的数字)。

但是,当我按一列对表格进行排序时,然后使用此处的各种建议清除表格,tableWidget.clear()tableWidget.clearContent()tableWidget.setRowCount(0) 并重新填充表格,表格将填充不完整。我已经注意到,在对列进行排序之前,该表将不完全填充。因此,对最后一列进行排序将导致表完全重新填充。但这不是一个可接受的解决方法。

但是我在这里错过了什么?如何始终完全重新填充表?

代码:

import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QAction, QTableWidget, QTableWidgetItem, QVBoxLayout, QPushButton
from PyQt5.QtCore import pyqtSlot
import random

class App(QWidget):

    def __init__(self):
        super().__init__()
        self.title = 'PyQt5 table'
        self.initUI()

    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(0,0,700,500)
        self.layout = QVBoxLayout()

        self.tableWidget = QTableWidget()
        self.tableWidget.setSortingEnabled(True)
        self.layout.addWidget(self.tableWidget)

        self.pb_refill = QPushButton("Refill")
        self.pb_refill.clicked.connect(self.on_click_pb_refill)
        self.layout.addWidget(self.pb_refill)

        self.setLayout(self.layout) 
        self.show()

    @pyqtSlot()
    def on_click_pb_refill(self):
        # self.tableWidget.clear()
        # self.tableWidget.clearContents()
        self.tableWidget.setRowCount(0)
        rows_random = int(random.random()*7)+5
        self.tableWidget.setRowCount(rows_random)
        self.tableWidget.setColumnCount(6)
        for row in range(rows_random):
            for col in range(6):
                number = random.random()
                self.tableWidget.setItem(row, col, QTableWidgetItem(str(number)))

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())

结果:(排序并重新填充后)

enter image description here

最佳答案

问题是,当您添加项目时,您正在重新排序,例如,假设您已正确插入第一行的值,但随后您在 (1, 0) 中输入了一个小于项目 ( 0, 0) 将被重新排序(项目 (0, j) 将是 (1, j)),当您插入时,设置的项目 (1, 1) 将替换占据位置 (0, 1) 的项目,因此项目 (0 , 2) 将保持为空。

解决方案是通过填充表格来禁用排序。

@pyqtSlot()
def on_click_pb_refill(self):
    self.tableWidget.clear()
    <b>self.tableWidget.setSortingEnabled(False)</b>
    rows_random = int(random.random() * 7) + 5
    self.tableWidget.setRowCount(rows_random)
    self.tableWidget.setColumnCount(6)
    for row in range(rows_random):
        for col in range(6):
            number = random.random()
            self.tableWidget.setItem(row, col, QTableWidgetItem(str(number)))
    <b>self.tableWidget.setSortingEnabled(True)</b>

关于python - 排序后 QTableWidget 的填充不完整,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62284220/

相关文章:

python - 稀疏 Scipy/Numpy : an efficient way to implement sum of pairwise mins operation

java - Radix 在 Java 中使用队列对字符串数组进行排序

python - 按第一个、第二个、第三个字符的字母顺序对索引进行排序

对 N 个数据流进行时间排序的算法

python - 如何从 PyQt5 中的第二个文件访问第一个文件方法?

python - 二维数组意外赋值错误

python - 如何读取pandas中的多个表文件并取平均值?

python - 谁能告诉我通过分析这些 Heroku 日志 : 有什么错误

python - PIL 图像到 QPixmap 的转换问题

qt - 设置 QFormLayout QLabel 的垂直对齐方式