gpt4 book ai didi

c++ - 在 QTabWidget 中动态设置单个选项卡的样式

转载 作者:行者123 更新时间:2023-11-30 03:29:07 25 4
gpt4 key购买 nike

我知道,这个问题已经在这里和其他网站上讨论过,但还没有真正的解决方案,尽管我认为,我不是唯一遇到这个问题的人:

我如何单独和动态地访问单个选项卡(不是其内容或选项卡中的小部件)以进行样式设置,例如更改背景颜色或向其添加图形效果?一个应用程序可以通知用户,一个选项卡需要他的注意,方法是让它以另一种颜色闪烁(比如在 Windows 任务栏中,如果一个窗口想要获得焦点)。有一个改变文字颜色的功能,为什么不更多呢?样式表可用于访问选定的、第一个等选项卡,但不能通过其索引访问特定的选项卡。有人谈到了 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);
}
};

完整的例子可以在下面的link找到

关于c++ - 在 QTabWidget 中动态设置单个选项卡的样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45909147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com