无法从QML访问C ++ QObject子类方法

时间:2014-08-27 10:30:41

标签: c++ qt qml qobject

昨天我被要求使用QML重新创建常规QT表单(这是我第一次尝试使用QLM)。一切顺利,直到我尝试在QML中使用c ++方法。这显然不是原始代码,但场景看起来像这样:

我有一个从QObject派生的超类,有一些属性,方法甚至虚拟方法:

class SuperClass : public QObject {
    Q_OBJECT
    Q_PROPERTY(QString someProperty READ someProperty WRITE setSomeProperty)

protected:
    QString m_someProperty;

public:
    QString someProperty(void){return m_someProperty;}  //get method
    void setSomeProperty(QString newValue){m_someProperty = newValue;}  //set method
    Q_INVOKABLE virtual QString printSomething(void) = 0;
}

然后我有一个派生自SuperClass的类(如专业化),它有一些更具体的属性和方法,当然还有虚拟方法实现和东西:

class DerivedClass : public SuperClass {
Q_PROPERTY(QString someSpecificProperty READ someSpecificProperty WRITE setSomeSpecificProperty)

private:
    QString m_someSpecificProperty;

public:
    QString specificProperty(void){return m_someSpecificProperty;}  //get method
    void someSpecificProperty(QString newValue){m_someSpecificProperty = newValue;}  //set method
    QString printSomething(void){return QString("Something!");}  //SuperClass virtual method
    Q_INVOKABLE QString printSomethingSpecific(void){return QString("Something Specific!");}
}

好的,就是这样!现在假设 DerivedClass 被实例化并以“DrvClass”的名称正确添加到QML上下文中,并且我有一些QML控件,如TextField,它具有'text:'属性:

text: DrvClass.someProperty

使用MasterClass'属性,它可以正常工作。

text: DrvClass.printSomething()

即使使用MasterClass中的虚拟方法,也可以在派生类中实现。但...

text: DrvClass.someSpecificProperty

不起作用,我得到类似“无法将[undefined]分配给QString

text: DrvClass.printSomethingSpecific()

也行不通! “ TypeError:对象SuperClass()的属性'printSomethingSpecific'不是函数”而奇怪的部分是它表示它不是来自SuperClass的函数,而是实例化的类Derived one! / p>

我已经找到了类似的错误,但大部分时间都来自那些忘记包含Q_OBJECT宏的人...我的确在那里! 似乎QML不喜欢从QObject派生的其他类派生的很多类: - /可能与元对象编译器有关,它只查找可调用的方法,它找到Q_OBJECT宏而不是它的子类! / p>

那么你们认为解决方案可能是什么? 我可以将Q_OBJECT宏添加到DerivedClasses而不是SuperClass,但由于信号和东西,我真的需要SuperClass作为QObject!那么是否有一些其他的宏我必须添加到DerivedClass中以使moc“看到”它? 或者这只是缺乏经验的结果,我在某处犯了一个愚蠢的错误?

1 个答案:

答案 0 :(得分:1)

DerivedClass缺少Q_OBJECT宏(它不会被继承!)。

然后只需在您的项目上再次运行qmake&编译:它应该工作。