Почему rowHeight моего QTableWidgetItems не устанавливается должным образом при обновлении? - PullRequest
0 голосов
/ 25 июня 2018

Я создаю виджет таблицы, который хочу автоматически обновлять через определенные промежутки времени.Проблема в том, что при обновлении содержимого таблицы происходит сброс их свойства 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. За исключением этой последней части.Он правильно перебирает строки, потому что печатает каждый раз.Но по какой-то причине он перестает устанавливать высоту строк после первого цикла.

Есть идеи, почему это происходит?

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Нет необходимости создавать поток для обновления 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_())
0 голосов
/ 25 июня 2018

Извините, но вам не нужен отдельный поток для этой задачи.

Использование класса 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

...