我正在将图像查看器编写为自定义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,我希望与它进行双向通信,以便滚动条反映窗口小部件的内部状态。
答案 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
将忽略内部小部件的尺寸变化。