मेरे पास एक QTableWidget है जो कुछ यादृच्छिक मानों से भर जाएगा। तालिका में सॉर्टिंग सक्षम है: tableWidget.setSortingEnabled(True)। छँटाई ठीक काम करती है (मुझे पता है, इस न्यूनतम उदाहरण में यह अल्फ़ान्यूमेरिकल प्रकार की संख्याएँ होंगी)।

हालाँकि, जब मैंने तालिका को एक कॉलम द्वारा क्रमबद्ध किया है, तो SO पर विभिन्न सुझावों के साथ तालिका को साफ़ करना, या तो 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

2
theozh 9 जून 2020, 16:49

1 उत्तर

सबसे बढ़िया उत्तर

समस्या यह है कि जब आप आइटम जोड़ रहे हैं तो आप पुन: व्यवस्थित कर रहे हैं, उदाहरण के लिए मान लें कि आपने पहली पंक्ति का मान सही ढंग से डाला है लेकिन फिर आप (1, 0) में एक नया आइटम दर्ज करते हैं जो आइटम से कम है (0, 0 ) किसके द्वारा फिर से व्यवस्थित किया जाएगा (आइटम (0, j) होगा (1, j)), और जब आप सम्मिलित करते हैं तो आप आइटम सेट करते हैं (1, 1) उस आइटम को प्रतिस्थापित करेगा जो स्थिति (0, 1) पर कब्जा कर लेता है इसलिए आइटम (0 , 2) खाली रहेगा।

समाधान तालिका को पॉप्युलेट करके सॉर्टिंग को अक्षम करना है।

@pyqtSlot()
def on_click_pb_refill(self):
    self.tableWidget.clear()
    self.tableWidget.setSortingEnabled(False)
    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)))
    self.tableWidget.setSortingEnabled(True)
2
eyllanesc 9 जून 2020, 17:07