Привет всем!
Нужно с помощью QTableWidget или QTableView реализовать разное форматирование в одних и тех же ячейках, например, чтобы часть текста имела одну гарнитуру, часть - другую, часть имела один цвет шрифта, часть - другой. Реализовал это все вставкой QLabel. Однако, как в QTableWidget, так и в QTableView вставка QLabel работает медленно (3-4 секунды на 2 экрана текста). setText не поддерживает разное форматирование для одной и той же ячейки. Можно ли вообще избавиться от вставки в таблицу посторонних виджетов типа QLabel и реализовать все с помощью html-тэгов? setText тэги не распознает, они распознаются в QLabel, но с ним возникают тормоза. На данный момент код такой:
#!/usr/bin/python3
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from time import time
import sys
cells = [[{'type': 'unselectable', 'dic': 'Общая лексика', 'term': '', 'url': '', 'comment': ''}, {'type': 'selectable', 'dic': '', 'term': 'класс', 'url': '', 'comment': ' (the top of the class - первый ученик (в классе))'}, {'type': 'selectable', 'dic': '', 'term': 'разряд', 'url': '', 'comment': ''}, {'type': 'selectable', 'dic': '', 'term': 'группа', 'url': '', 'comment': ''}, {'type': 'selectable', 'dic': '', 'term': 'категория', 'url': '', 'comment': ' (class of problems - круг вопросов)'}], [{'type': 'unselectable', 'comment': '', 'dic': '', 'url': '', 'term': ''}, {'type': 'selectable', 'dic': '', 'term': 'вид', 'url': '', 'comment': ''}, {'type': 'selectable', 'dic': '', 'term': 'род', 'url': '', 'comment': ''}, {'type': 'selectable', 'dic': '', 'term': 'сорт', 'url': '', 'comment': ''}, {'type': 'selectable', 'dic': '', 'term': 'качество', 'url': '', 'comment': ''}], [{'type': 'unselectable', 'comment': '', 'dic': '', 'url': '', 'term': ''}, {'type': 'selectable', 'dic': '', 'term': 'отличие', 'url': '', 'comment': ''}, {'type': 'selectable', 'dic': '', 'term': 'курс', 'url': '', 'comment': ' (to take classes (in) - проходить курс обучения (где-либо))'}, {'type': 'selectable', 'dic': '', 'term': 'труппа', 'url': '', 'comment': ''}, {'type': 'selectable', 'dic': '', 'term': 'отряд', 'url': '', 'comment': ''}], [{'type': 'unselectable', 'comment': '', 'dic': '', 'url': '', 'term': ''}, {'type': 'selectable', 'dic': '', 'term': 'общественный класс', 'url': '', 'comment': ''}, {'type': 'selectable', 'dic': '', 'term': 'звание', 'url': '', 'comment': ''}, {'type': 'selectable', 'dic': '', 'term': 'сословие', 'url': '', 'comment': ''}, {'type': 'selectable', 'dic': '', 'term': 'время начала занятий', 'url': '', 'comment': ' (when is the class? - когда начинаются занятия?)'}], [{'type': 'unselectable', 'comment': '', 'dic': '', 'url': '', 'term': ''}, {'type': 'selectable', 'dic': '', 'term': 'тип корабля', 'url': '', 'comment': ''}, {'type': 'selectable', 'dic': '', 'term': 'выпуск', 'url': '', 'comment': ' (студентов или учащихся такого-то года)'}, {'type': 'selectable', 'dic': '', 'term': 'урок', 'url': '', 'comment': ''}, {'type': 'selectable', 'dic': '', 'term': 'аудитория', 'url': '', 'comment': ''}]]
row_nos = len(cells)
col_nos = len(cells[0])
my_array = []
for i in range(row_nos):
tmp_row = []
for j in range(col_nos):
# dic
cell_text = "<span style='font-size:9pt;color:navy;'>"
cell_text += cells[i][j]['dic']
cell_text += "</span>"
# term
cell_text += "<span style='font-size:9pt;color:black;'>"
cell_text += cells[i][j]['term']
cell_text += "</span>"
# comment
cell_text += "<span style='font-size:9pt;color:gray;'>"
cell_text += cells[i][j]['comment']
cell_text += "</span>"
tmp_row += [cell_text]
my_array += [tmp_row]
assert len(cells) == len(my_array)
assert len(cells[0]) == len(my_array[0])
class MyWindow(QWidget):
def __init__(self, *args):
QWidget.__init__(self, *args)
tablemodel = MyTableModel(my_array, self)
tableview = QTableView()
tableview.setModel(tablemodel)
tableview.verticalHeader().setVisible(False)
tableview.horizontalHeader().setVisible(False)
#for i in range(row_nos):
# tableview.verticalHeader().setSectionResizeMode(i,QHeaderView.ResizeToContents)
tableview.setShowGrid(False)
layout = QGridLayout(self)
layout.setSpacing(1)
for i in range(row_nos):
for j in range(col_nos):
label = QLabel(tableview)
label.setText(my_array[i][j])
label.setWordWrap(True)
layout.addWidget(label,i,j)
self.setLayout(layout)
class MyTableModel(QAbstractTableModel):
def __init__(self, datain, parent=None, *args):
QAbstractTableModel.__init__(self, parent, *args)
self.arraydata = datain
def rowCount(self, parent):
#return len(self.arraydata)
return row_nos
def columnCount(self, parent):
#return len(self.arraydata[0])
return col_nos
def data(self, index, role):
if not index.isValid():
return QVariant()
elif role != Qt.DisplayRole:
return QVariant()
try:
return QVariant(self.arraydata[index.row()][index.column()])
except:
return QVariant()
if __name__ == '__main__':
start_time = time()
app = QApplication(sys.argv)
w = MyWindow()
w.show()
w.setWindowTitle('<Article Title>')
end_time = time()
print('Завершено за %s с.' % (str(end_time - start_time)))
sys.exit(app.exec_())
Тормоза начинаются при вставке больших фрагментов текста, например, как здесь.