Проблемы с производительностью со многими виджетами соответственно сложенными QTableWidgets - PullRequest
0 голосов
/ 17 декабря 2018

Мне нужно отобразить сложную таблицу и решил использовать сложенные QTableWidgets.С увеличением числа строк программе требуется много времени для создания всех виджетов и почти одинакового времени для отображения.

Основной файл выглядит следующим образом: MainTable

Составной виджет TableWidget в таблице:

StackedTables

, если ячейка содержит данные, в одной ячейке таблицы имеется хотя бы один виджет TableWidget.MainTable и в худшем случае есть еще 2 TableWidget в этом.Это означает, что у меня может быть 3 TableWidget в одной ячейке.

Измерение времени с помощью cProfile и time.time для 80 строк (с 48 сложными ячейками для каждой строки):

complete update time: 15s (manually stopped)
time to create the table: 7.548534870147705s (time.time over complete function)
display time: 7.5s (complete update time - function time)
rows: 80

     63600 function calls in 7.462 seconds

   Ordered by: internal time

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
 1896    2.455    0.001    3.882    0.002     DigitalePlanungstafel.py:6054(grundWidgetErstellen) -- (create table in cell)
 3936    2.027    0.001    2.027    0.001 {built-in method setCellWidget}
 2535    1.306    0.001    1.306    0.001 {built-in method setColumnCount}
  630    0.770    0.001    1.183    0.002 DigitalePlanungstafel.py:6035(obenWidgetErstellen) -- (create table in table in cell)
 2607    0.674    0.000    0.674    0.000 {built-in method setRowCount}
 2528    0.059    0.000    0.059    0.000 {built-in method horizontalHeader}
 2526    0.021    0.000    0.021    0.000 {built-in method verticalHeader}
  163    0.019    0.000    0.019    0.000 {method 'execute' of 'sqlite3.Cursor' objects}
 2526    0.016    0.000    0.016    0.000 {built-in method setFrameShape}
 1410    0.014    0.000    0.014    0.000 {built-in method setStyleSheet}
 4502    0.013    0.000    0.013    0.000 {built-in method setRowHeight}
 2526    0.009    0.000    0.009    0.000 {built-in method setFixedSize}
 2546    0.009    0.000    0.009    0.000 {built-in method setColumnWidth}
 5052    0.009    0.000    0.009    0.000 {built-in method setVisible}
 1329    0.007    0.000    0.007    0.000 {built-in method setItem}
 2181    0.006    0.000    0.006    0.000 {built-in method cellWidget}
   80    0.005    0.000    0.005    0.000 {built-in method addWidget}
 2526    0.004    0.000    0.004    0.000 {built-in method setEditTriggers}
  929    0.004    0.000    0.004    0.000 {built-in method setBackground}
 1330    0.003    0.000    0.003    0.000 {method 'format' of 'str' objects}
  414    0.003    0.000    0.003    0.000 {built-in method _pickle.loads}
  336    0.003    0.000    0.003    0.000 {method 'strftime' of 'datetime.date' objects}
 2526    0.003    0.000    0.003    0.000 {built-in method setHorizontalScrollBarPolicy}
 1410    0.002    0.000    0.002    0.000 {built-in method setFixedHeight}
 1377    0.002    0.000    0.002    0.000 {built-in method setTextAlignment}
   83    0.002    0.000    0.004    0.000 _strptime.py:321(_strptime)
    2    0.002    0.001    0.002    0.001 {built-in method setSortingEnabled}
 2526    0.001    0.000    0.001    0.000 {built-in method setShowGrid}
 1570    0.001    0.000    0.001    0.000 {built-in method rowHeight}
 2526    0.001    0.000    0.001    0.000 {built-in method setSelectionMode}
  163    0.001    0.000    0.001    0.000 {method 'fetchall' of 'sqlite3.Cursor' objects}
  240    0.001    0.000    0.001    0.000 DigitalePlanungstafel.py:7494(__init__)
 2526    0.001    0.000    0.001    0.000 {built-in method setVerticalScrollBarPolicy}
    1    0.001    0.001    0.001    0.001 {built-in method sortByColumn}
   80    0.001    0.000    0.001    0.000 {built-in method setLayout}
   83    0.001    0.000    0.001    0.000 {built-in method _locale.setlocale}
    1    0.001    0.001    0.001    0.001 {built-in method _sqlite3.connect}
   89    0.000    0.000    0.000    0.000 {built-in method setForeground}
   83    0.000    0.000    0.000    0.000 {method 'match' of '_sre.SRE_Pattern' objects}
   83    0.000    0.000    0.004    0.000 _strptime.py:562(_strptime_datetime)
   48    0.000    0.000    0.000    0.000 {built-in method setHorizontalHeaderItem}
   80    0.000    0.000    0.000    0.000 {built-in method setContentsMargins}
   83    0.000    0.000    0.005    0.000 {built-in method strptime}
   83    0.000    0.000    0.000    0.000 locale.py:379(normalize)
   88    0.000    0.000    0.000    0.000 {built-in method setFont}
  160    0.000    0.000    0.000    0.000 {built-in method setData}
   83    0.000    0.000    0.000    0.000 {method 'groupdict' of '_sre.SRE_Match' objects}
   80    0.000    0.000    0.000    0.000 {built-in method setAlignment}
   83    0.000    0.000    0.001    0.000 _strptime.py:29(_getlang)
   83    0.000    0.000    0.001    0.000 locale.py:565(getlocale)
   83    0.000    0.000    0.001    0.000 locale.py:462(_parse_localename)
   80    0.000    0.000    0.000    0.000 {built-in method setUnderline}
    1    0.000    0.000    0.000    0.000 {built-in method io.open}
  249    0.000    0.000    0.000    0.000 {method 'get' of 'dict' objects}
    1    0.000    0.000    0.000    0.000 {method 'close' of 'sqlite3.Connection' objects}
  160    0.000    0.000    0.000    0.000 {built-in method item}
  742    0.000    0.000    0.000    0.000 DigitalePlanungstafel.py:7499(__lt__)
   48    0.000    0.000    0.000    0.000 {built-in method today}
  165    0.000    0.000    0.000    0.000 {method 'toordinal' of 'datetime.date' objects}
  475    0.000    0.000    0.000    0.000 {method 'append' of 'list' objects}
  167    0.000    0.000    0.000    0.000 {built-in method builtins.len}
  166    0.000    0.000    0.000    0.000 {built-in method builtins.isinstance}
   83    0.000    0.000    0.000    0.000 {method 'end' of '_sre.SRE_Match' objects}
   84    0.000    0.000    0.000    0.000 {method 'lower' of 'str' objects}
    1    0.000    0.000    0.000    0.000 {method 'close' of '_io.TextIOWrapper' objects}
    2    0.000    0.000    0.000    0.000 {built-in method builtins.print}
   83    0.000    0.000    0.000    0.000 {method 'keys' of 'dict' objects}
   47    0.000    0.000    0.000    0.000 {built-in method columnCount}
   83    0.000    0.000    0.000    0.000 {method 'weekday' of 'datetime.date' objects}
   96    0.000    0.000    0.000    0.000 {method 'date' of 'datetime.datetime' objects}
   20    0.000    0.000    0.000    0.000 {built-in method columnWidth}
    1    0.000    0.000    0.000    0.000 {built-in method _locale._getdefaultlocale}
    3    0.000    0.000    0.000    0.000 {method 'split' of 'str' objects}
    1    0.000    0.000    0.000    0.000 _strptime.py:284(_calc_julian_from_U_or_W)
    1    0.000    0.000    0.000    0.000 _bootlocale.py:11(getpreferredencoding)
    1    0.000    0.000    0.000    0.000 {built-in method sortIndicatorOrder}
    2    0.000    0.000    0.000    0.000 {built-in method time.time}
    1    0.000    0.000    0.000    0.000 {method 'cursor' of 'sqlite3.Connection' objects}
    2    0.000    0.000    0.000    0.000 {method 'index' of 'list' objects}
    1    0.000    0.000    0.000    0.000 {built-in method fromordinal}
    1    0.000    0.000    0.000    0.000 {built-in method sortIndicatorSection}
    1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
    1    0.000    0.000    0.000    0.000 codecs.py:259(__init__)

