Russian Qt Forum

Qt => Мультимедиа => Тема начата: Bepec от Апрель 17, 2012, 09:53



Название: QPainter, Делегат и зачёркнутый текст. [РЕШЕНО]
Отправлено: Bepec от Апрель 17, 2012, 09:53
Приветствую всех знакомых и незнакомых.

Задача: Делегат, выводящий текст разного форматирования. БОльший упор идёт на толщину, выделение цветом, зачёркивание, подчёркивание - стандартный в общем то набор.

Вопрос: Как его реализовать?

Проблема то в принципе простая - если задавать необходимое форматирование в шрифте, то он применится на весь выводимый текст:

жирный косой зачёркнутый цветной

1. Если же попытаться выводить текст по частям, встаёт проблема перерисовки и расчёта шрифтов/отступов/расположения/переноса текста. Что соответственно получается громоздко.

жирный косо[/i]й зачёркнутый цветной

2. Если использовать виджет (тот же label), то в принципе всё нормально, кроме неодобрительного моего отношения к 20-25 лейблам на экране. (Хотя вроде бы можно создать один в делегате, вбивать в него данные и отрисовывать, но я не уверен)

3. С помощью QTextDocument, который принимает Html и позволяет отрисовывать своё содержимое. Но и тут закавыка. При вызове его ф-ции drawContents(Qpainter*. QRect = QRect()) он рисует себя в верхнем левом углу. Указание же ему Rect'a лишь обрезает его (проще выражаясь совсем не рисует). Как это обойти незнаю - пробую, буду рад совету.

4. неизвестный способ, но он есть ;)

PS жду ваших советов/обсуждений. Заранее спасибо.


Название: Re: QPainter, Делегат и зачёркнутый текст. Приглашаю к обсуждению.
Отправлено: GreatSnake от Апрель 17, 2012, 10:30
3. С помощью QTextDocument, который принимает Html и позволяет отрисовывать своё содержимое. Но и тут закавыка. При вызове его ф-ции drawContents(Qpainter*. QRect = QRect()) он рисует себя в верхнем левом углу. Указание же ему Rect'a лишь обрезает его (проще выражаясь совсем не рисует). Как это обойти незнаю - пробую, буду рад совету.
Позиционируй отрисовку текста через QPainter::translate().


Название: Re: QPainter, Делегат и зачёркнутый текст. Приглашаю к обсуждению.
Отправлено: schmidt от Февраль 05, 2013, 20:01
Добрый вечер, уважаемые,

Реализовал делегат для отображения HTML-контента в QListView, контент отображается прекрасно, за исключением того, что нижняя граница каждого элемента "уезжает" вниз. Понимаю, что проблема в функции sizeHint(), но не знаю, откуда получить "корректную высоту" QTextDocument'а, то есть область, которую занимает отрисованный HTML. Вот код функции sizeHint():

Код:
QSize ChatViewItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const {

    QStyleOptionViewItemV4 options;
    initStyleOption(&options, index);

    // Create QTextDocument to render HTML
    QTextDocument doc;
    doc.setHtml(options.text);

    // Set document width the same as QListView's width
    doc.setTextWidth(options.rect.width());

    return QSize(doc.idealWidth(), doc.size().height());
}

На картинке во вложении можно посмотреть, как выглядит это лишнее пустое пространство в элементах QListView.

Подскажите, как вернуть/рассчитать высоту, которую реально занимает отрисованный HTML контент?


Название: Re: QPainter, Делегат и зачёркнутый текст. Приглашаю к обсуждению.
Отправлено: Bepec от Февраль 05, 2013, 21:51
Говорят в чужих некро темах невежливо задавать свои вопросы :)

1 вопрос = 1 тема.


Название: Re: QPainter, Делегат и зачёркнутый текст. Приглашаю к обсуждению.
Отправлено: Old от Февраль 05, 2013, 21:57
Подскажите, как вернуть/рассчитать высоту, которую реально занимает отрисованный HTML контент?
Смотри на:
void QTextDocument::setTextWidth ( qreal width )
QSizeF QTextDocument::size () const



Название: Re: QPainter, Делегат и зачёркнутый текст. Приглашаю к обсуждению.
Отправлено: Bepec от Февраль 05, 2013, 22:23
Да, кстати, отпишусь о результате начального вопроса темы:
Справился с отрисовкой благодаря совету GreatSnake и небольшого разбирательства с афинными преобразованиями :D


Название: Re: QPainter, Делегат и зачёркнутый текст. Приглашаю к обсуждению.
Отправлено: m_ax от Февраль 05, 2013, 22:34
Да, кстати, отпишусь о результате начального вопроса темы:
Справился с отрисовкой благодаря совету GreatSnake и небольшого разбирательства с афинными преобразованиями :D

Можно было проще сделать.. Как то делал подобный крендель..


Название: Re: QPainter, Делегат и зачёркнутый текст. Приглашаю к обсуждению.
Отправлено: schmidt от Февраль 06, 2013, 09:57
Цитировать
Говорят в чужих некро темах невежливо задавать свои вопросы

Понял, учту :)

Смотри на:
void QTextDocument::setTextWidth ( qreal width )
QSizeF QTextDocument::size () const

Именно эти функции и использую в вышеприведенном коде. Померил размеры областей в пикселах, понял, что дело не в size(),height(). Где-то неправильно определяю границы области для элементов QListView,

P.S. В любом случае в эту тему больше не пишу, дабы проявить уважение к участникам оригинальной темы  :)


Название: Re: QPainter, Делегат и зачёркнутый текст. Приглашаю к обсуждению.
Отправлено: Bepec от Февраль 06, 2013, 09:59
Старые темы надо закрывать, что я в принципе и сделаю. Спасибо всем за помощь.