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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено][GUI] Подскажите как реализовать кастомный QTabView  (Прочитано 6657 раз)
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« : Март 06, 2014, 10:13 »

Всем доброго времени.

Давно не "брал в руки" Qt виджеты. Но тут появилась необходимость реализовать GUI похожий на  QTabView (см. аттач).

Суть в том, что в "табах" имеются только картинки (иконки). При выборе "таба" его иконка подсвечивается и появляется треугольничек указывающий на выбранный таб.

С иконками и заливкой я вроде разобрался (использовал стили и пр. ). Но проблема в отрисовке этого самого треугольничка (да и всего виджета).  

Я так понимаю, что нужно взять QTabBar, отнаследоваться от него и попытаться рисовать кастомные табы самому, т.е. при активации таба, его контур должен выглядеть как-то так:

Цитировать
+++++
+      +
+    +            <== стрелочка
+      +
+++++


Подскажите, GUI гуру, как бы вы реализовали это, как проще и быстрее?  
« Последнее редактирование: Март 11, 2014, 11:59 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Bepec
Гость
« Ответ #1 : Март 06, 2014, 12:20 »

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

update: так просто через tabBar не получится, я думаю. Ну, с наскока точно. Я бы предложил просто самописный виджет из кнопочек. Быстро и незатратно.

update: с "прозрачной" стрелочкой всё сложно. Но можно просто обмануть пользуна, если знать заранее цвет фона, или же брать его откуда то Улыбающийся

Размялся чуток, вот что получилось https://dl.dropboxusercontent.com/u/101053289/Gif/3.gif.
В общем как то так - в архиве программа с классом и pro файлом.
https://dl.dropboxusercontent.com/u/101053289/Program/progorgTabView.zip

PS ничего сложного ^.^, прошу прощения за корявый (мб) код.
« Последнее редактирование: Март 06, 2014, 14:39 от Bepec » Записан
mitrich
Гость
« Ответ #2 : Март 06, 2014, 14:44 »

Взять вертикальный QToolBar (или просто QVBoxLayout), в него, как уже сказано накидать кнопок, и рядом QStackedWidget. Натянуть на всё это stylesheet, стрелочка - в нарисованной png.
Код
CSS
QToolBar{
 border: none;
}
 
QToolButton{
 border: none;
 background-color: rgb(0, 135, 135);
}
 
QToolButton:checked{
 border-image: url(:/images/grayarrow.png) stretch;
}
 
QStackedWidget{
 background: rgb(127, 127, 127);
}
 
Записан
Bepec
Гость
« Ответ #3 : Март 06, 2014, 16:04 »

to mitrich: Тогда в вашем варианте ещё нужна QButtonGroup и всё равно нужно обвязку в коде делать.
PS на мой взгляд не очень Улыбающийся
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #4 : Март 06, 2014, 17:53 »

Ох, парни, спасибо..

Мне импонирует как-то вариант со стилями. Т.к. при нажатии на баттон она должна "подсвечиваться" другой иконкой (типо активно/неактивно).  Тем более, кажется, что у баттонов есть вариант установки иконок при нажатии и итпускании.. Попробую с ним..  Улыбающийся

Стоп, а проперти "border-image" - это что такое? Где оно будет отрисовано?

Код
C++ (Qt)
QToolButton:checked{
 border-image: url(:/images/grayarrow.png) stretch;
}
 
« Последнее редактирование: Март 06, 2014, 17:55 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Bepec
Гость
« Ответ #5 : Март 06, 2014, 18:01 »

Ну на правах автора могу заметить, что в моём коде для этого достаточно пару строчек поменять. QIcon имеет все состояния аля активно-неактивно-он-офф.
Но раз стили нравятся, ничего не могу поделать.
Записан
vregess
Гость
« Ответ #6 : Март 06, 2014, 20:36 »

Я делал свой виджет.
Еще вариант посмотреть, как сделано в QtCreator (fancytabwidget). Мне там не очень понравилось, как перерисовываются кнопки.
В своем варианте сделал подсветку как у fancytabwidget. Бонус - анимированный указатель-стрелка.
Можно менять цвет указателя, добавлять кнопки сверху и снизу. Документации нет, код нужно допилить: убрать лишний заголовок, переписать пару коннектов, если qt < 5.

Сделано так: в QVBoxLayout напихиваем QWidget (кнопки, рисуют себя сами), а поверх этого бегает стрелка. В принципе просто, у Вереса наверное что-то похожее.
Записан
Bepec
Гость
« Ответ #7 : Март 06, 2014, 20:55 »

У меня просто Widget без кнопок с обработкой нажатий и переопределённым рисованием Веселый

"Ты недооцениваешь мою мощь" ©

А так и мой допилить надо до красивостей. Hover/click/leave эффекты делаются просто. Так же и с состоянием иконок - там QIcon само автоматом рисует в зависимости от переданного состояния Улыбающийся
Записан
mitrich
Гость
« Ответ #8 : Март 06, 2014, 21:25 »

Стоп, а проперти "border-image" - это что такое? Где оно будет отрисовано?
По сути, то же самое, что и background-image - см. border-image - только растягивается/сужается по размеру элемента (или я просто не понял, как background-image растягивать).
« Последнее редактирование: Март 06, 2014, 21:26 от mitrich » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #9 : Март 11, 2014, 11:58 »

Все, спасибо, парни.
Записан

ArchLinux x86_64 / Win10 64 bit
vregess
Гость
« Ответ #10 : Март 11, 2014, 13:03 »

Ну ты хоть в двух словах расскажи, как решил делать.
Записан
Bepec
Гость
« Ответ #11 : Март 11, 2014, 13:41 »

Border-image это изображение, что будет растиражировано на бордере Улыбающийся Ну на границе. Чтобы всякие красивости делать типо обожжённых краёв или свитков Веселый
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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