2014-08-27 44 views
0

昨天我被要求使用QML重新创建常规QT表单(这是我第一次尝试使用QLM)。一切都很顺利,直到我尝试在QML中使用C++方法。这显然不是原代码,但情况看起来是这样的:无法从QML访问C++ QOBject子类方法

我有一个超类从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; 
} 

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

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!");} 
} 

OK,就是它了!现在假设DerivedClass被实例化,然后在“DrvClass”的名称正确添加到QML上下文例子,我有一些QML控制等,其具有一个TextField“文本:”属性:

text: DrvClass.someProperty 

使用MasterClass的属性,它工作得很好。

text: DrvClass.printSomething() 

即使使用MasterClass中的虚拟方法,它在派生类中实现也能正常工作。但是...

text: DrvClass.someSpecificProperty 

不工作,我得到的东西,如 “无法将[未定义]到QString的

text: DrvClass.printSomethingSpecific() 

也不起作用! “TypeError:对象SuperClass()的属性'printSomethingSpecific'不是函数”奇怪的部分是它说它不是来自SuperClass的函数,而是实例化的类Derived one!

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

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

预先感谢投资在回答我的时间;-)

+0

您应该在**每个使用属性或可调用的** QObject子类中使用Q_OBJECT宏。顺便说一句,你的私人遗产是否有意识? – jbh 2014-08-27 10:48:05

+0

不,实际上是一个错字: -/ 我曾尝试在派生类中添加Q_OBJECT,但它在编译时抱怨某事......我不记得它是什么,但我认为它是关于虚拟表 是的,未定义的引用'vtable'int DerivedClass – RuiDo 2014-08-27 10:54:05

+0

你是如何通过setContextProperty完成类与QMContext的绑定的?哪个实例绑定到QML引擎,是派生的还是基类?你厌倦了使用派生的吗? – KimKulling 2014-08-27 11:01:08

回答

0

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

然后再简单地在您的项目上运行qmake &编译:它应该可以工作。

相关问题