2014-08-27 90 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 &編譯:它應該可以工作。