为了访问每个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 的示例,其中它显示了一个闪烁的选项卡,并且只有在我们单击该选项卡时才会结束闪烁
标签栏警报:
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);
}
}
};
标签小部件警报:
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);
}
};
完整的示例可以在以下链接中找到