Времядля вызова функции и создания таблицы все в порядке, но программе нужно почти то же самое время, пока она не отреагирует.

Цель состоит в том, чтобы сократить время обновления на прибл.50%.Мне нужно отобразить около 200 строк.

Является ли скомпонованный QTableWidget правильным подходом. Если да, что мне нужно сделать, чтобы оптимизировать время обновления?

Я уже думал об изменении представления сQTableWidget для QGraphicsView и просто рисование прямоугольников.Или, может быть, комбинация, например: использование QTableWidget для заголовка и первых столбцов, а затем объединение всех сложных ячеек и вставка QGraphicsView, но я не уверен, смогу ли я получить правильный размер для нарисованных ячеек, и я делаюне знаю, будет ли время отображения короче.

Как вы, ребята, считаете правильным подходить для такой таблицы?

Если вам нужно, я могу добавить функцию, которая обновляетТаблица.

РЕДАКТИРОВАТЬ:

Сейчас я использую 2 строки в MainTable для одного блока, что уменьшило количество стековых виджетов с 2,526 до 7!

Измерение времени для тех же строк теперь выглядит следующим образом:

complete update time: ~2s (manually stopped)
time to create the table: 0.572490930557251 (time.time over complete function)
display time: ~1.5s (complete update time - function time)
rows: 160
     20912 function calls in 0.534 seconds

