我正在创建一个表小部件,希望在特定的时间间隔自动刷新。我遇到的问题是刷新表的内容会重置它们的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。最后一部分除外。它正确地在行中循环,因为它每次都打印。但由于某些原因,它会在第一个循环后停止设置行高度
知道为什么会这样吗
无需创建线程来更新
QTableWidget
,您可以使用QTimer
,另一方面,删除QTableWidgetItem
并重新设置它们是非常昂贵的,因此我建议您更新它们很抱歉,此任务不需要单独的线程
使用QTimer类提供重复和单次触发计时器
这里有一个例子,对不起我PyQt5
相关问题 更多 >
编程相关推荐