首页 > 解决方案 > 为什么我的 QTableWidgetItems 的 rowHeight 在刷新时没有正确设置?

问题描述

我正在创建一个表格小部件,我想在特定时间间隔自动刷新。我遇到的麻烦是刷新表的内容正在重置它们的 rowHeight 属性并忽略对 setRowHeight() 的调用。

例如,我在这里有一个中继器类在一个单独的线程上运行:

class RepeatedTimer(QtCore.QThread):
    def __init__(self, obj):
        super(RepeatedTimer, self).__init__(obj)
        self.obj = obj
        self.stop = False
    def run(self):
        while not self.stop:
            time.sleep(2)
            self.obj.refresh()

它在我的 QTableWidget 中使用,如下所示:

from PySide import QtCore, QtGui
import sys, time

class TestTable(QtGui.QTableWidget):
    def __init__(self, parent=None):
        super(TestTable, self).__init__(parent)
        self.setColumnCount(1)
        self.thread = RepeatedTimer(self)  # Create the auto-refresher thread
        self.thread.start() # Start the thread
        self.refresh()

    def refresh(self):
        print "Clearing table"
        while self.rowCount():
            self.removeRow(0)
        for each in xrange(3):
            self.insertRow(each)
            text = str(time.time())
            item = QtGui.QTableWidgetItem(text)
            self.setItem(each, 0, item)
        for row in xrange(self.rowCount()):
            self.setRowHeight(row, 100)  # This part is not behaving as expected
            print 'Row %d height: %d' % (row, self.rowHeight(row))

    def closeEvent(self, event):
        print 'Stopping thread...'
        self.thread.stop = True
        self.thread.exit()


app = QtGui.QApplication(sys.argv)
test = TestTable()
test.show()
sys.exit(app.exec_())

如果你运行它,你会看到每次刷新表格时,它都会清除所有内容,在每一行中添加新项目,并将所有行高设置为 100。除了最后一部分。它正确地循环遍历行,因为它每次都打印。但由于某种原因,它在第一个循环后停止设置行高。

任何想法为什么会发生这种情况?

标签: pythonpyqtpyside

解决方案


抱歉,您不需要单独的线程来执行此任务。

使用 QTimer 类提供重复和单次计时器。

这是一个例子,对不起PyQt5

import sys
import time
#from PySide import QtCore, QtGui
from PyQt5.QtWidgets import *
from PyQt5.QtCore    import *

class TestTable(QTableWidget):
    def __init__(self, parent=None):
        super(TestTable, self).__init__(parent)
        self.setWindowTitle("QTableWidget setRowHeight ")
        self.resize(530, 330);

        self.setRowCount(3)
        self.setColumnCount(1)
        self.setHorizontalHeaderLabels(['time.time())',])  
        for each in range(3):
            self.setRowHeight(each,   100)
            self.setColumnWidth(each, 250)

        self.my_qtimer = QTimer(self)
        self.my_qtimer.timeout.connect(self.timerTick)
        self.my_qtimer.start(1000)                     # msec

    def timerTick(self):
        for each in range(3):
            item = QTableWidgetItem(str(time.time()))
            self.setItem(0, each, item) 

app  = QApplication(sys.argv)
test = TestTable()
test.show()
sys.exit(app.exec_())

在此处输入图像描述


推荐阅读