python - 为什么我的 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。除了最后一部分。它正确地循环遍历行,因为它每次都打印。但由于某种原因,它在第一个循环后停止设置行高。
任何想法为什么会发生这种情况?
解决方案
抱歉,您不需要单独的线程来执行此任务。
使用 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_())
推荐阅读
- ios - Unity3D iOS 导出错误 - 没有匹配函数调用“objc_msgSendSuper”
- javascript - ReactJS 与 Jquery DataTable 问题
- python - 我必须对 3d 矢量执行加法。变量向量是一个列表
- angular - Angular4在导航Route Resolve之前获取数据
- algorithm - 二进制堆索引
- entity-framework - asp.net core 使用当前用户的 TenantId 创建一个 TenantProvider
- facebook - 脸书 Instagram 网络挂钩
- android - 与外部设备的蓝牙连接问题
- c++ - 不明白array-1是什么意思
- android - 无法将 Facebook 应用程序从开发模式更改为实时模式