Добавить виджет рядом с qscrollbar

Как разместить виджет рядом с QScrollbar, как показано здесь: введите здесь описание изображения

Я использую QScrollArea и перезаписываю Horizontal-QScrollBar. Сначала я подумал, что могу использовать paintEvent, чтобы нарисовать текст вроде «100 %» рядом с полосой. Но я могу только перезаписать существующую картину.

Теперь я думаю, что единственной возможностью было бы реализовать дыру QScorllBarPrivate из исходного кода... есть идеи?


person Viatorus    schedule 04.02.2015    source источник
comment
QScrollBar — это всего лишь элемент виджета области прокрутки. Можете ли вы изменить размер горизонтальной полосы прокрутки, когда вы получаете событие размера в области прокрутки? Если это так, вы можете добавить дополнительный рендеринг к событию рисования области прокрутки, чтобы нарисовать свой процент и разрешение.   -  person cppguy    schedule 05.02.2015
comment
QScrollbar становится меньше, но выравнивается по левой границе. И я не знаю, как разместить там новый виджет (тоже справа от него..)   -  person Viatorus    schedule 05.02.2015


Ответы (1)


Основная идея состоит в том, чтобы создать наложение, скрывающее горизонтальную полосу прокрутки по умолчанию и отображающее вместо этого вашу собственную нижнюю строку.

  1. Создайте виджет, представляющий нижнюю строку, то есть виджет с метками, отображающими некоторую информацию, и горизонтальную полосу прокрутки QScrollBar, все вместе помещенные в макет hbox.
  2. Поместите этот виджет в область прокрутки, не добавляя его в макет, сделав QScrollArea прямым родительским виджетом этого виджета.
  3. Используйте move() и resize() в виджете нижней строки, чтобы правильно расположить его при инициализации. Также измените размер и переместите его при изменении размера области прокрутки (вы можете использовать фильтры событий или наследование, чтобы изменить размер событий).
  4. Убедитесь, что horizontalScrollBarPolicy области прокрутки равно Qt::ScrollBarAlwaysOn, чтобы внутренняя компоновка области прокрутки всегда оставляла достаточно места для размещения виджета нижней строки.
  5. Также убедитесь, что виджет нижней строки имеет ту же высоту, что и полоса прокрутки по умолчанию. Это должно быть легко, если вы удалите интервалы и поля в макете hbox, а метки (или другие виджеты) не требуют больше вертикального пространства, чем полоса прокрутки.
  6. Используйте horizontalScrollBar(), чтобы получить внутреннюю область прокрутки QScrollBar и синхронизировать ее с вашей собственной панелью. QScrollBar имеет сигналы rangeChanged() и valueChanged(), поэтому вы можете подключиться к ним и правильно обновить панель. Когда пользователь изменяет значение вашей полосы прокрутки и запускает ее сигнал valueChanged(), вы должны установить такое же значение для внутренней полосы прокрутки. Вы можете защититься от бесконечной рекурсии, используя флаг, указывающий, что это ваше собственное изменение.
person Pavel Strakhov    schedule 05.02.2015