qt setStyleSheet源碼原理解析

QWidget::SetStyleSheet()核心代碼原理:

執行過程中會執行到該函數:

void QWidgetPrivate::setStyle_helper(QStyle *newStyle, bool propagate)

{

。。。

/*

可以看到它會找所有的widget,執行繪製

*/

    if (propagate) {

        // We copy the list because the order may be modified

        const QObjectList childrenList = children;

        for (int i = 0; i < childrenList.size(); ++i) {

            QWidget *c = qobject_cast<QWidget*>(childrenList.at(i));

            if (c)

                c->d_func()->inheritStyle();

        }

}

。。。

}

我們一般也都是這麼想的,但是有些看似不是widget也會生效,比如:

      QListView::itemr {

          background-color: rgb(110,110,110);

color:rgb(233,233,233);

      }

QListView的item是QAbstractWidgetItem,它不是一個widget,卻能夠執行繪製,原因是在於QListView的底層核心代碼,它的接口Item確實是QAbstractWidgetItem,確實不是一個item,但是QListView的底層應該是類似還有一層widget,用於和QAbstractWidgetItem產生關聯,和顯示item的數據等,所以stylesheet設置的item,不是看似乎相似的QAbstractWidgetItem,而是與其關聯的更底層還有一個對應的widget,纔是這個item。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章