Intereting Posts
Запутанный typedef включает class Как создать папку на Mac с C ++? Сшивание изображений в android с помощью OpenCV Эмулировать C # Random () в C ++ (одинаковые номера) Почему нужен нулевой ограничитель? Почему не захваченная переменная поднимает предупреждение? c ++ многопоточная очередь задач для запланированных задач Как выполнить команду и получить код возврата stdout и stderr команды в C ++ Что такое хороший генератор случайных чисел для игры? Ошибка связи времени выполнения с SDL_Mixer и SMPEG2 на Android Заполните очередь с адресом вместо цифр Почему предупреждение g ++ о неинициализированной переменной зависит от типа переменной? (он предупреждает о int, но не для двойного) Как передать объект C ++ в веб-службу с помощью библиотеки POCO Самый быстрый способ внедрения C ++ Win32 Splash Screen Как подойти к разработке нового приложения Qt 5.7+ с высоким разрешением на монитор для DPI Aware?

Qt (C ++): динамический стиль отдельной вкладки в QTabWidget

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

Как я могу индивидуально и динамически получать доступ к одной вкладке (а не ее содержимому или виджету на вкладке) для целей стилизации, например, изменять цвет фона или добавлять к нему графические эффекты? Приложение может уведомлять пользователя, что вкладка требует его внимания, позволяя ему мигать другим цветом (например, в панели задач Windows, если окно хочет получить фокус). Есть функция изменения цвета текста, почему бы не больше? Таблицы стилей могут использоваться для доступа к выбранной, первой и т. Д. Вкладке, но не к определенной по ее индексу. Некоторые люди говорили о подclassификации QTabBar, но я не знаю, как это приведет к желаемому решению. Есть ли возможность достичь этого, и если да, просьба привести пример.

Чтобы получить доступ к каждому стилю каждой вкладки QTabBar вы должны перезаписать метод paintEvent() .

Общий способ сделать это должен иметь следующую структуру:

 void paintEvent(QPaintEvent *event){ QStylePainter painter(this); QStyleOptionTab opt; for(int index = 0; index < count(); index++) { initStyleOption(&opt,index); /*Here make the changes*/ painter.drawControl(QStyle::CE_TabBarTabShape, opt); painter.drawControl(QStyle::CE_TabBarTabLabel,opt); } } 

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

TabBarAlert:

 class TabBarAlert : public QTabBar { int indexAlert = -1; QColor mColor; Q_OBJECT public: TabBarAlert(QWidget *parent = Q_NULLPTR):QTabBar(parent) { mColor = Qt::red; } void setIndexAlert(int index){ if(indexAlert == index) return; indexAlert = index; update(); } int getIndexAlert() const{ return indexAlert; } QColor getColor() const{ return mColor; } void setColor(const QColor &color){ if(color == mColor) return; mColor = color; update(); } protected: void paintEvent(QPaintEvent *event){ if(indexAlert> -1 && indexAlert < count()){ QStylePainter painter(this); QStyleOptionTab opt; for(int i = 0;i < count();i++) { initStyleOption(&opt,i); if(indexAlert == i) opt.palette.setColor(QPalette::Button, mColor); painter.drawControl(QStyle::CE_TabBarTabShape, opt); painter.drawControl(QStyle::CE_TabBarTabLabel,opt); } } else{ QTabBar::paintEvent(event); } } }; 

TabWidgetAlert:

 class TabWidgetAlert : public QTabWidget { TabBarAlert *tb; QTimer *timer; bool on = false; int indexAlert = -1; Q_OBJECT public: TabWidgetAlert(QWidget *parent = Q_NULLPTR):QTabWidget(parent) { tb = new TabBarAlert(this); setTabBar(tb); tb->setColor(Qt::black); /* *Disable the alert if the current tab matches the alert tab. */ connect(this, &TabWidgetAlert::currentChanged, [this](int index){ if(index == tb->getIndexAlert()){ tb->setIndexAlert(-1); on = false; timer->stop(); } }); timer = new QTimer(this); /* *Create the blink */ connect(timer, &QTimer::timeout, [this](){ tb->setIndexAlert(on? indexAlert: -1); on = !on; }); } void setAlert(int index){ indexAlert = index; timer->start(100); } }; - class TabWidgetAlert : public QTabWidget { TabBarAlert *tb; QTimer *timer; bool on = false; int indexAlert = -1; Q_OBJECT public: TabWidgetAlert(QWidget *parent = Q_NULLPTR):QTabWidget(parent) { tb = new TabBarAlert(this); setTabBar(tb); tb->setColor(Qt::black); /* *Disable the alert if the current tab matches the alert tab. */ connect(this, &TabWidgetAlert::currentChanged, [this](int index){ if(index == tb->getIndexAlert()){ tb->setIndexAlert(-1); on = false; timer->stop(); } }); timer = new QTimer(this); /* *Create the blink */ connect(timer, &QTimer::timeout, [this](){ tb->setIndexAlert(on? indexAlert: -1); on = !on; }); } void setAlert(int index){ indexAlert = index; timer->start(100); } }; - class TabWidgetAlert : public QTabWidget { TabBarAlert *tb; QTimer *timer; bool on = false; int indexAlert = -1; Q_OBJECT public: TabWidgetAlert(QWidget *parent = Q_NULLPTR):QTabWidget(parent) { tb = new TabBarAlert(this); setTabBar(tb); tb->setColor(Qt::black); /* *Disable the alert if the current tab matches the alert tab. */ connect(this, &TabWidgetAlert::currentChanged, [this](int index){ if(index == tb->getIndexAlert()){ tb->setIndexAlert(-1); on = false; timer->stop(); } }); timer = new QTimer(this); /* *Create the blink */ connect(timer, &QTimer::timeout, [this](){ tb->setIndexAlert(on? indexAlert: -1); on = !on; }); } void setAlert(int index){ indexAlert = index; timer->start(100); } }; 

Полный пример можно найти по следующей ссылке