2015-10-08 22 views
0

我嘗試在QScrollBar上設置QGraphicsDropShadowEffect。此代碼的工作:如何將QGraphicsEffect放在QScrollArea內的QScrollBar上?

QGraphicsDropShadowEffect * dse = new QGraphicsDropShadowEffect(); 
dse->setBlurRadius(10); 
dse->setColor(Qt::red); 
dse->setOffset(0); 
ui->verticalScrollBar->setGraphicsEffect(dse); // verticalScrollBar is `QScrollBar`. 

但以下不會:

QGraphicsDropShadowEffect * dse = new QGraphicsDropShadowEffect(); 
dse->setBlurRadius(10); 
dse->setColor(Qt::red); 
dse->setOffset(0); 
ui->scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); 
ui->scrollArea->verticalScrollBar()->setGraphicsEffect(dse); 

在第二個例子的代碼,我嘗試設置裏面QScrollArea滑塊的效果,但它並不適用於它。但是,它可以通過ui->scrollArea->setGraphicsEffect(dse)應用於整個scrollArea。我究竟做錯了什麼?

回答

0

我的問題是由父部件QScrollBar造成的。所以,QScrollArea有項目區和滾動條區。滾動條區域包含QWidget s和QScrollBar s實際上放置在這些QWidgets上。所以,要做到這一點,我實際上必須爲父控件設置效果:

for(auto *child : ui->scrollArea->findChildren<QScrollBar*>()) { 
    if (child->orientation() == Qt::Vertical) { 
     auto * dse = new QGraphicsDropShadowEffect(); 
     dse->setBlurRadius(10); 
     dse->setColor(Qt::red); 
     dse->setXOffset(-3); 
     dse->setYOffset(0); 
     child->parentWidget()->setGraphicsEffect(dse); 
     qDebug() << child->metaObject()->className(); // QScrollBar 
     qDebug() << child->parentWidget()->metaObject()->className(); // QWidget 
    } 
}