LINUX.ORG.RU

Разный шрифт в ячейках таблицы

 , ,


0

1

Привет всем!

Нужно с помощью 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_())

Тормоза начинаются при вставке больших фрагментов текста, например, как здесь.

Deleted

В методе data лови роль Qt::FontRole ну и возвращай шрифт, какой там тебе надо.

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

А как это сделать? Я в моделях зеленый совсем. Изменил код на:

...
		# dic
		cell_text = "<span style='color:navy;'>" + cells[i][j]['dic'] + "</span>"
		# term
		cell_text += cells[i][j]['term']
		# comment
		cell_text += "<span style='color:gray;'>" + cells[i][j]['comment'] + "</span>"
		tmp_row += [cell_text]
...


def data(self, index, role=Qt.DisplayRole):
		if not index.isValid():
			return QVariant()
		if role == Qt.FontRole:
			return QFont('Serif',14)
		else:
			try:
				return QVariant(self.arraydata[index.row()][index.column()])
			except:
				return QVariant()
но это не помогло.

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

Єто все потому, что у тебя бред написан!
Ты сначала создаешь в воздухе QTableView, а потом поверху родительского виджета лепишь велосипед из QGridLayout и QLabel.

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