Qt/C++ особенности QProxyStyle
Доброго дня.
Столкнулся с необходимостью создать на форме
TabWidget
вкладки которых должны быть по вертикали,
но с заголовками по горизонтали.
Реализовал при помощи
QProxyStyle
listclassifier.h
- #ifndef LISTCLASSIFIER_H
- #define LISTCLASSIFIER_H
- #include <QDialog>
- #include <QProxyStyle>
- #include <QStyleOptionTab>
- //===================================================
- namespace Ui {
- class ListClassifier;
- }
- //===================================================
- class CustomTabProxyStyle : public QProxyStyle {
- public:
- virtual QSize sizeFromContents(QStyle::ContentsType ctype, const QStyleOption *option, const QSize &contentsSize, const QWidget *widget) const override
- {
- QSize s = QProxyStyle::sizeFromContents(ctype, option, contentsSize, widget);
- if (ctype == QStyle::CT_TabBarTab){
- s.transpose();
- }
- return s;
- }
- virtual void drawControl(QStyle::ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const override
- {
- if (element == CE_TabBarTabLabel) {
- if (const QStyleOptionTab* tab = qstyleoption_cast<const QStyleOptionTab*>(option)) {
- QStyleOptionTab opt(*tab);
- opt.shape = QTabBar::RoundedNorth;
- QProxyStyle::drawControl(element, &opt, painter, widget);
- return;
- }
- }
- QProxyStyle::drawControl(element, option, painter, widget);
- }
- };
- //===================================================
- class ListClassifier : public QDialog
- {
- Q_OBJECT
- public:
- explicit ListClassifier(QWidget *parent = nullptr);
- ~ListClassifier();
- private:
- Ui::ListClassifier *ui;
- };
- #endif // LISTCLASSIFIER_H
listclassifier.cpp
- #include "listclassifier.h"
- #include "ui_listclassifier.h"
- ListClassifier::ListClassifier(QWidget *parent) :
- QDialog(parent),
- ui(new Ui::ListClassifier)
- {
- ui->setupUi(this);
- QTabWidget* theTabWidget = new QTabWidget();
- theTabWidget->tabBar()->setStyle(new CustomTabProxyStyle());
- for (int i = 0; i < 5; ++i)
- theTabWidget->addTab(new QWidget(), QString("Tab %1").arg(i + 1));
- theTabWidget->setTabPosition(QTabWidget::West);
- this->layout()->addWidget(theTabWidget);
- }
... но возникла проблема.
Суть проблемы заключается в том, что при загрузке приложения устанавливается стиль в
main.cpp
(код касающийся QTabBar)
- a.setStyleSheet(QString(""
- "/* --------------------- QTabBar --------------------- */"
- "QTabBar::tab"
- "{"
- "background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,stop: 0 #E1E1E1, stop: 0.4 #DDDDDD,stop: 0.5 #D8D8D8, stop: 1.0 #D3D3D3);"
- "border: 2px solid #C4C4C3;" //1px inset gray;
- "border-bottom-color: #C2C7CB;"
- "border-top-left-radius: 5px; "
- "border-top-right-radius: 5px; "
- "min-width: 10ex; "
- "padding-top: 1px;"
- "padding-right: 8px;"
- "padding-left: 8px;"
- "padding-bottom: 1px;"
- "}"
- ""
- "QTabBar::tab:selected, QTabBar::tab:hover"
- "{"
- "background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,stop: 0 #fafafa, stop: 0.4 #f4f4f4,stop: 0.5 #e7e7e7, stop: 1.0 #fafafa);"
- "}"
- ""
- "QTabBar::tab:selected"
- "{"
- "border-color: #9B9B9B;"
- "border-bottom-color: #C2C7CB;"
- "}"
- ""
- "QTabBar::tab:!selected"
- "{"
- "margin-top: 2px;"
- "}"
- ""));
Заголовки вкладок устанавливаются по горизонтали только в том случае если код вышеуказанного стиля
закомментирован
.
Хотя в офф.документации описано:
... динамическое переопределение элементов QStyle (если правильно понял).
Подскажите как быть в данной ситуации ?
Вам это нравится? Поделитесь в социальных сетях!
Комментарии
Пожалуйста, авторизуйтесь или зарегистрируйтесь
- Последние комментарии
- AK1 апреля 2025 г. 11:41Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
- VP9 марта 2025 г. 16:14Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
- Сейчас обсуждают на форуме
- DT14 апреля 2025 г. 15:38Всем привет! На Qt 6.8 MinGW пытаюсь сделать управление подключением WiFi из программы. Пока делаю поддержку Windows, но так же хочу в дальнейшем внедрить и поддержку Linux/MacOS. Для…
- f15 февраля 2025 г. 13:46Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
- Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
- Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
Добрый день.
Это всё работает, вот только если есть переопределения каких-то методов, то нет гарантии, что что-то не сломается.
Думаю, что нужно допиливать стилевоё оформление в прокси классе.
Добрый день. Объясните пожалуйста ...
... где именно копать ?
В каком виртуальном методе лучше допиливать (если можно направление или пример) ?
Разбираться с методом drawControl, понимаю, что вы его просто скопипастили с одного из сайтов, на котором расположен этот пример кода, он кочует с сайта на сайт уже давно. Но по сути вопрос в том, чтобы правильно разобраться со всеми деталями, которые есть в этом методе.
На QStyleOptionTab есть документация, в которой моджно посмотреть, какие именно стилевые параметры можно настроить и их нужно переписать в методе drawControl
Да, Вы правы. Код был скопирован с сайта (уже не помню с какого), но решил пойти по пути более легком.
Пришлось переписать - кому интересно:
использовал stackedWidget для переключения между закладками в итоги получилось следующее ...