每当用户滚动 QScrollArea 时获得通知的最简单方法是什么?

What is the simplest way to get notified whenever the user scrolls a QScrollArea?

正如 QPushButton 提供默认 clicked() 信号一样,我希望 QScrollArea 具有 sliderChanged() 或类似信号。有趣的是,QScrollBar确实有这样的信号。

我想做的就是知道每当用户滚动它时,滚动区域内的巨大小部件的哪一部分是可见的。

有很多解决方案,none 我觉得很优雅:

  1. 子类QScrollArea
  2. 子类化滚动区域内的小部件,并重新实现其绘制事件。
  3. 创建自定义视口,使用 QScrollBar
  4. 定期轮询控件在滚动区域内的位置。这似乎是最糟糕的解决方案。

有没有不用子类化的方法?

滑块值更改时会发出 QAbstractSlider::valueChanged() 信号,新滑块值作为参数。这会在您滚动视图时立即通知您。

WRT第二个问题,上述两点都没有必要。您需要:

1) 获取与滚动区域相关的内部小部件(如果有)的位置:

QPoint p = scrollArea->widget()->pos();

如果您滚动视图 down/right 或不滚动则为 null。

2) 获取可见区域的大小

QSize s = scrollArea->viewport()->size();

使用这两个值,您可以构造一个 QRect 来表示内部小部件的可见区域。