Qt|控制QScrollArea滚动方法2

521 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情

去年更新过关于如何控制滚动条滚动的文章,最近新学了一种方式,方便便捷,想要分享给大家。如果有想要了解之前是如何实现的,可以查看:Qt中控制QSCrollBar显示位置

为了效果更直观,首先展示下显示效果:

滚动条滚动.gif

效果清晰明了,根据左右两侧的按钮控制代替了手动拖动QScrollArea中的滚动条。

其实在真正使用左右箭头控制控件显示时,是不需要下面的水平滚动条的,这里只是为了更直观表示页面的走向。

接下来我就来讲解如何实现这种效果!

开发环境:VS2017 + Qt5.14.2

QScrollArea中控制的是水平滚动条,那么,如何获取水平滚动条的操作类指针呢?

在QScrollArea中,有这样一个函数:QScrollBar *horizontalScrollBar() const;可以来操控水平滚动条的所有控制。

对应的垂直滚动条控制函数:QScrollBar *verticalScrollBar() const;

具体的获取方式,如下:

QScrollBar *hBar = ui.scrollArea->horizontalScrollBar();

查看QScrollBar类详情,大家可以看到并没有什么可以实质性使用的接口

QScrollBar源码.png

所以,我们继续查看父类:QAbstractSlider中的源码信息。

有这样一个函数: void triggerAction(SliderAction action);

该函数在源码解析中是这样定义的:

Triggers a slider action. Possible actions are SliderSingleStepAdd, SliderSingleStepSub, SliderPageStepAdd, SliderPageStepSub, SliderToMinimum, SliderToMaximum, and SliderMove.

意思说是:滑块本身可以通过使用triggerAction函数来控制的,以模拟用于与滚动条控件的交互。该函数是触发滑块操作的,根据枚举参数不同分成了8种不同风格。

enum SliderAction {
        SliderNoAction,
        SliderSingleStepAdd,
        SliderSingleStepSub,
        SliderPageStepAdd,
        SliderPageStepSub,
        SliderToMinimum,
        SliderToMaximum,
        SliderMove
    };

在我们开发过程中,可以使用该函数代替setValue这种设置移动位置的方式控制滚动条,让系统帮助我们完成这种操作,极大方便了我们的使用。

由此可知,我们在程序中控制滚动条左右移动时就可以采用该函数。

左移动,代码显示:

QScrollBar *hBar = ui.scrollArea->horizontalScrollBar();
hBar->triggerAction(QAbstractSlider::SliderAction::SliderPageStepSub);

右移动,代码显示:

QScrollBar *hBar = ui.scrollArea->horizontalScrollBar();
hBar->triggerAction(QAbstractSlider::SliderAction::SliderPageStepAdd);

大家可以尝试一下,一定能实现文章最初展示的效果的!

其实,我在这里还有一个问题,只有当枚举类型是:SliderPageStepAdd、SliderPageStepSub时才可以实现移动,SliderSingleStepAdd、SliderSingleStepSub方式是无法实现的,即使我设置了step也不可以。

我是中国好公民st,一名C++开发程序猿~