Russian Qt Forum
Ноябрь 22, 2024, 22:23 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QPainter, Делегат и зачёркнутый текст. [РЕШЕНО]  (Прочитано 7004 раз)
Bepec
Гость
« : Апрель 17, 2012, 09:53 »

Приветствую всех знакомых и незнакомых.

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

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

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

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

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

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

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

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

4. неизвестный способ, но он есть Подмигивающий

PS жду ваших советов/обсуждений. Заранее спасибо.
« Последнее редактирование: Февраль 06, 2013, 09:59 от Bepec » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Апрель 17, 2012, 10:30 »

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

Qt 5.11/4.8.7 (X11/Win)
schmidt
Гость
« Ответ #2 : Февраль 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 контент?
Записан
Bepec
Гость
« Ответ #3 : Февраль 05, 2013, 21:51 »

Говорят в чужих некро темах невежливо задавать свои вопросы Улыбающийся

1 вопрос = 1 тема.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #4 : Февраль 05, 2013, 21:57 »

Подскажите, как вернуть/рассчитать высоту, которую реально занимает отрисованный HTML контент?
Смотри на:
void QTextDocument::setTextWidth ( qreal width )
QSizeF QTextDocument::size () const

Записан
Bepec
Гость
« Ответ #5 : Февраль 05, 2013, 22:23 »

Да, кстати, отпишусь о результате начального вопроса темы:
Справился с отрисовкой благодаря совету GreatSnake и небольшого разбирательства с афинными преобразованиями Веселый
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #6 : Февраль 05, 2013, 22:34 »

Да, кстати, отпишусь о результате начального вопроса темы:
Справился с отрисовкой благодаря совету GreatSnake и небольшого разбирательства с афинными преобразованиями Веселый

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

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
schmidt
Гость
« Ответ #7 : Февраль 06, 2013, 09:57 »

Цитировать
Говорят в чужих некро темах невежливо задавать свои вопросы

Понял, учту Улыбающийся

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

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

P.S. В любом случае в эту тему больше не пишу, дабы проявить уважение к участникам оригинальной темы  Улыбающийся
Записан
Bepec
Гость
« Ответ #8 : Февраль 06, 2013, 09:59 »

Старые темы надо закрывать, что я в принципе и сделаю. Спасибо всем за помощь.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.047 секунд. Запросов: 23.