LINUX.ORG.RU

PyQt Динамическое добавление ячеек в таблицу

 , ,


0

1

Здравствуйте, я новичок в Python. Столкнулся со странной проблемой: Итак, есть окно, сделанное на PyQt (Python 3, PyQt5-5.5) и содержащее определённое число таблиц. Есть поток с бесконечным циклом, обрабатывающий отрисовку этого окна. Необходимо, чтобы поток в нужное время (к примеру, после завершения длинного вычисления в другом процессе) добавил в таблицы окна нужное количество ячеек (QTableWidgetItem) с содержимым. Проблема: при попытке добавить ячейку/её форматирование в таблицу из процесса окно видимо не изменяется (при этом все функции срабатывают, просто результат не отображается). Если запустить те же функции при инициализации окна, то всё сработает. Изменение одного только текста ячеек таблицы из потока срабатывает. Таким образом, создать таблицу с фиксированным количеством ячеек и изменять их значения - легко, добавить ячейку/изменить её ширину - не получается, результат не отобразится. Как же всё-таки сделать динамическое добавление ячеек?



Последнее исправление: Novucu (всего исправлений: 1)

Сложно разобраться без кода, но могу предположить, что не вызывается сигнал dataChanged. Как строки-то добавляете?

midvik
()
Ответ на: комментарий от midvik

Спасибо за упоминание строк. Правда, я уже и сам дозрел и понял, где я был дурак: при добавлении setRowCount и setColumnCount в начало функции отрисовки, ячейки появляются. В противном случае - setItem срабатывает без ошибок, но на самом деле ничего не добавляет. Странно только, что при вызове из главного и единственного потока это работало. А вот присвоение свойств ячейке так и не работает. Код:

        #таблица gen лежит в layout'е boxL, а тот - в widget'е box, которому уже можно задать размеры.

        #w, h определены
        #dic - данные
        box.setFixedHeight(h)

        gen.setRowCount(3)
        gen.setColumnCount(len(dic)+2)
        
        gen.setRowHeight(0, (h-6)/3+1)
        gen.setRowHeight(1, (h-6)/3+1)
        gen.setRowHeight(2, (h-6)/3+1)

        for iterator in range(len(dic)):
            item=dic.popitem()
            TableWidgetItem=QTableWidgetItem(str(item[0][0]))
            gen.setItem(0, iterator, TableWidgetItem)
            gen.setColumnWidth(iterator, w)
            
            TableWidgetItem.setFlags(Qt.NoItemFlags)#делаем ячейку неизменяемой
            TableWidgetItem.setFont(font)
            gen.setItem(0, iterator, TableWidgetItem)

            TableWidgetItem=QTableWidgetItem(str(item[0][1]))

            TableWidgetItem.setFlags(Qt.NoItemFlags) #делаем ячейку неизменяемой
            
            TableWidgetItem.setFont(font)
            gen.setItem(1, iterator, TableWidgetItem)

            TableWidgetItem=QTableWidgetItem(item[1])

            TableWidgetItem.setFlags(Qt.NoItemFlags)#делаем ячейку неизменяемой
            
            TableWidgetItem.setFont(font)
            gen.setItem(2, iterator, TableWidgetItem)
        

Некоторые ячейки получаются правильной ширины, некоторые - нет. Шанс увидеть правильную таблицу - примерно 1/20. Чаще несколько элементов правильной ширины, остальные - стандартной, много больше. Пока не понимаю, от чего это зависит.

Novucu
() автор топика
Ответ на: комментарий от Novucu

Заметил, что при генерации достаточно большого количества таблиц они создаются правильными, а потом «разворачиваются» в стандартный размер ячейки

Novucu
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.