zoukankan      html  css  js  c++  java
  • 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);

    }

    代码美化后效果如下:

  • 相关阅读:
    笔记3
    笔记
    指令操作、例子
    python文件操作
    pandas处理excel
    Flask资源
    ImportError: DLL load failed while importing _ssl: 找不到指定的模块。 Failed
    WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
    selenium 安装与 chromedriver安装
    ubuntu 更换清华源
  • 原文地址:https://www.cnblogs.com/pingwen/p/13391688.html
Copyright © 2011-2022 走看看