我正在使用PyQt作为一个简单的应用程序,它使用JSON格式的字符串从日志文件中读取,并在表中很好地输出它们。
除非我尝试从'load'函数发出信号,否则一切都按预期工作。此信号由主窗口拾取,位于设计用于为表格提供新信息的插槽中。
如果没有发出信号,表格会完全正确填充:
通过取消注释self.emit
以便发出信号IS,表格最终不完整:
正如您在第一张图片中看到的那样,表格未排序,但所有字段都已填充。在第二个图像中,表格已排序,但某些字段为空白!
填充表格并发送信号的代码:
#openLog function does stuff, then populates the table as follows
self.ui.tableWidget.setRowCount(len(entries))
self.ui.tableWidget.verticalHeader().setVisible(False)
for i, row in enumerate(entries):
for j, col in enumerate(row):
item = QtGui.QTableWidgetItem(col)
self.ui.tableWidget.setItem(i, j, item)
#When this is uncommented, the table ends up having a lot of blank cells.
#self.emit(QtCore.SIGNAL("updateSignal"))
接收信号的代码,并采取行动:
#main window class
#__init__
self.ui.tableWidget.connect(self,QtCore.SIGNAL("updateSignal"),self.updateTable)
def updateTable(self):
self.ui.tableWidget.sortItems(0,QtCore.Qt.DescendingOrder)
程序流程称为:program_init-> register_signal。用户操作打开日志 - > openLog函数填充表/发出信号 - >信号接收/度假表
对于这种方法,我正在使用信号和插槽,就好像我没有,QT / Python会抛出一堆警告,说明从函数重绘GUI / Pixmap是不安全的。
问题: 如何在我想要的列上进行QTableWidget排序,同时确保表格完全填充?
答案 0 :(得分:8)
我认为解决方案是在通过调用QTableWidget.setSortingEnabled(False)
填充表时禁用排序,然后恢复排序。
示例代码:
#!/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_())
答案 1 :(得分:0)
我一直在做类似的事情,但没有设置一种类型。我尝试了两种方式,都为我工作。
我的列表是一个字典列表,与您的字典略有不同。
我创建了一个tabledialog类,它包含我的表小部件,并且这个函数是从我的主窗口调用的:
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)
还尝试在我的tablesetup函数结束时使用:
self.emit(QtCore.SIGNAL("loadingDone"))
并在我的主窗口中设置插槽,在init部分:
# setup the dialog
import dialogtable
self.tabledialog = dialogtable.dialogtable()
# signal from table dialog
self.tabledialog.connect(self.tabledialog,QtCore.SIGNAL("loadingDone"),self.tableSort)
这个函数叫做:
def tableSort(self):
self.tabledialog.tableWidget.sortItems(1,QtCore.Qt.AscendingOrder)
我的tablewidget设置功能:
# 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
我不打算将排序设置为假,正如我上面的答案所推荐的那样。