crossplatform.ru

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

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


Студент
*

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

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




Репутация:   0  


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


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

Группа: Сомодератор
Сообщений: 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 килобайт ) Кол-во скачиваний: 418
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
jim1406
  опции профиля:
сообщение 14.4.2009, 4:20
Сообщение #3


Студент
*

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

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




Репутация:   0  


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


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

Сообщений в этой теме
- jim1406   Delegate 2 - HtmlDelegate   10.4.2009, 11:05
- - Litkevich Yuriy   Цитата(jim1406 @ 10.4.2009, 15:05) умеюще...   10.4.2009, 11:09
|- - jim1406   Цитата(Litkevich Yuriy @ 10.4.2009, 15:09...   13.4.2009, 5:46
- - igor_bogomolov   jim1406, с тебя пиво Шучу. Интересную ты задач...   14.4.2009, 0:07
|- - jim1406   Цитата(igor_bogomolov @ 14.4.2009, 4:07) ...   14.4.2009, 4:20
|- - Obey-Kun   Цитата(igor_bogomolov @ 14.4.2009, 0:07) ...   1.12.2010, 6:49
- - igor_bogomolov   Цитата(jim1406 @ 14.4.2009, 5:20) Насчет ...   14.4.2009, 8:24
|- - jim1406   Не могу сообразить, как в QComboBox нормально таки...   14.4.2009, 11:42
- - SABROG   if(align & Qt::AlignLeft) { ...   14.4.2009, 11:12
- - igor_bogomolov   Цитата(SABROG @ 14.4.2009, 12:12) Это ты ...   14.4.2009, 11:36
- - SABROG   Хочу напомнить о существовании одной статьи в 24 в...   14.4.2009, 20:47
- - Litkevich Yuriy   Цитата(SABROG @ 15.4.2009, 0:47) она есть...   14.4.2009, 21:30
|- - dezconnect   Цитата(Litkevich Yuriy @ 15.4.2009, 2:30)...   17.5.2010, 9:07
|- - dezconnect   Долго ли коротко ли получилось следующее: Раскры...   19.5.2010, 12:59
- - Litkevich Yuriy   Цитата(dezconnect @ 19.5.2010, 16:59) есл...   19.5.2010, 13:17
|- - dezconnect   Цитата(Litkevich Yuriy @ 19.5.2010, 18:17...   19.5.2010, 13:43
- - Litkevich Yuriy   Цитата(dezconnect @ 19.5.2010, 17:43) мак...   19.5.2010, 14:12
|- - dezconnect   Цитата(Litkevich Yuriy @ 19.5.2010, 19:12...   20.5.2010, 10:44
|- - dezconnect   Цитата(dezconnect @ 20.5.2010, 15:44) Цит...   24.10.2010, 14:30
- - igor_bogomolov   Цитата(Obey-Kun @ 1.12.2010, 6:49) А...   1.12.2010, 10:34
- - Obey-Kun   Спасибо! Только сделаю это с помощью eventFilt...   2.12.2010, 23:00
- - Obey-Kun   Что я делаю не так? В конструкторе делаю m_table_v...   2.12.2010, 23:35
- - igor_bogomolov   фильтр нужно устанавливать для viewport заголовка ...   3.12.2010, 0:10
- - Obey-Kun   спасибо! правда, решение с фильтром не прокати...   3.12.2010, 0:31
- - Obey-Kun   Да уж, при насследовании, оказывается, не удастся ...   3.12.2010, 1:15
- - igor_bogomolov   Цитата(Obey-Kun @ 3.12.2010, 0:31) т...   3.12.2010, 8:42


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


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




RSS Текстовая версия Сейчас: 28.11.2024, 22:23