为什么我的 QTableWidgetItems 的 rowHeight 在刷新时没有正确设置?

Why does my QTableWidgetItems's rowHeight not get properly set on refresh?

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

的调用

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

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_())

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

知道为什么会这样吗?

抱歉,您不需要为此任务创建单独的线程。

使用 QTimer class 提供重复和单次定时器。

这里是一个例子,对不起我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_())

不需要创建线程来更新 QTableWidget,您可以使用 QTimer,另一方面删除 QTableWidgetItem 并重新设置它们很昂贵,所以我建议您更新它们。

import sys
import time

from PySide import QtCore, QtGui

class TestTable(QtGui.QTableWidget):
    def __init__(self, parent=None):
        super(TestTable, self).__init__(parent)

        self.setRowCount(3)
        self.setColumnCount(1)

        for row in range(self.rowCount()):
            for col in range(self.columnCount()):
                self.setItem(row, col, QtGui.QTableWidgetItem(str(time.time())))

        for each in range(self.rowCount()):
            self.setRowHeight(each,   100)
            self.setColumnWidth(each, 250)

        timer_refresh = QtCore.QTimer(self)
        timer_refresh.timeout.connect(self.refresh)
        timer_refresh.start(2000)

    def refresh(self):
        for row in range(self.rowCount()):
            for col in range(self.columnCount()):
                self.item(row, col).setText(str(time.time()))

if __name__ == '__main__':
    app  = QtGui.QApplication(sys.argv)
    test = TestTable()
    test.show()
    sys.exit(app.exec_())