crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

3 страниц V   1 2 3 >  
Ответить в данную темуНачать новую тему
> Delegate 2 - HtmlDelegate, пост, придающий смысл теме Delegate ;)
jim1406
  опции профиля:
сообщение 10.4.2009, 11:05
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 27
Регистрация: 17.3.2009
Пользователь №: 618

Спасибо сказали: 0 раз(а)




Репутация:   0  


Доброго времени суток!..
Задача - отображать в таблице и/или списке форматированный текст (переносы строки, различные шрифты и пр. смотри, как вариант, firefox). Делать виджета-наследника не очень желательно. Хочется использовать делегаты. Подскажите, с какого боку лучше подойти? Отрисовывать итемы в виде различных контролов я научился (в прошлой теме Delegate :) ). Предполагал это и использовать, но что-то застопорился, не найдя подходящего контрола QStyle::CE_ , умеющего отображать, скажем, html.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 10.4.2009, 11:09
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(jim1406 @ 10.4.2009, 15:05) *
умеющего отображать, скажем, html.
А у тебя какая версия Qt?

тот же QLable может форматированный текст отображать
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
jim1406
  опции профиля:
сообщение 13.4.2009, 5:46
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 27
Регистрация: 17.3.2009
Пользователь №: 618

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 10.4.2009, 15:09) *
А у тебя какая версия Qt?

тот же QLable может форматированный текст отображать


Qt 4.5
Про QLabel я тоже думал... Только среди стилей контролов QStyle::CE_ не нашел его :( ....
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 14.4.2009, 0:07
Сообщение #4


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


jim1406, с тебя пиво :drinks:
Шучу. :D
Интересную ты задачку задал, если честно не сразу справился. Но было очень интерестно повозиться, т.ч. спасибо.
В архиве готовый делегат, с тестовым примером. Обрати внимание на параметр Qt::Alignment align, который передается в конструкторе, он позволяет ориентировать текст в ячейке.

Раскрывающийся текст
#include <QtGui>
#include "htmltextdelegate.h"

void HtmlDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                         const QModelIndex &index) const
{
    QString str = index.data(Qt::DisplayRole).toString();
    QTextDocument td;
    td.setHtml(str);

    QStyleOptionViewItem opt = option;
    QRectF lr = layoutRect(td, opt.rect);

    painter->save();
    painter->translate(lr.topLeft());
    painter->setClipRect(lr.translated(-lr.x(), -lr.y()));
    td.drawContents(painter, QRectF());
    painter->restore();
}

QWidget *HtmlDelegate::createEditor(QWidget *parent,
                                    const QStyleOptionViewItem &option,
                                    const QModelIndex &index) const
{
    QTextEdit *textEdit = new QTextEdit(parent);
    return textEdit;
}

void HtmlDelegate::setEditorData(QWidget *editor,
                                 const QModelIndex &index) const
{
    QString str = index.data(Qt::DisplayRole).toString();
    QTextEdit *textEdit = qobject_cast<QTextEdit*>(editor);
    textEdit->setHtml(str);
}

void HtmlDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
                                const QModelIndex &index) const
{
    QTextEdit *textEdit = qobject_cast<QTextEdit*>(editor);
    QString str = textEdit->toHtml();
    model->setData(index, str, Qt::DisplayRole);
}


QRectF HtmlDelegate::layoutRect(const QTextDocument & td, QRect rect) const
{
    QRectF rectf;
    qreal xo;
    qreal yo;

    if(align & Qt::AlignLeft) {
        xo = 0;
    } else if(align & Qt::AlignRight) {
        qreal rw = td.documentLayout()->documentSize().width();
        xo = 0;
        xo = qMax((rect.width()-rw), qreal(0));
    } else if(align & Qt::AlignHCenter) {
        qreal rw = td.documentLayout()->documentSize().width();
        xo = 0;
        xo = qMax((rect.width()-rw)/2, qreal(0));
    }

    if(align & Qt::AlignTop) {
        yo = 0;
    } else if(align & Qt::AlignBottom) {
        qreal rh = td.documentLayout()->documentSize().height();
        yo = 0;
        yo = qMax((rect.height()-rh), qreal(0));
    } else if(align & Qt::AlignVCenter) {
        qreal rh = td.documentLayout()->documentSize().height();
        yo = 0;
        yo = qMax((rect.height()-rh)/2, qreal(0));
    }
    return QRectF(xo + rect.x(), yo + rect.y(), rect.width(), rect.height());
}

