Russian Qt Forum

Qt => Model-View (MV) => Тема начата: Larry от Июль 28, 2016, 15:39



Название: [РЕШЕНО]Делегат для QTableView
Отправлено: Larry от Июль 28, 2016, 15:39
Добрый день.
Нужен делегат, который может отображать в ячейке текст с разными стилями, цветами подстрок и т.д. (как в excel). Делаю через наследование QStyledItemDelegate, но как теперь разукрасить текст - вернее подстроки в тексте. Попробовал делать через QTextDocument используя html-разметку, но теперь не работает перенос слов и лепит в одну. У QTextDocument есть QTextOptions, но так и не получилось его задействовать, вернее не хочет работать. Или я не умею его готовить? Какие варианты есть?

Через QTextDocument делаю так:

    
Код:
QStyleOptionViewItem options = option;
    initStyleOption(&options, index);

    painter->save();

    QTextDocument doc;
    QFont font = doc.defaultFont();
    font.setPixelSize(12);
    doc.setDefaultFont(font);
    QTextOption opt(options.displayAlignment);

    if(index.column() == 9)
    {
        opt.setAlignment(Qt::AlignVCenter | Qt::AlignLeft);
    }
    else
        opt.setAlignment(Qt::AlignCenter);

    opt.setWrapMode(QTextOption::WordWrap);
    doc.setDefaultTextOption(opt);
    doc.setHtml(options.text);
    painter->translate(options.rect.left(), options.rect.top());
    QRect clip(0, 0, options.rect.width(), options.rect.height());
    doc.drawContents(painter, clip);

    painter->restore();

Спасибо.


Название: Re: Делегат для QTableView
Отправлено: Larry от Июль 28, 2016, 16:14
Перенос доделал, оказалось забыл указать ширину строки
Код:
setTextWidth(options.rect.width);
но вот с центрированием пока ничего не получилось...


Название: Re: Делегат для QTableView
Отправлено: Larry от Июль 28, 2016, 16:29
Если добавить следующее:

    
Код:
QTextOption opt(options.displayAlignment);

    if(index.column() == 9)
    {
        opt.setAlignment(Qt::AlignVCenter | Qt::AlignLeft);
    }
    else
        opt.setAlignment(Qt::AlignCenter);

    doc.setDefaultTextOption(opt);

Только вот центрирование происходит по горизонтали, а по вертикали никак не хочет...


Название: Re: Делегат для QTableView
Отправлено: Larry от Июль 29, 2016, 09:04
Выравнивание сделал через смещение:

Код:
int offset_y = (option.rect.height() - doc.size().height())/2;
int offset_x = 0;

if(index.column() != 9)
    offset_x = (option.rect.width() - doc.idealWidth())/2;

painter->drawRect(options.rect);
painter->translate(options.rect.left() + offset_x, options.rect.top() + offset_y);