crossplatform.ru

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

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


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

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

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




Репутация:   94  


Цитата(SABROG @ 15.4.2009, 0:47) *
она есть и на этом сайте, но тут какой-то косяк с форматированием кода
лучше в вики смотреть, там и перевести можно: Low-Level Text Layouts
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dezconnect
  опции профиля:
сообщение 17.5.2010, 9:07
Сообщение #12


Студент
*

Группа: Новичок
Сообщений: 18
Регистрация: 25.4.2010
Пользователь №: 1658

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 15.4.2009, 2:30) *
Цитата(SABROG @ 15.4.2009, 0:47) *
она есть и на этом сайте, но тут какой-то косяк с форматированием кода
лучше в вики смотреть, там и перевести можно: Low-Level Text Layouts


Ну все клева работает =)
Вопрос только один.... как бы ширину QTextDocument подогнать под ширину колонки TableView и сделать перенос строк если строка длинее =\
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dezconnect
  опции профиля:
сообщение 19.5.2010, 12:59
Сообщение #13


Студент
*

Группа: Новичок
Сообщений: 18
Регистрация: 25.4.2010
Пользователь №: 1658

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




Репутация:   0  


Долго ли коротко ли получилось следующее:


Раскрывающийся текст
void HtmlDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                         const QModelIndex &index) const
{
    QTextDocument td;
    td.setHtml(index.data(Qt::DisplayRole).toString());
    td.adjustSize();

    QAbstractTextDocumentLayout::PaintContext context;
    context.palette = option.palette;

    painter->save();

    QAbstractTextDocumentLayout *layout = td.documentLayout();

    painter->translate(0, option.rect.y());

    layout->draw(painter, context);
    painter->restore();


}

QSize HtmlDelegate::sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index) const
{

        QTextDocument td;
        td.setHtml(index.data(Qt::DisplayRole).toString());
        td.adjustSize();
        return td.documentLayout()->documentSize().toSize();

}



теперь ячейка подгоняется под размер adjustSize (); но попрежнему не то что хотелось бы.... если придумать как реализовать word wrap... то можно будет подогнать и под него думаю.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 19.5.2010, 13:17
Сообщение #14


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

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

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




Репутация:   94  


Цитата(dezconnect @ 19.5.2010, 16:59) *
если придумать как реализовать word wrap
посмотри реализацию QLabel, там есть такая возможность
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dezconnect
  опции профиля:
сообщение 19.5.2010, 13:43
Сообщение #15


Студент
*

Группа: Новичок
Сообщений: 18
Регистрация: 25.4.2010
Пользователь №: 1658

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 19.5.2010, 18:17) *
Цитата(dezconnect @ 19.5.2010, 16:59) *
если придумать как реализовать word wrap
посмотри реализацию QLabel, там есть такая возможность


я смотрел там через внутренний макрос Q_D задается TextWordWrap...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 19.5.2010, 14:12
Сообщение #16


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

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

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




Репутация:   94  


Цитата(dezconnect @ 19.5.2010, 17:43) *
макрос Q_D
этот макрос всего лишь объявляет личные (внутренние) данные. Т.е. запись:
Q_D(SomeClass)
d->someFunc();

означает:
SomeClassPrivate *const d = d_func(); // получает указатель на внутренние данные
d->someFunc();
следовательно смотри соответствующий метод этого внутреннего класса (обычно этот класс описан раньше основного)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dezconnect
  опции профиля:
сообщение 20.5.2010, 10:44
Сообщение #17


Студент
*

Группа: Новичок
Сообщений: 18
Регистрация: 25.4.2010
Пользователь №: 1658

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 19.5.2010, 19:12) *
Цитата(dezconnect @ 19.5.2010, 17:43) *
макрос Q_D
этот макрос всего лишь объявляет личные (внутренние) данные. Т.е. запись:
Q_D(SomeClass)
d->someFunc();

