Qt 自定义小部件如何通知 ScrollArea 父级视图更改
Posted
技术标签:
【中文标题】Qt 自定义小部件如何通知 ScrollArea 父级视图更改【英文标题】:How does a Qt custom widget notify ScrollArea parent about change of view 【发布时间】:2011-05-18 06:23:27 【问题描述】:我正在编写一个图像查看器作为自定义 Qt 小部件(请参阅:https://github.com/dov/Qviv),我现在陷入了如何让我的小部件通知父 QScrollArea 视口中的更改的问题,从而告诉它移动滚动条。例如。如果图像查看器因按键而更改缩放因子,则滚动条需要更改其页面大小。
这样做的一种方法是让小部件显式检查父级是否为 QScrollArea,然后显式调用其方法以在任何更改时通知它。
当然,我还需要将 ScrollArea 的变化连接到图像的内部视图,但这是一个不同的问题。而且我需要削减无限递归,其中小部件报告更改为滚动条报告小部件的更改等。
编辑周三 20:15 (GMT/UTC) 试图向 Vjo 和我自己澄清我需要什么。
我想要实现的是相当于一个 Gtk 小部件,它被分配了一对连接到水平和垂直滚动条的 GtkAdjustment。在我的小部件 GtkImageViewer 中,基于 QvivImageViewer,每当我由于某些内部事件(例如按键)而更改视图时,我都会更新 GtkAdjustment。滚动条与此类更改相关联并相应更新。 GtkImageViewer 还监听 GtkAdjustment 的变化,因此如果用户滚动滚动条,GtkImageViewer 会使用此信息更新并可以更改其视图。我的问题是 Qt 中是否有任何类似于 GtkAdjustment 的东西可以连接到进行更改,并且在这种情况下更新将传播到所有侦听器?
因此我不希望 ScrollArea 成为 QvivImageViewer 的一部分,但如果用户将 QvivImageViewer 放置在 ScrollArea 中,我希望与它进行双向通信,以便滚动条反映小部件的内部状态。
【问题讨论】:
【参考方案1】:最简单的方法是将QResizeEvent
事件从您的小部件对象发送到 QScrollArea 对象。
【讨论】:
QResizeEvent 如何帮助我告诉 ScrollArea Scrolling PageSize 发生了变化? @dov 首先,我在您的代码中的任何地方都看不到 QScrollArea。其次,我检查了 QScrollArea 类的参考页面,发现它可以处理 QResizeEvent :doc.qt.nokia.com/latest/qscrollarea.html#resizeEvent。如果我没有正确理解你的问题,你能更好地解释一下你的类之间的关系吗?【参考方案2】:我终于下载了 Qt 源码并研究了 QTextEdit
是如何做到的。我发现QTextEdit
自己继承了QAbstractScrollArea
,因此滚动区域和滚动条是小部件的一部分。这与 Gtk 不同,后者使用更高级别的抽象,通过它的GtkAdjustment
来表示滚动条和小部件之间的变化。 Qt 模型更简单,这就是我将在我的小部件中实现它的方式。
【讨论】:
【参考方案3】:已经有一段时间了,但我遇到了同样的问题。
如果您愿意,可以继承 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
将忽略内部小部件的大小变化。
【讨论】:
以上是关于Qt 自定义小部件如何通知 ScrollArea 父级视图更改的主要内容,如果未能解决你的问题,请参考以下文章
如何让 qt 设计器自定义 QOpenGLWidget 小部件背景透明?
Qt:如何制作像 QTextField 一样对齐的自定义小部件