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、解決方法

參考大神的博客:一去二三里(//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);

}

代碼美化後效果如下:

 

Tags: