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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО]Делегат для QTableView  (Прочитано 3595 раз)
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();

Спасибо.
« Последнее редактирование: Июль 29, 2016, 09:05 от Larry » Записан
Larry
Гость
« Ответ #1 : Июль 28, 2016, 16:14 »

Перенос доделал, оказалось забыл указать ширину строки
Код:
setTextWidth(options.rect.width);
но вот с центрированием пока ничего не получилось...
Записан
Larry
Гость
« Ответ #2 : Июль 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);

Только вот центрирование происходит по горизонтали, а по вертикали никак не хочет...
Записан
Larry
Гость
« Ответ #3 : Июль 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);
« Последнее редактирование: Июль 29, 2016, 09:06 от Larry » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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