означает:
SomeClassPrivate *const d = d_func(); // получает указатель на внутренние данные
d->someFunc();
следовательно смотри соответствующий метод этого внутреннего класса (обычно этот класс описан раньше основного)



ммм, вообще в QTextDocument есть такая фича как setTextWidth() =) помогло =)

продолжаю копания в сторону sizeHint() ... если в paint() передается painter и ессесно по нему можно узнать ширину TableView через painter->window.width(), то в sizeHint такого счастья не наблюдаю ... Может кто сталкивался...

и что ловить если у меня моделью является QSqlQueryModel и для первых 256 записей, sizeHint отрабатывает корректно, после "дозагрузки" данных, они все ломятся высотой в 22 пиксела =( это куда копять опять же...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dezconnect
  опции профиля:
сообщение 24.10.2010, 14:30
Сообщение #18


Студент
*

Группа: Новичок
Сообщений: 18
Регистрация: 25.4.2010
Пользователь №: 1658

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




Репутация:   0  


Цитата(dezconnect @ 20.5.2010, 15:44) *
Цитата(Litkevich Yuriy @ 19.5.2010, 19:12) *
Цитата(dezconnect @ 19.5.2010, 17:43) *
макрос Q_D
этот макрос всего лишь объявляет личные (внутренние) данные. Т.е. запись:
Q_D(SomeClass)
d->someFunc();

означает:
SomeClassPrivate *const d = d_func(); // получает указатель на внутренние данные
d->someFunc();
следовательно смотри соответствующий метод этого внутреннего класса (обычно этот класс описан раньше основного)



ммм, вообще в QTextDocument есть такая фича как setTextWidth() =) помогло =)

продолжаю копания в сторону sizeHint() ... если в paint() передается painter и ессесно по нему можно узнать ширину TableView через painter->window.width(), то в sizeHint такого счастья не наблюдаю ... Может кто сталкивался...

и что ловить если у меня моделью является QSqlQueryModel и для первых 256 записей, sizeHint отрабатывает корректно, после "дозагрузки" данных, они все ломятся высотой в 22 пиксела =( это куда копять опять же...


Трабла с дозагрузкой данных в TableView из модели актуален по прежнему
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Obey-Kun
  опции профиля:
сообщение 1.12.2010, 6:49
Сообщение #19


Студент
*

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

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




Репутация:   0  


Цитата(igor_bogomolov @ 14.4.2009, 0:07) *
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());
}


Красавчик. А аналогично QHeaderView модешь переделать? Только там оно уже не делегаты использует, а само рисует.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 1.12.2010, 10:34
Сообщение #20


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

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

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




Репутация:   29  


Цитата(Obey-Kun @ 1.12.2010, 6:49) *
А аналогично QHeaderView модешь переделать?
Если упрощенно, то так.
Раскрывающийся текст
void Header::paintEvent(QPaintEvent *e)
{
    if (!count()) return;

    QPainter painter(viewport());
    QRect currentSectionRect;
    const int height = viewport()->height();
    for (int i = 0; i != model()->columnCount(); ++i) {
        painter.save();
        currentSectionRect.setRect(sectionViewportPosition(i), 0, sectionSize(i), height);

        QStyleOptionHeader opt;
        initStyleOption(&opt);

        opt.rect = currentSectionRect;
        opt.section = i;
        style()->drawControl(QStyle::CE_HeaderSection, &opt, &painter, this);


        QString str = model()->headerData(i, Qt::Horizontal, Qt::DisplayRole).toString();

        QTextDocument td;
        td.setHtml(str);
        QRectF lr = layoutRect(td, currentSectionRect);
        painter.translate(lr.topLeft());
        painter.setClipRect(lr.translated(-lr.x(), -lr.y()));
        td.drawContents(&painter, QRectF());

        painter.restore();
    }
}
Прикрепленное изображение

Если нужен больший функционал от заголовков, смотри в исходники QHeaderView
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 20.4.2024, 15:42