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

vsz*_*vsz 3 qt scrollbar

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

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

有很多解决方案,但对我来说没有一个是优雅的:

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

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

vah*_*cho 7

QAbstractSlider::valueChanged()当滑块值已改变时发射,与新的滑块值作为参数信号。这将在您滚动视图时立即通知您。

WRT第二个问题,上面提到的两点都没有必要。你需要:

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

QPoint p = scrollArea->widget()->pos();
Run Code Online (Sandbox Code Playgroud)

如果您向下/向右滚动视图或在不滚动的情况下为空,则它曾经是负坐标。

2)获取可见区域的大小

QSize s = scrollArea->viewport()->size();
Run Code Online (Sandbox Code Playgroud)

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