Эскизы прикрепленных изображений
Прикрепленное изображение
 

Прикрепленные файлы
Прикрепленный файл  htmltextdelegate.zip ( 2.36 килобайт ) Кол-во скачиваний: 169
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
jim1406
  опции профиля:
сообщение 14.4.2009, 4:20
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 27
Регистрация: 17.3.2009
Пользователь №: 618

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(igor_bogomolov @ 14.4.2009, 4:07) *
jim1406, с тебя пиво :drinks:
Шучу. :D
Интересную ты задачку задал, если честно не сразу справился. Но было очень интерестно повозиться, т.ч. спасибо.
В архиве готовый делегат, с тестовым примером. Обрати внимание на параметр Qt::Alignment align, который передается в конструкторе, он позволяет ориентировать текст в ячейке.


Спасибо!!! Сейчас буду разбираться в деталях... Насчет использования QTextDocument я уже допетрил, но, насколько я понял, ты решил то, что не получалось у меня - нормальное отображение итема.... Еще раз :clapping:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 14.4.2009, 8:24
Сообщение #6


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Цитата(jim1406 @ 14.4.2009, 5:20) *
Насчет использования QTextDocument я уже допетрил
А я вот долго допетрить не мог. Пока исходники QLabel не перерыл и не узнал, что у QTextDocument drawContents есть. Идея нормального отображения тоже частично у QLabel подсмотрена. А перед этим, не поверите, пытался сам все отрисовать через тот же QTextDocument, QTextCursor и QFontMetrics. Видилибы вы этого уродца :D
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 14.4.2009, 11:12
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


    if(align & Qt::AlignLeft) {
        xo = 0;
    }


Это ты таким образом пытаешься скорость отрисовки увеличить?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 14.4.2009, 11:36
Сообщение #8


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Цитата(SABROG @ 14.4.2009, 12:12) *
Это ты таким образом пытаешься скорость отрисовки увеличить?
Логика была сначала несколько подругому построена. А это остаточные рудименты. Я как результата достиг, на этом и успокоился. Надо было конечно ради приличая подчистить код, а то вот теперь и обо мне плохо думают :rolleyes:

Для скорости уж не сильно критично. Только глаз немного мазолит. А человеку помог, да и интерес смотрю есть, восемь закачек уже :rolleyes:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
jim1406
  опции профиля:
сообщение 14.4.2009, 11:42
Сообщение #9


Студент
*

Группа: Участник
Сообщений: 27
Регистрация: 17.3.2009
Пользователь №: 618

Спасибо сказали: 0 раз(а)




Репутация:   0  


Не могу сообразить, как в QComboBox нормально такие итемы отрисовать :( . Там такого ресайза, как в таблице нету...
Изначально идея была в выпадающем списке отрисовывать сложно-форматированный текст...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 14.4.2009, 20:47
Сообщение #10


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Хочу напомнить о существовании одной статьи в 24 выпуске Qt Quarterly: http://doc.trolltech.com/qq/qq24-textlayouts.html
(она есть и на этом сайте, но тут какой-то косяк с форматированием кода - http://www.crossplatform.ru/?q=node/544)

Имхо QTextLayout полегковеснее будет, чем весь QTextDocument. Это конечно, если людям понадобится только отображение форматированного текста.
Или вообще использовать QTextLine, если надо отрисовать всего-лишь одну строку:

void QTextLine::draw ( QPainter * painter, const QPointF & position, const QTextLayout::FormatRange * selection = 0 ) const


Сообщение отредактировал SABROG - 14.4.2009, 21:50
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V   1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 14.11.2019, 1:19