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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как скрыть кнопки прокрутки у QTreeView?  (Прочитано 5946 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« : Ноябрь 07, 2014, 22:24 »

Сделал для QTreeView инерционную прокрутку (для Андроид).

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

Я пытаюсь сделать узким ползунок и убрать кнопки вверх-вниз так:

Код:
 object->verticalScrollBar()->setStyleSheet("QScrollBar {width:3px;} QScrollBar::up-arrow, QScrollBar::down-arrow {width: 0px; height: 0px;}");

- в результате кнопки не исчезают.

Почему так? Как скрыть кнопки вверх-вниз?

Записан

Собираю информацию по крупицам
http://webhamster.ru
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #1 : Ноябрь 07, 2014, 23:38 »

у меня так работает:
Код
CSS
QScrollBar:horizontal {
   border: 1px solid grey;
   background: rgba(240, 240, 240, 255);
   height: 15px;
   margin: 0;
}
 
QScrollBar::handle:horizontal {
   border: 1px solid grey;
   border-radius: 5px;
   background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(192, 191, 196, 255), stop:1 rgba(245, 245, 245, 255));
}
 
QTableView QScrollBar::handle::horizontal {
   min-width: 20px;
}
 
QScrollBar::add-line:horizontal {
   width: 0px;
}
 
QScrollBar::sub-line:horizontal {
   width: 0px;
}
 
QScrollBar:vertical {
   border: 1px solid grey;
   background: rgba(240, 240, 240, 255);
   width: 15px;
   margin: 0;
}
 
QScrollBar::handle:vertical {
   border: 1px solid grey;
   border-radius: 5px;
   background: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 rgba(192, 191, 196, 255), stop:1 rgba(245, 245, 245, 255));
}
 
QTableView QScrollBar::handle::vertical {
   min-height: 20px;
}
 
QScrollBar::add-line:vertical {
   height: 0px;
}
 
QScrollBar::sub-line:vertical {
   height: 0px;
}
 
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #2 : Ноябрь 08, 2014, 21:35 »

у меня так работает:

А у меня не работает.

Не работает даже это:

Код:
object->verticalScrollBar()->setStyleSheet("QScrollBar::add-line:vertical { border: none; background: none; height: 0px; } QScrollBar::sub-line:vertical { border: none; background: none; height: 0px; }");

Единственное не чем я вижу, что стиль применяется - это вот:

Код:
object->verticalScrollBar()->setStyleSheet("QScrollBar {width:3px;}");

то есть этот стиль применяется, ширина скроллбара становится 3 px, но кнопки вверх-вниз видны - (точнее, видна их центральная часть, шириной 3 px).

У меня складывается впечатление, что именно для verticalScrollBar()->setStyleSheet() надо задавать не стандарный Qss, а какой-то урезанный, который применяется только к элементам скроллбара. Ну или не нужены селекторы скроллбара или его элементов, они автоматически добавляются что ли. Кароче, третий день ковыряюсь, ничего не могу поделать с этой проблемой.
Записан

Собираю информацию по крупицам
http://webhamster.ru
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #3 : Ноябрь 08, 2014, 22:20 »

за центральные части отвечают следующие свойства:
Код
CSS
QScrollBar::left-arrow:horizontal {
   image: url(:/qss/scrollbar_arrow_left.png);
}
 
QScrollBar::right-arrow:horizontal {
   image: url(:/qss/scrollbar_arrow_right.png);
}
 
QScrollBar::up-arrow:vertical {
   image: url(:/qss/scrollbar_arrow_up.png);
}
 
QScrollBar::down-arrow:vertical {
   image: url(:/qss/scrollbar_arrow_down.png);
}
попробуйте эти картинки сделать однопиксельными прозрачными.
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #4 : Ноябрь 08, 2014, 23:20 »

за центральные части отвечают следующие свойства:

Попробовал. Не получается.

Пока что нащупал такие стили:

Код:
object->verticalScrollBar()->setStyleSheet("QScrollBar {width:5px; border: none; background: transparent;}"
                                           "QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical {width: 1px; height: 25px; border: none;  background: #32CC99; image: url(:/resource/pic/transparent_dot.png); }"
                                           "QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical { image: url(:/resource/pic/transparent_dot.png); }");

То есть:

  • Задаю ширину вертикальной полосы прокрутки 5 px. Рамки нет. Задник прозрачный.
  • Задаю ширину кнопок вверх-вниз в 1 px. Высоту 25 px (чтобы была видна проблема, так как при высоте-ширине 0:0 проблема есть, но непонятно что происходит). Рамки нет. Задник кислотного зеленого цвета, чтоб видеть его.
  • Стрелки на кнопках заменяю прозрачной картинкой в 1 px.

И вот что получается. Увеличенная картинка верхней части скроллбара:

