【问题标题】:Accessing methods from another class inside a QWidget从 QWidget 中的另一个类访问方法
【发布时间】:2013-05-28 20:26:43
【问题描述】:

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

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

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

如果有人能告诉我该怎么做,我将不胜感激。

【问题讨论】:

    标签: qt qwidget qdialog


    【解决方案1】:

    我更喜欢使用信号和插槽来做这种事情(子部件与其父部件之间的通信)。为什么?因为如果子显式依赖于父,最终会产生循环依赖,而且以后更难更改设计。

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

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

    【讨论】:

    • 这听起来可能会奏效。有没有一种特殊的方式在类之间发送信号?我问是因为我以前从来没有这样做过。
    • 查看 Qt 文档:qt-project.org/doc/qt-4.8/signalsandslots.html 您在类声明的“信号”部分声明信号,在“插槽”部分声明插槽;然后像定义普通类方法一样定义插槽方法。然后您将使用QObject::connect 方法将它们连接到某个地方,如下所示:connect(page3, SIGNAL(inputValid()), this, SLOT(unlockOk()));
    猜你喜欢
    • 2022-12-05
    • 1970-01-01
    • 2017-05-12
    • 2017-01-03
    • 2013-12-27
    • 2012-03-19
    • 2012-07-18
    • 2015-01-21
    • 2014-10-10
    相关资源
    最近更新 更多