如何在QScrollArea中的QScrollBar上放置QGraphicsEffect?

时间:2015-10-08 15:27:58

标签: c++ qt

我尝试在QGraphicsDropShadowEffect上设置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内的滑块上设置效果,但它不适用于它。但是,它可以通过scrollArea应用于整个ui->scrollArea->setGraphicsEffect(dse)。我做错了什么?

1 个答案:

答案 0 :(得分:0)

我遇到的问题是由QScrollBar的父窗口小部件引起的。因此,QScrollArea具有项目区域和滚动条区域。滚动条区域包含QWidgetQScrollBar实际放置在这些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
    }
}