2

我有一个包含其他类的类/ QDialog(我们称之为“框架”)。这是它的样子:

框架类

在上面的屏幕截图中,绿色矩形内的所有内容实际上是一个单独的类/自定义 QWidget(我们称其为“Page3”,因为它是列表中的第三项),放置在 QStackedWidget 内,而矩形外的所有内容都是 Frame 的一部分。因此,矩形内的所有内容都与 Frame 分开,即使它看起来是同一表单的一部分。单击OverviewSQLite Journal对象会在 QStackedWidget 中加载一个单独的页面。所有这些类都必须能够相互通信。

问题是,我不确定如何从 Page3 中访问 Frame 的公共方法或变量。看,Page3 的功能之一是当两个密码字段(Password & Repeat)的内容匹配时,解锁 Frame 中的 OK 按钮。为此,Page3 需要调用解锁 Frame 中按钮的方法。我需要与当前运行的 Frame 实例进行通信,而不是创建一个新副本,因此从 Page3 内部实例化 Frame 不起作用。我也不能使用 parent() ,因为它只是指 Frame 内的 QStackedWidget 而不是 Frame 本身。

如果有人能告诉我如何做到这一点,我将不胜感激。

4

1 回答 1

2

我更喜欢使用信号和插槽来做这种事情(子部件与其父部件之间的通信)。为什么?因为如果孩子显式地依赖于父母,你最终会得到一个循环依赖,并且将来更难改变你的设计。

最简单的解决方案是让 Page3 发出一个“unlockOk”信号,该信号连接到 Frame 中的一个插槽,该插槽执行按钮的实际“解锁”。Frame 可以在其构造函数中连接信号和槽,或者在它实际实例化 Page3 对象的任何其他位置。

如果你想更进一步,你可以让信号更通用;例如,称为“inputValid”(将在密码字段匹配时发出)和“inputInvalid”的信号,将连接到“unlockOk”和“lockOk”插槽。这样做的原因是,如果需要,您可以在应用程序的其他部分重用信号,并且它们的名称清楚地表明它们正在通信的内容。

于 2013-05-28T20:38:19.720 回答