Qt子类化后qss设置背景色无效的问题

时间:2024-01-27 10:29:01

Qt子类化后qss设置背景色无效的问题

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);

}

代码美化后效果如下: