Привет всем!
Мне надо создать таблицу на 124 строки и 5 столбцов, при этом текст в любой из ячеек таблицы может иметь разный цвет, гарнитуру и кегель. Поскольку одна и та же ячейка в QTableWidget не может иметь несколько шрифтов одновременно (если верить форумам), то для каждой ячейки приходится предварительно создавать QLabel. И все бы ничего, на моем хиленьком нетбуке прорисовка таблицы (с созданием QLabel, без доп. шрифтов) занимает 1 с, однако, когда я пытаюсь раскрасить таблицу (см. «<span style=' в коде), на прорисовку уходит 3,6-4 с. Как-то многовато. Нельзя ли как-нибудь оптимизировать?
ЛОР не дает вставить весь код, см. его полностью здесь. Вот основная часть кода (без данных для вставки):
#!/usr/bin/python3
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import sys
from time import time
col_limit=5
width = 1024
height = 768
db_elem = {} # skipped
# Show a table with article entries
def show_article(cells):
start=time()
app = QApplication(sys.argv)
table = QTableWidget()
table.resize(width,height)
assert len(cells) > 0
assert col_limit >= 2
table.setRowCount(len(cells))
table.setColumnCount(col_limit)
# Insert data into the table
for i in range(len(cells)):
for j in range(col_limit):
label=QLabel()
#label.setText(cells[i][j]['dic'] + cells[i][j]['term'] + cells[i][j]['comment'])
label.setText("<span style='font-size:12pt;color:navy;'>%s</span><span style='font-size:12pt;'>%s</span><span style='font-size:10pt;color:gray;'>%s</span>" % (cells[i][j]['dic'],cells[i][j]['term'],cells[i][j]['comment']))
label.setWordWrap(True)
label.setAlignment(Qt.AlignLeft|Qt.AlignTop)
table.setCellWidget(i,j,label)
# We assume that the first column contains dictionary titles and must be narrower than other columns
first_col=int((width/col_limit)*0.7)
standard_col=(width-first_col)/(col_limit-1)
table.setColumnWidth(0,first_col)
i=1
while i < len(cells):
table.setColumnWidth(i,standard_col)
i+=1
# Set a text resize mode
# If you are using Qt 5, QHeaderView::setResizeMode() is no longer available. Instead, you can use QHeaderView::setSectionResizeMode(). Just call it for every column.
for i in range(len(cells)):
table.verticalHeader().setSectionResizeMode(i,QHeaderView.ResizeToContents)
end=time()
print('Table has been drawn in %s sec.' % str(end-start))
table.show()
app.exec_()
show_article(cells)