昨天我被要求使用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“看到”它? 或者这只是缺乏经验的结果,我在某处犯了一个愚蠢的错误?
答案 0 :(得分:1)
DerivedClass
缺少Q_OBJECT
宏(它不会被继承!)。
然后只需在您的项目上再次运行qmake
&编译:它应该工作。