Ordered by: internal time

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
 1417    0.258    0.000    0.258    0.000 {built-in method setCellWidget}
   88    0.209    0.002    0.209    0.002 {built-in method setRowCount}
  163    0.017    0.000    0.017    0.000 {method 'execute' of 'sqlite3.Cursor' objects}
 1410    0.010    0.000    0.010    0.000 {built-in method setStyleSheet}
   80    0.005    0.000    0.005    0.000 {built-in method addWidget}
 1336    0.004    0.000    0.004    0.000 {built-in method setItem}
    7    0.003    0.000    0.004    0.001 DigitalePlanungstafel.py:6037(obenWidgetErstellen)
  501    0.003    0.000    0.003    0.000 {built-in method _pickle.loads}
 1990    0.003    0.000    0.003    0.000 {built-in method cellWidget}
  336    0.002    0.000    0.002    0.000 {method 'strftime' of 'datetime.date' objects}
   83    0.002    0.000    0.004    0.000 _strptime.py:321(_strptime)
 1330    0.002    0.000    0.002    0.000 {method 'format' of 'str' objects}
 1410    0.002    0.000    0.002    0.000 {built-in method setFixedHeight}
  929    0.001    0.000    0.001    0.000 {built-in method setBackground}
 1377    0.001    0.000    0.001    0.000 {built-in method setTextAlignment}
  240    0.001    0.000    0.001    0.000 DigitalePlanungstafel.py:7452(__init__)
  163    0.001    0.000    0.001    0.000 {method 'fetchall' of 'sqlite3.Cursor' objects}
   16    0.001    0.000    0.001    0.000 {built-in method setColumnCount}
  770    0.001    0.000    0.001    0.000 {built-in method setSpan}
 2127    0.001    0.000    0.001    0.000 {built-in method item}
 1570    0.001    0.000    0.001    0.000 {built-in method rowHeight}
   80    0.001    0.000    0.001    0.000 {built-in method setLayout}
   83    0.000    0.000    0.000    0.000 {built-in method _locale.setlocale}
    1    0.000    0.000    0.000    0.000 {built-in method _sqlite3.connect}
  167    0.000    0.000    0.000    0.000 {built-in method setRowHeight}
   89    0.000    0.000    0.000    0.000 {built-in method setForeground}
   83    0.000    0.000    0.000    0.000 {method 'match' of '_sre.SRE_Pattern' objects}
   48    0.000    0.000    0.000    0.000 {built-in method setHorizontalHeaderItem}
   83    0.000    0.000    0.004    0.000 _strptime.py:562(_strptime_datetime)
    7    0.000    0.000    0.000    0.000 {built-in method takeItem}
   80    0.000    0.000    0.000    0.000 {built-in method setContentsMargins}
   83    0.000    0.000    0.004    0.000 {built-in method strptime}
   88    0.000    0.000    0.000    0.000 {built-in method setFont}
  160    0.000    0.000    0.000    0.000 {built-in method setData}
   83    0.000    0.000    0.000    0.000 locale.py:379(normalize)
   80    0.000    0.000    0.000    0.000 {built-in method setAlignment}
   83    0.000    0.000    0.001    0.000 _strptime.py:29(_getlang)
   83    0.000    0.000    0.000    0.000 {method 'groupdict' of '_sre.SRE_Match' objects}
   83    0.000    0.000    0.001    0.000 locale.py:565(getlocale)
    1    0.000    0.000    0.000    0.000 {method 'close' of 'sqlite3.Connection' objects}
    1    0.000    0.000    0.000    0.000 {built-in method io.open}
    7    0.000    0.000    0.000    0.000 {built-in method horizontalHeader}
   80    0.000    0.000    0.000    0.000 {built-in method setUnderline}
  249    0.000    0.000    0.000    0.000 {method 'get' of 'dict' objects}
   83    0.000    0.000    0.000    0.000 locale.py:462(_parse_localename)
   48    0.000    0.000    0.000    0.000 {built-in method today}
    7    0.000    0.000    0.000    0.000 {built-in method verticalHeader}
  475    0.000    0.000    0.000    0.000 {method 'append' of 'list' objects}
  167    0.000    0.000    0.000    0.000 {built-in method builtins.len}
  165    0.000    0.000    0.000    0.000 {method 'toordinal' of 'datetime.date' objects}
    1    0.000    0.000    0.000    0.000 {method 'close' of '_io.TextIOWrapper' objects}
  166    0.000    0.000    0.000    0.000 {built-in method builtins.isinstance}
    7    0.000    0.000    0.000    0.000 {built-in method setFrameShape}
   27    0.000    0.000    0.000    0.000 {built-in method setColumnWidth}
   84    0.000    0.000    0.000    0.000 {method 'lower' of 'str' objects}
    1    0.000    0.000    0.000    0.000 {method 'sort' of 'list' objects}
   83    0.000    0.000    0.000    0.000 {method 'end' of '_sre.SRE_Match' objects}
   87    0.000    0.000    0.000    0.000 DigitalePlanungstafel.py:6059(<lambda>)
   83    0.000    0.000    0.000    0.000 {method 'keys' of 'dict' objects}
    2    0.000    0.000    0.000    0.000 {built-in method builtins.print}
    7    0.000    0.000    0.000    0.000 {built-in method setFixedSize}
   14    0.000    0.000    0.000    0.000 {built-in method setVisible}
   83    0.000    0.000    0.000    0.000 {method 'weekday' of 'datetime.date' objects}
   96    0.000    0.000    0.000    0.000 {method 'date' of 'datetime.datetime' objects}
    7    0.000    0.000    0.000    0.000 {built-in method setEditTriggers}
   20    0.000    0.000    0.000    0.000 {built-in method columnWidth}
    7    0.000    0.000    0.000    0.000 {built-in method setHorizontalScrollBarPolicy}
    1    0.000    0.000    0.000    0.000 {built-in method _locale._getdefaultlocale}

Время обновления более чем хорошее, но у меня есть 2 проблемы из-за разделения.

  1. Сортировка (поверх заголовка) больше не работает.Это вызвано слиянием, оно все портит.Есть ли способ заморозить две связанные строки перед сортировкой?

  2. Я хочу, чтобы за раз выбиралась только одна строка.Причины разделения Мне нужно выбрать две связанные строки независимо от того, какая из них выбрана.Ничего страшного, но выглядит не очень хорошо (см. Рисунки).

MainTable выбранная строка

MainTable выбранная строка

1 Ответ

0 голосов
/ 17 декабря 2018

Вы не хотите делать ничего из этого - вместо этого:

  1. Используйте модель для ваших данных.

  2. Используйте модель представления, котораяадаптирует модель к желаемому виду.

  3. Используйте QTableView для отображения модели вида.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...