我有一个包含其他类的类/ QDialog(我们称之为“Frame”)。这就是它的样子:
在上面的屏幕截图中,绿色矩形内的所有内容实际上都是一个单独的类/自定义QWidget(我们称之为“Page3”,因为它是列表中的第三项)放在QStackedWidget中,而矩形外的所有内容都是帧。因此矩形内的所有内容都与Frame分开,即使它看起来是同一形式的一部分。单击概述和 SQLite Journal 对象会导致在QStackedWidget中加载单独的页面。所有这些类必须能够相互通信。
问题是,我不确定如何从Page3内部访问Frame的公共方法或变量。请参阅,当两个密码字段(密码& 重复)的内容匹配时,Page3的其中一个功能是解锁Frame中的OK按钮。为此,Page3需要调用解锁Frame中按钮的方法。我需要与当前运行的Frame实例进行通信,而不是创建新的副本,因此从Page3内部实例化Frame不起作用。我不能使用parent()因为它只是引用Frame内部的QStackedWidget而不是Frame本身。
如果有人能告诉我怎么做,我会很感激。
答案 0 :(得分:2)
我更喜欢使用信号和插槽来做这种事情(子窗口小部件与其父窗口之间的通信)。为什么?因为如果孩子明确地依赖于父母,你最终会得到循环依赖,并且将来更难改变你的设计。
最简单的解决方案是让Page3发出“unlockOk”信号,该信号连接到Frame中的插槽,该插槽实际上“解锁”按钮。 Frame可以在其构造函数中连接信号和槽,或者实际上实例化Page3对象的任何地方。
如果你想更进一步,你可以使信号更通用;例如,信号称为“inputValid”(当密码字段匹配时将发出)和“inputInvalid”,它将连接到“unlockOk”和“lockOk”插槽。这样做的原因是,如果需要,您可以重复使用应用程序其他部分的信号,并且他们的名字清楚地表明他们正在通信的内容。