每当用户滚动 QScrollArea 时获得通知的最简单方法是什么?
What is the simplest way to get notified whenever the user scrolls a QScrollArea?
正如 QPushButton
提供默认 clicked()
信号一样,我希望 QScrollArea
具有 sliderChanged()
或类似信号。有趣的是,QScrollBar
确实有这样的信号。
我想做的就是知道每当用户滚动它时,滚动区域内的巨大小部件的哪一部分是可见的。
有很多解决方案,none 我觉得很优雅:
- 子类
QScrollArea
- 子类化滚动区域内的小部件,并重新实现其绘制事件。
- 创建自定义视口,使用
QScrollBar
- 定期轮询控件在滚动区域内的位置。这似乎是最糟糕的解决方案。
有没有不用子类化的方法?
滑块值更改时会发出 QAbstractSlider::valueChanged()
信号,新滑块值作为参数。这会在您滚动视图时立即通知您。
WRT第二个问题,上述两点都没有必要。您需要:
1) 获取与滚动区域相关的内部小部件(如果有)的位置:
QPoint p = scrollArea->widget()->pos();
如果您滚动视图 down/right 或不滚动则为 null。
2) 获取可见区域的大小
QSize s = scrollArea->viewport()->size();
使用这两个值,您可以构造一个 QRect 来表示内部小部件的可见区域。
正如 QPushButton
提供默认 clicked()
信号一样,我希望 QScrollArea
具有 sliderChanged()
或类似信号。有趣的是,QScrollBar
确实有这样的信号。
我想做的就是知道每当用户滚动它时,滚动区域内的巨大小部件的哪一部分是可见的。
有很多解决方案,none 我觉得很优雅:
- 子类
QScrollArea
- 子类化滚动区域内的小部件,并重新实现其绘制事件。
- 创建自定义视口,使用
QScrollBar
- 定期轮询控件在滚动区域内的位置。这似乎是最糟糕的解决方案。
有没有不用子类化的方法?
滑块值更改时会发出 QAbstractSlider::valueChanged()
信号,新滑块值作为参数。这会在您滚动视图时立即通知您。
WRT第二个问题,上述两点都没有必要。您需要:
1) 获取与滚动区域相关的内部小部件(如果有)的位置:
QPoint p = scrollArea->widget()->pos();
如果您滚动视图 down/right 或不滚动则为 null。
2) 获取可见区域的大小
QSize s = scrollArea->viewport()->size();
使用这两个值,您可以构造一个 QRect 来表示内部小部件的可见区域。