Python PyQt - QTableWidget, JSON, and emitSignal causing blank cells

后端 未结 2 2042
清酒与你
清酒与你 2021-02-10 22:20

I am using PyQt for a simple application that reads from a log file with JSON formatted strings, and outputs them nicely in a table.

Everything is working as expected e

相关标签:
2条回答
  • 2021-02-10 22:56

    I think solution is to disable sorting while populating table by calling QTableWidget.setSortingEnabled(False), and then restore sorting.

    Example code:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    import sys
    from PyQt4 import QtCore, QtGui
    
    class MainWindow(QtGui.QWidget):
        updateSignal = QtCore.pyqtSignal()
        def __init__(self, parent=None):
            super(MainWindow, self).__init__(parent)
            self.table_widget = QtGui.QTableWidget()
            self.button = QtGui.QPushButton('Populate')
            self.button.clicked.connect(self.populate)
            layout = QtGui.QVBoxLayout()
            layout.addWidget(self.table_widget)
            layout.addWidget(self.button)
            self.setLayout(layout)
            self.updateSignal.connect(self.update_table)
            self.populate()
    
        def populate(self):
            nrows, ncols = 5, 2
            self.table_widget.setSortingEnabled(False)
            self.table_widget.setRowCount(nrows)
            self.table_widget.setColumnCount(ncols)
            for i in range(nrows):
                for j in range(ncols):
                    item = QtGui.QTableWidgetItem('%s%s' % (i, j))
                    self.table_widget.setItem(i, j, item)
            self.updateSignal.emit()
            self.table_widget.setSortingEnabled(True)
    
        def update_table(self):
            self.table_widget.sortItems(0,QtCore.Qt.DescendingOrder)
    
    
    if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
        wnd = MainWindow()
        wnd.resize(640, 480)
        wnd.show()
        sys.exit(app.exec_())
    
    0 讨论(0)
  • 2021-02-10 23:11

    I've been working on something similar, but was not setting up a sort. I tried both ways, and both worked for me.

    My list, is a list of dictionaries, so slightly different from yours.

    I have created a tabledialog class, that contains my table widget, and this function, is called from my main window:

    def setuptable(self, alist):
    
        # setup variables
        rows = len(alist)
        cols = len(alist[0])
        keys = ['number', 'name', 'phone', 'address'] # for dictonary order
    
        # setup cols, rows
        self.tableWidget.setRowCount(rows)
        self.tableWidget.setColumnCount(cols)
    
        # insert data
        for row in range(rows):
            for col in range(cols):
                item = QtGui.QTableWidgetItem()
                item.setText(alist[row][keys[col]] or '') # or '' for any None values
                table.setItem(row, col, item)
    
        keys = [item.title() for item in keys]  # capitalize
        self.tableWidget.setHorizontalHeaderLabels(keys) # add header names
        self.tableWidget.horizontalHeader().setDefaultAlignment(QtCore.Qt.AlignLeft) # set alignment
        self.tableWidget.resizeColumnsToContents() # call this after all items have been inserted
    
        self.tableWidget.sortItems(1,QtCore.Qt.AscendingOrder)
    

    Also tried using, at the end of my tablesetup function:

    self.emit(QtCore.SIGNAL("loadingDone"))
    

    and setup the slot in my main window, in the init section:

    # setup the dialog
    import dialogtable
    self.tabledialog = dialogtable.dialogtable()
    
    # signal from table dialog
    self.tabledialog.connect(self.tabledialog,QtCore.SIGNAL("loadingDone"),self.tableSort)
    

    And the function called:

    def tableSort(self):
        self.tabledialog.tableWidget.sortItems(1,QtCore.Qt.AscendingOrder)
    

    My tablewidget setup functions:

        # set table widget attributes
        self.tableWidget.setEditTriggers(QtGui.QAbstractItemView.DoubleClicked) # use NoEditTriggers to disable editing
        self.tableWidget.setAlternatingRowColors(True)
        self.tableWidget.setSelectionMode(QtGui.QAbstractItemView.NoSelection)
        self.tableWidget.verticalHeader().setDefaultSectionSize(18) # tighten up the row size
        self.tableWidget.horizontalHeader().setStretchLastSection(True) # stretch last column to edge
        self.tableWidget.setSortingEnabled(True) # allow sorting
    

    I don't bother ever set sorting to false, as the answer above mine recommends.

    0 讨论(0)
提交回复
热议问题