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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: [РЕШЕНо]QStyledItemDelegate  (Прочитано 10720 раз)
Larry
Гость
« : Июль 26, 2016, 15:50 »

Добрый день, форумчане.

Подскажите пожалуйста, как сделать отступ при левом выравнивании, т.к. текст упирается в рамку ячейки.
На рисунке видно, что текст идет впритык с рамкой...
« Последнее редактирование: Июль 28, 2016, 10:03 от Larry » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Июль 26, 2016, 15:56 »

Например, в QStyledItemDelegate::paint рисовать так, чтобы был отступ.

Тут можно посмотреть пример реализации делегата, правда текст я не рисовал -- его дорисовывал родительский метод paint.

А как выглядит результат можно увидеть тут.
« Последнее редактирование: Июль 26, 2016, 15:59 от gil9red » Записан

Larry
Гость
« Ответ #2 : Июль 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();
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #3 : Июль 26, 2016, 16:00 »

Ну укажите перед рисованием текста в rect ваш отступ
что-то вроде
Код
C++ (Qt)
rect.setX(rect.x() + indent);
Записан

Larry
Гость
« Ответ #4 : Июль 26, 2016, 16:05 »

Спасибо, так лучше Смеющийся. Туплю иногда Смеющийся
Записан
Larry
Гость
« Ответ #5 : Июль 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();
Записан
Larry
Гость
« Ответ #6 : Июль 27, 2016, 15:34 »

Так и не понял в чем проблема при переносе строк. Вернее не перенос строк, а изменение высоты строки по содержимому. От 0 до 255 строки все работает, а дальше перестает. В чем может быть проблема?
Записан
Larry
Гость
« Ответ #7 : Июль 27, 2016, 17:36 »

Переопределил метод sizeHint для QStyledItemDelegate и получил, то что он вызывается только для строк от нуля до 255  Непонимающий
При запуске программы отображается 21 строка, а в отладчике он шлет сразу sizeHint для строк от нуля до 255??? После прокрутки ничего уже не меняется и sizeHint не вызывается. Почему?
« Последнее редактирование: Июль 27, 2016, 17:40 от Larry » Записан
Bepec
Гость
« Ответ #8 : Июль 27, 2016, 18:05 »

После загрузки данных в зависимости от настроек View размеры либо УЖЕ установлены, либо вычислен максимальный размер (если установлен флаг ResizeToContents).
А сколько всего строк в таблице, на которую вы ставите делегат и сколько строк является видимыми.
PS это моё видение ситуации Веселый
Записан
Larry
Гость
« Ответ #9 : Июль 27, 2016, 19:33 »

на данный момент в базе около 19000 строк, видимых 21 строка. Метод paint из делегата вызывается для каждой строки, а sizehint только 255 раз.
Записан
Bepec
Гость
« Ответ #10 : Июль 27, 2016, 19:47 »

А если прокрутить до конца и в начало, сколько будет вызовов?
Записан
Larry
Гость
« Ответ #11 : Июль 27, 2016, 20:22 »

если прокрутить от начала и до конца, то paint будет вызван столько, сколько строк, а sizeHint только 255 раз,  при том, что вызовы будут в самом начале при запуске и потом при прокрутке sizehint вызываться больше не будут.
Записан
Bepec
Гость
« Ответ #12 : Июль 27, 2016, 20:39 »

Ну тут уже смотреть надо что почём, а мне лень проект делать, модель туда сувать,заполнять ещё, делегат писать Улыбающийся
Записан
Larry
Гость
« Ответ #13 : Июль 27, 2016, 20:44 »

А вариантов никаких нет? Просто, я целый день потратил...пока sizeHint не переопределил...грешил на перенос слов...До строки 256 все хорошо отображает, все переносится, а дальше никак. Сколько не лопатил интернет, то ничего напоминающего поведение у меня не нашел.
Записан
Bepec
Гость
« Ответ #14 : Июль 27, 2016, 22:39 »

Ну, если скинете проект, я могу посмотреть что там за фигня, но эт ещё как время будет.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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