为什么刷新时未正确设置我的QTableWidgetItems的行高?

2024-09-24 02:19:30 发布

您现在位置:Python中文网/ 问答频道 /正文

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

例如,我有一个repeater类在单独的线程上运行:

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。最后一部分除外。它正确地在行中循环,因为它每次都打印。但由于某些原因,它会在第一个循环后停止设置行高度

知道为什么会这样吗


Tags: selfobjtimeinitdefsysthreadrefresh
2条回答

无需创建线程来更新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_())

很抱歉,此任务不需要单独的线程

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

enter image description here

相关问题 更多 >