Russian Qt Forum

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



Название: [РЕШЕНо]QStyledItemDelegate
Отправлено: Larry от Июль 26, 2016, 15:50
Добрый день, форумчане.

Подскажите пожалуйста, как сделать отступ при левом выравнивании, т.к. текст упирается в рамку ячейки.
На рисунке видно, что текст идет впритык с рамкой...


Название: Re: QStyledItemDelegate
Отправлено: gil9red от Июль 26, 2016, 15:56
Например, в QStyledItemDelegate::paint (http://doc.qt.io/qt-4.8/qstyleditemdelegate.html#paint) рисовать так, чтобы был отступ.

Тут (https://github.com/gil9red/combustion/blob/master/scheduler_celldelegate.cpp) можно посмотреть пример реализации делегата, правда текст я не рисовал -- его дорисовывал родительский метод paint.

А как выглядит результат можно увидеть тут (https://github.com/gil9red/combustion/#%D0%A1%D0%BA%D1%80%D0%B8%D0%BD%D1%88%D0%BE%D1%82%D1%8B).


Название: Re: QStyledItemDelegate
Отправлено: Larry от Июль 26, 2016, 15:58
Сейчас рисую так:

Код:
    QString              text = index.data().toString();
    QRect rect = option.rect;
    QTextOption opt(option.displayAlignment);

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

    opt.setWrapMode(QTextOption::WordWrap);

    painter->save();
    painter->drawRect(rect);
    painter->drawText(rect, text, opt);
    painter->restore();


Название: Re: QStyledItemDelegate
Отправлено: gil9red от Июль 26, 2016, 16:00
Ну укажите перед рисованием текста в rect ваш отступ
что-то вроде
Код
C++ (Qt)
rect.setX(rect.x() + indent);


Название: Re: QStyledItemDelegate
Отправлено: Larry от Июль 26, 2016, 16:05
Спасибо, так лучше ;D. Туплю иногда ;D


Название: Re: QStyledItemDelegate
Отправлено: Larry от Июль 27, 2016, 10:36
Добрый день.
Дабы не плодить темы, решил продолжить здесь.
Мне необходимо реализовать таблицу по функционалу приближенную к таблицам excel - в плане отображения и редактирования. Наткнулся на проблему с переносом слов, когда данные не влазят полностью в ячейку. Выставил
Код:
verticalHeader()->resizeSections(QHeaderView::ResizeToContents);
, но в некоторых случаях текст скрыт и приходится руками изменять размеры ячейки, а иногда ячейка растягивается по вертикали по размеру текста. Куда копать?
Как можно выделять фрагмент текста в ячейке другим цветом, шрифтом?

Отображение через делегат:

Код:
    QString     text = index.data().toString();
    QRect       rect = option.rect;
    QTextOption opt(option.displayAlignment);

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

    opt.setWrapMode(QTextOption::WordWrap);

    painter->save();
    painter->drawRect(rect);
    rect.setX(rect.x() + 3);
    painter->drawText(rect, text, opt);
    painter->restore();


Название: Re: QStyledItemDelegate
Отправлено: Larry от Июль 27, 2016, 15:34
Так и не понял в чем проблема при переносе строк. Вернее не перенос строк, а изменение высоты строки по содержимому. От 0 до 255 строки все работает, а дальше перестает. В чем может быть проблема?


Название: Re: QStyledItemDelegate
Отправлено: Larry от Июль 27, 2016, 17:36
Переопределил метод sizeHint для QStyledItemDelegate и получил, то что он вызывается только для строк от нуля до 255  ???
При запуске программы отображается 21 строка, а в отладчике он шлет сразу sizeHint для строк от нуля до 255??? После прокрутки ничего уже не меняется и sizeHint не вызывается. Почему?


Название: Re: QStyledItemDelegate
Отправлено: Bepec от Июль 27, 2016, 18:05
После загрузки данных в зависимости от настроек View размеры либо УЖЕ установлены, либо вычислен максимальный размер (если установлен флаг ResizeToContents).
А сколько всего строк в таблице, на которую вы ставите делегат и сколько строк является видимыми.
PS это моё видение ситуации :D


Название: Re: QStyledItemDelegate
Отправлено: Larry от Июль 27, 2016, 19:33
на данный момент в базе около 19000 строк, видимых 21 строка. Метод paint из делегата вызывается для каждой строки, а sizehint только 255 раз.


Название: Re: QStyledItemDelegate
Отправлено: Bepec от Июль 27, 2016, 19:47
А если прокрутить до конца и в начало, сколько будет вызовов?


Название: Re: QStyledItemDelegate
Отправлено: Larry от Июль 27, 2016, 20:22
если прокрутить от начала и до конца, то paint будет вызван столько, сколько строк, а sizeHint только 255 раз,  при том, что вызовы будут в самом начале при запуске и потом при прокрутке sizehint вызываться больше не будут.


Название: Re: QStyledItemDelegate
Отправлено: Bepec от Июль 27, 2016, 20:39
Ну тут уже смотреть надо что почём, а мне лень проект делать, модель туда сувать,заполнять ещё, делегат писать :)


Название: Re: QStyledItemDelegate
Отправлено: Larry от Июль 27, 2016, 20:44
А вариантов никаких нет? Просто, я целый день потратил...пока sizeHint не переопределил...грешил на перенос слов...До строки 256 все хорошо отображает, все переносится, а дальше никак. Сколько не лопатил интернет, то ничего напоминающего поведение у меня не нашел.


Название: Re: QStyledItemDelegate
Отправлено: Bepec от Июль 27, 2016, 22:39
Ну, если скинете проект, я могу посмотреть что там за фигня, но эт ещё как время будет.


Название: Re: QStyledItemDelegate
Отправлено: Larry от Июль 27, 2016, 22:48
хорошо, спасибо.Скину, Как только доберусь.


Название: Re: QStyledItemDelegate
Отправлено: Larry от Июль 28, 2016, 10:02
Строчку
Код:
verticalHeader()->resizeSections(QHeaderView::ResizeToContents);
поменял на
Код:
verticalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
и все заработало.