Прозрачная полоса прокрутки QListView с изображением в QT

#qt

#qt

Вопрос:

У меня есть QListWidget, я хочу иметь прозрачную полосу прокрутки с изображением. Изначально эта полоса прокрутки должна быть скрыта только при прокрутке, она должна отображаться. Как я могу добиться этого в Qt? Любые примеры или идеи приветствуются. Как я могу применить изображение к полосе прокрутки Listview.

Ответ №1:

Вот три вещи, на которые вы можете обратить внимание, чтобы иметь возможность управлять полосой прокрутки для большинства видов виджетов в Qt:

Чтобы иметь возможность отслеживать, как пользователь взаимодействует с вашим QListWidget или любым другим виджетом, если на то пошло, вам необходимо подклассировать его и реализовать виртуальные методы из QWheelEvent и, возможно, QKeyEvent.

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

Эти события вызовут событие прокрутки даже после того, как вы установите для виджета одну или обе политики прокрутки на значение Qt::ScrollBarAlwaysOff.

Сначала вы должны поместить в конструктор вашего виджета

     this->setVerticalScrollBar(Qt::ScrollBarAlwaysOff);
    this->setHorizontalScrollBar(Qt::ScrollBarAlwaysOff);
 

Итак, вам просто нужно установить mousetracking(true) для виджета (чтобы он отслеживал больше, чем просто клики) и переопределить, по крайней мере, wheelEvent() , а при возникновении события wheel установите для политик вертикальной / горизонтальной полосы прокрутки значение true и вызовите обновление для вашего виджета.

Если вы хотите отключить полосы прокрутки через несколько миллисекунд после начала прокрутки, вам нужно будет создать QTimer в вашем конструкторе для вашего подкласса виджета и подключить его к слоту, который устанавливает политики полосы прокрутки на время ожидания. Затем вы запускаете / перезапускаете этот таймер каждый раз, когда пользователь выполняет wheelEvent().

Что касается применения изображения к полосе прокрутки ListView, вам следует изучить возможность создания подкласса QAbstractScrollBar, если вы хотите на самом деле поместить на нее изображение или изменить его внешний вид. Настройка некоторых кнопок инструментов также может быть подходящим вариантом, если вы пытаетесь разместить кнопки с разными значками вместо полосы прокрутки.