Qt自定义小部件如何通知ScrollArea父级视图的更改

时间:2011-05-18 06:23:27

标签: c++ qt qt4

我正在将图像查看器编写为自定义Qt窗口小部件(请参阅:https://github.com/dov/Qviv),现在我遇到了如何让我的窗口小部件通知父视图端口中的更改的父QScrollArea的问题,以及因此告诉它移动滚动条。例如。如果图像查看器因按键而更改缩放系数,则滚动条需要更改其页面大小。

执行此操作的一种方法是让窗口小部件显式检查父窗口是否为QScrollArea,然后显式调用其方法以在任何更改时通知它。

当然我还需要将ScrollArea的更改连接到图像的内部视图,但这是一个不同的问题。我需要削减无限递归,其中小部件报告对滚动条的更改,该滚动条报告对小部件的更改等。

编辑周三20:15(格林威治标准时间/ UTC)试图向Vjo和我自己澄清我需要什么。

我想要实现的是相当于一个Gtk小部件,它被分配了一对连接到水平和垂直滚动条的GtkAdjustment。在我的小部件GtkImageViewer中,QvivImageViewer基于,每当我因某些内部事件(例如按键)更改视图时,我都会更新GtkAdjustment。滚动条连接到此类更改并相应地更新。 GtkImageViewer还会监听GtkAdjustment更改,因此如果用户滚动滚动条,GtkImageViewer将使用此信息进行更新,并可以更改其视图。我的问题是,是否有类似于Qt中的GtkAdjustment,您可以连接到更改,并更新,在这种情况下,更新将传播到所有侦听器?

因此我不希望ScrollArea成为QvivImageViewer的一部分,但如果用户在ScrollArea中放置了QvivImageViewer,我希望与它进行双向通信,以便滚动条反映窗口小部件的内部状态。

3 个答案:

答案 0 :(得分:1)

最简单的方法是将QResizeEvent事件从widget对象发送到QScrollArea对象。

答案 1 :(得分:1)

我终于下载了Qt源并调查QTextEdit如何做到这一点。我发现QTextEdit自己继承QAbstractScrollArea,因此滚动区域和滚动条是小部件的一部分。这与Gtk不同,Gtk使用更高级别的抽象,通过其GtkAdjustment用于表示滚动条和小部件之间的变化。 Qt模型更简单,这是我在我的小部件中实现它的方式。

答案 2 :(得分:1)

已经有一段时间了,但我遇到了同样的问题。

如果您愿意,可以继承QAbstractScrollArea,但QScrollArea也会有效。

您的自定义内部窗口小部件(即您正在滚动的窗口小部件)在其大小更改时应执行以下操作:

void MyCustomControl::resize_me() {
  // recompute internal data such that sizeHint() returns the new size
  ...
  updateGeometry();
  adjustSize();
}

QSize MyCustomControl::sizeHint() {
  return ... ; // Return my internally computed size.
}

我错过了adjustSize()来电,如果没有,QScrollArea将忽略内部小部件的尺寸变化。