Pen*_*der 3 python pyqt qtablewidget
我正在使用PyQt作为一个简单的应用程序,它使用JSON格式的字符串从日志文件中读取,并在表中很好地输出它们.
除非我尝试从"加载"功能发出信号,否则一切都按预期工作.该信号由主窗口拾取,位于设计用于为表格提供新信息的插槽中.
如果没有发出信号,表格将完全正确地填充:

通过取消注释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"))
Run Code Online (Sandbox Code Playgroud)
用于接收信号的代码,并执行:
#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)
Run Code Online (Sandbox Code Playgroud)
程序流称为:program_init-> register_signal.用户操作打开日志 - > openLog函数,填充表/发出信号 - >信号接收/度假表
对于这种方法,我使用的是信号和插槽,就好像我没有,QT/Python会抛出一堆警告,说明从函数重绘GUI/Pixmap是不安全的.
问题: 如何在我想要的列上进行QTableWidget排序,同时确保表格完全填充?
我认为解决方案是在通过调用填充表时禁用排序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_())
Run Code Online (Sandbox Code Playgroud)