QScrollArea滚动条改为一直显示
QScrollArea
QScrollArea简介
QScrollArea表示一个滚动区域。
当里面的widget显示不下时,就会出现滚动条,可以通过滚动的方式查看widget的其他部分。
Qt::ScrollBarPolicy
Qt::ScrollBarPolicy表示滚动条显示策略。
值 | 描述 |
---|---|
Qt::ScrollBarAsNeeded | 自动,当里面的内容显示不下时才会出现滚动条 |
Qt::ScrollBarAlwaysOff | 关闭,不会显示滚动条 |
Qt::ScrollBarAlwaysOn | 打开,一直会显示滚动条 |
默认值为Qt::ScrollBarAsNeeded。 | |
看下效果: |
Qt::ScrollBarPolicy::ScrollBarAlwaysOff
Qt::ScrollBarPolicy::ScrollBarAlwaysOn
Qt::ScrollBarPolicy::ScrollBarAsNeeded
实测发现,在显示不下时,ScrollBarAsNeeded与ScrollBarAlwaysOn效果一样
如何让滚动条的滑块一直显示
看上面ScrollBarAlwaysOn的动图,当显示不下时,第一眼看上去不知道当前没有显示完,只有开始滚动或者点击滚动条区域拖动,滚动条才会出现。
ScrollBarPolicy控制的是滚动区域内的QScrollbar是否显示,但是QScrollbar中的slider是否显示不受控制。
所以如何让滚动条的滑块自动显示出来呢,不知道大佬有没有简单的办法?
我测试出的办法是继承QScrollBar,重写paint,然后给QScrollArea设置新的Scrollbar。
class MyScrollBar : public QScrollBar {
public:
MyScrollBar(QWidget* parent):QScrollBar(parent){}
private:
void paintEvent(QPaintEvent *) override
{
QPainter p(this);
QStyleOptionSlider opt;
initStyleOption(&opt);
opt.subControls = QStyle::SC_All;
opt.activeSubControls I= QStyle::SubControl::SC_ScrollBarSlider;
opt.state |= QStyle::State_MouseOver;
style()->drawComplexControl(QStyle::CC_ScrollBar, &opt, &p, this);
}
};
上面的代码实际是从QScrollBar的paintEvent修改而来,重点是
opt.activeSubControls |= QStyle::SubControl::SC_ScrollBarSlider;
opt.state |= QStyle::State_MouseOver;
opt.activeSubControls |= QStyle::SubControl::SC_ScrollBarSlider是欺骗painter说滑块是激活状态。
QStyle::State_MouseOver用来欺骗painter说scrollbar当前是在鼠标下面。
用MyScrollBar代替QScrollArea默认的滚动条即可:
auto scrollArea = new QScrollArea;
scrollArea->setVerticalScrollBar(new MyScrollBar(this));
下面是修改后的效果:
界面一显示,滚动条的滑块就是显示出来的,而且即使鼠标移开,滑块也不会自动隐藏。