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

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

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

1

Решение

Для того, чтобы получить доступ к каждому стилю каждого 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);
}
};

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]