http://i.piccy.info/i9/991372a211664b7b27ef2bdd85cd2fce/1415476613/1737/597435/scr_364.png

Во-первых, прозрачности у бекгроунда всего скроллбара нет (серый цвет).

Во-вторых, зеленая кнопка "вверх" отрисовывается не на месте самой кнопки. То есть, видна она не с самого верха скроллбара. А с отступом в 5 пикселей. И видно, что наличествует серая область 5x5 px, которая резервируется под кнопку "вверх". То есть, под кнопку "вверх" выделяется не область 1x25 px, как задано в стиле, а тупо 5x5 px, просто по ширине скроллбара.

Сделай скроллбар шириной 7 px - зарезервируется область 7x7 px. И у зеленая кнопка "вверх" размером 1x25 px будет отрисовываться не от самого верха скроллбара, а с отступом в 7 px.

Самое неприятное, что высотой этой зарезервированной серой области невозможно управлять напрямую. Она просто равна ширине скроллбара. И движок, кстати, если прокрутить в самый верх, упирается в эту область. То есть, даже если задать высоту кнопок QScrollBar::add-line:vertical/QScrollBar::sub-line:vertical в 0 px, то движок все равно не  доедет до самого конца скроллбара, а остановится на расстоянии ширины скроллбара.

Таким образом мы видим, что через QSS невозможно установить высоту кнопок скроллбара. Во всяком случае, у меня именно так.

Каким еще образом можно повлиять на кнопки вверх-вниз скроллбара, чтобы их скрыть?
Записан

Собираю информацию по крупицам
http://webhamster.ru
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #5 : Ноябрь 09, 2014, 00:18 »

Во-вторых, зеленая кнопка "вверх" отрисовывается не на месте самой кнопки. То есть, видна она не с самого верха скроллбара. А с отступом в 5 пикселей. И видно, что наличествует серая область 5x5 px, которая резервируется под кнопку "вверх". То есть, под кнопку "вверх" выделяется не область 1x25 px, как задано в стиле, а тупо 5x5 px, просто по ширине скроллбара.

Сделай скроллбар шириной 7 px - зарезервируется область 7x7 px. И у зеленая кнопка "вверх" размером 1x25 px будет отрисовываться не от самого верха скроллбара, а с отступом в 7 px.

Самое неприятное, что высотой этой зарезервированной серой области невозможно управлять напрямую. Она просто равна ширине скроллбара. И движок, кстати, если прокрутить в самый верх, упирается в эту область. То есть, даже если задать высоту кнопок QScrollBar::add-line:vertical/QScrollBar::sub-line:vertical в 0 px, то движок все равно не  доедет до самого конца скроллбара, а остановится на расстоянии ширины скроллбара.
в моем первом примере есть указание margin, именно для того чтоб убрать зарезервированную область

вы плохо изучили пример работы с QScrollBar из QSS

у QScrollBar нет свойств без указания субконтролов, а значит предложение ("QScrollBar {width:5px; border: none; background: transparent;}") в вашем примере полностью не задействовано

вот пример, я делал по нему, и у меня все получилось (правда не андроид):
http://qt-project.org/doc/qt-5/stylesheet-examples.html#customizing-qscrollbar
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #6 : Ноябрь 09, 2014, 16:22 »

вы плохо изучили пример работы с QScrollBar из QSS

у QScrollBar нет свойств без указания субконтролов, а значит предложение ("QScrollBar {width:5px; border: none; background: transparent;}") в вашем примере полностью не задействовано

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

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

Цитировать
Customizing QScrollBar

The QScrollBar can be styled using its subcontrols like handle, add-line, sub-line, and so on. Note that if one property or sub-control is customized, all the other properties or sub-controls must be customized as well.


Перенастройка QScrollBar

QScrollBar может быть стилизован через его субконтролы, такие как handle, add-line, sub-line, и прочие. Запомните, что даже если одно свойство или субконтрол были перенастроены, все другие свойства или субконтролы должны быть так же перенастроены.

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


вот пример, я делал по нему, и у меня все получилось (правда не андроид):
http://qt-project.org/doc/qt-5/stylesheet-examples.html#customizing-qscrollbar

Теперь когда вы сказали, я заметил, что в этом примере нет ни одной строчки без субконтрола. Пока сам решал, каких только примеров не насмотрелся. И самый действенный оказался:

Код:
ScrollBar {width:3px;}

То есть, без субконтролов таки работает.

Попробую поиграться с margin, я его еще толком не ковырял.
Записан

Собираю информацию по крупицам
http://webhamster.ru
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #7 : Ноябрь 09, 2014, 17:27 »

Да, margin помог, спасибо.
Записан

Собираю информацию по крупицам
http://webhamster.ru
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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