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 (если правильно понял).
Подскажите как быть в данной ситуации ?
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.Do you like it? Share on social networks!
- Akiv Doros
- Nov. 11, 2024, 2:58 p.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:50points,
- Rating points-4
- molni99
- Oct. 26, 2024, 1:37 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:80points,
- Rating points4
- molni99
- Oct. 26, 2024, 1:29 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:20points,
- Rating points-10
Добрый день.
Это всё работает, вот только если есть переопределения каких-то методов, то нет гарантии, что что-то не сломается.
Думаю, что нужно допиливать стилевоё оформление в прокси классе.
Добрый день. Объясните пожалуйста ...
... где именно копать ?
В каком виртуальном методе лучше допиливать (если можно направление или пример) ?
Разбираться с методом drawControl, понимаю, что вы его просто скопипастили с одного из сайтов, на котором расположен этот пример кода, он кочует с сайта на сайт уже давно. Но по сути вопрос в том, чтобы правильно разобраться со всеми деталями, которые есть в этом методе.
На QStyleOptionTab есть документация, в которой моджно посмотреть, какие именно стилевые параметры можно настроить и их нужно переписать в методе drawControl
Да, Вы правы. Код был скопирован с сайта (уже не помню с какого), но решил пойти по пути более легком.
Пришлось переписать - кому интересно:
использовал stackedWidget для переключения между закладками в итоги получилось следующее ...