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。