1、问题背景
在某个类中,用到了一个组合的widget,有按钮进度条等,类似于视频播放器按钮控制区和进度条(参考了很多feiyangqingyun的文章,感谢),调试正常后整理代码,为了提高代码可读性,把widget提到一个单独的类中,重命名为FlowPanel,子类化后发现之前设置的widget背景色无法生效。
2、在父类中直接创建widget控制面板
步骤1:
在父控件类中直接创建widiget:
flowPanel2=newQWidget(this);
initFlowpanel();
步骤2:调用初始化函数,设置元素和样式
voidPlayWidget::initFlowpanel()
{
flowPanel2->setObjectName("flowPanel");
QHBoxLayout*layout=newQHBoxLayout;
layout->setSpacing(3);
layout->setMargin(0);
layout->addStretch();
flowPanel2->setLayout(layout);
//按钮集合
QList<QString>btns;
btns<<"btnFlowVideo"<<"btnFlowSnap"<<"btnFlowSound"<<"btnFlowAlarm"<<"btnFlowClose";
QList<QIcon>icons;
icons<<QApplication::style()->standardIcon(QStyle::SP_ComputerIcon);
icons<<QApplication::style()->standardIcon(QStyle::SP_FileIcon);
icons<<QApplication::style()->standardIcon(QStyle::SP_DirIcon);
icons<<QApplication::style()->standardIcon(QStyle::SP_DialogOkButton);
icons<<QApplication::style()->standardIcon(QStyle::SP_DialogCancelButton);
//循环添加顶部按钮
for(inti=0;i<btns.count();i++){
QPushButton*btn=newQPushButton;
connect(btn,SIGNAL(clicked(bool)),this,SLOT(btnClicked()));
//设置标识,用来区别按钮
btn->setObjectName(btns.at(i));
btn->setFixedWidth(20);
//设置拉伸策略使得填充
btn->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Expanding);
//设置焦点策略
btn->setFocusPolicy(Qt::NoFocus);
//设置图标大小和图标
btn->setIconSize(QSize(16,16));
btn->setIcon(icons.at(i));
//将按钮加到布局中
layout->addWidget(btn);
}
//设置样式
flowPanel2->setStyleSheet("#flowPanel{background-color:rgba(0,0,0,30);border:none;}");
}
3、使用子类化创建widget控制面板
因为这个panel要添加多个按钮,做不同的工作,为了提高代码的可读性,把flowpanel子类化。
问题出来了,子类化后panel的背景色消失了。
修改过程:
步骤1:子类化方式创建panel
//自定义工具栏
flowPanel=newFlowPanel(this);
步骤2:完成FlowPanel类的构造函数,添加元素和设置样式。
FlowPanel::FlowPanel(QWidget*parent):QWidget(parent)
{
this->setObjectName("flowPanel");
QHBoxLayout*layout=newQHBoxLayout;
........ // 全部拷贝的上面的内容,完全一样
//设置样式
this->setStyleSheet("#flowPanel{background-color:rgba(0,0,0,30);border:none;}");
}
运行效果如下:
4、解决方法
参考大神的博客:一去二三里(https://waleon.blog.csdn.net/article/details/50357715)。
重写绘图事件,背景色设置正常,和修改前一样。
void FlowPanel::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QStyleOption opt;
opt.init(this);
QPainter p(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}
代码美化后效果如下: