1. 程式人生 > >Qt子類化後qss設定背景色無效的問題

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

}

程式碼美化後效果如下:

&n