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

    }

    代码美化后效果如下:

  • 相关阅读:
    CLR via C#深解笔记三
    CLR via C#深解笔记二
    CLR via C#深解笔记一
    C#参考:Linq 概述
    JavaScript
    jQuery
    JavaScript
    云原生
    python模块----optparse模块、argparse模块 (命令行解析模块)
    python模块----pymysql模块 (连接MySQL数据库)
  • 原文地址:https://www.cnblogs.com/pingwen/p/13391688.html
Copyright © 2020-2023  润新知