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

后端 未结 2 2047
清酒与你
清酒与你 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 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.

提交回复
热议问题