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));

下面是修改后的效果:
在这里插入图片描述
界面一显示,滚动条的滑块就是显示出来的,而且即使鼠标移开,滑块也不会自动隐藏。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
QScrollArea是一个带有滚动条的窗口部件,它可以包含其他QWidget部件作为其子部件,以便在视图中显示可滚动的内容。要自定义QScrollArea滚动条样式,可以使用QSS(Qt样式表)。 以下是一个例子,可以设置QScrollArea的垂直滚动条的样式为红色: ```python scroll = QScrollArea() scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn) scroll.setStyleSheet("QScrollBar:vertical {border: none; background: none; width: 10px; margin: 0px 0px 0px 0px;} \ QScrollBar::handle:vertical {background: red; border-radius: 5px; min-height: 20px;} \ QScrollBar::add-line:vertical {background: none;} \ QScrollBar::sub-line:vertical {background: none;}") ``` 在上面的代码中,我们首先创建了一个QScrollArea对象,然后设置了垂直滚动条的策略为始终显示。接下来,我们使用setStyleSheet()方法设置了QSS样式表,其中包括以下几个部分: - QScrollBar:vertical:选择垂直滚动条并设置其属性。 - border:none:去掉边框。 - background:none:去掉背景色。 - width:10px:设置滚动条的宽度为10像素。 - margin:0px 0px 0px 0px:设置外边距为0像素。 - QScrollBar::handle:vertical:选择滚动条滑块并设置其属性。 - background:red:设置滑块的背景色为红色。 - border-radius:5px:设置滑块的边角半径为5像素。 - min-height:20px:设置滑块的最小高度为20像素。 - QScrollBar::add-line:vertical:选择滚动条的加号按钮并设置其属性。 - background:none:去掉加号按钮的背景色。 - QScrollBar::sub-line:vertical:选择滚动条的减号按钮并设置其属性。 - background:none:去掉减号按钮的背景色。 这样,我们就可以自定义QScrollArea滚动条样式了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值