【问题标题】:Call QtWidget parent method from child从子调用 QtWidget 父方法
【发布时间】:2017-06-26 12:11:25
【问题描述】:

我正在尝试从其子小部件SamplerModule 获取父小部件的一些属性:InstrumentSelector

InstrumentSelector 构造函数中,我运行parent->metaObject()->className(),它给了我正确的名称(SamplerModule)。所以我确定我在正确的位置调用我的公共方法之一,例如 getT() 在我的 SamplerModule 标头和 cpp 文件中定义为公共方法。

但是,当我调用这个函数时,我得到了这个错误:

\app\widgets\instrumentselector.cpp:23: erreur : 'class QWidget' 没有名为 'getT' 的成员 msgBox.setText(parent->getT());

所以我认为这是 C++ 和 Qt 的基础知识,但我仍在学习。

有人有想法吗?

谢谢

【问题讨论】:

    标签: c++ qt getter


    【解决方案1】:

    没有看到代码,很难确定,但我猜你已经将“parent”定义为“QWidget *”,所以编译器不知道它实际上是一个指向 SamplerModule 的基指针。您需要将“父级”转换为 SamplerModule 指针,或者以这种方式声明它。是的,这是纯 C++;它与 Qt 无关。

    【讨论】:

    • 谢谢!因此,由于我的代码很长,我会尽量缩短。选择器签名是InstrumentSelector::InstrumentSelector(QWidget *parent) : QPushButton(parent)。我的SamplerModuleUI 文件中有36 个这样的按钮。我正在尝试运行parent->getT()ìn my buttons constructor. So yes, I feel that I have to give more informations to the InstrumentSelector` Instances,但我真的不明白该怎么做。 ://
    • 所以你需要的是:“SamplerModule *module = dynamic_cast (parent);”然后使用“module->getT()”。如果 parent 实际上不是 SamplerModule,则动态转换将失败并返回空指针。您还需要阅读基类和派生类以及如何为每个类使用指针。这是一个重要的概念,如果没有很好地理解它,你会非常沮丧。 :)
    • 非常感谢!但在这种情况下,module 将是SamplerModule 的“新实例”,对吗?不是创建InstrumentSelector 的地方吗?因此,如果我需要获得在SamplerModule 的特定实例中设置的值,如果无法通过这种方式获得它?
    • 不,“模块”不是一个新实例; dynamic_cast 告诉编译器安全地确定父级是否实际上是一个 SamplerModule,然后给你一个指向同一个 SamplerModule 的指针。转换后,“父”和“模块”都指向同一个对象。
    • 如果“parent”具有有效值,并且 parent 派生自 SamplerModule,则 dynamic_cast 将返回非零值。如果 dynamic_cast 返回 0,那么您的父类实际上不是 SamplerModule 实例;这是另一回事。
    猜你喜欢
    • 1970-01-01
    • 2019-03-22
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    • 1970-01-01
    相关资源
    最近更新 更多