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-Designer 中使用自定义小部件

[Qt]如何支持:自定义小部件样式表的按下状态?

Qt:如何制作像 QTextField 一样对齐的自定义小部件

如何创建自定义小部件并在 Qt Designer 中使用它?

具有重叠子小部件的 Qt 自定义小部件