昨天我被要求使用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「查看」它? 或者這只是缺乏經驗的成果,我在某處做了一個愚蠢的錯誤?
預先感謝投資在回答我的時間;-)
您應該在**每個使用屬性或可調用的** QObject子類中使用Q_OBJECT宏。順便說一句,你的私人遺產是否有意識? – jbh 2014-08-27 10:48:05
不,實際上是一個錯字: -/ 我曾嘗試在派生類中添加Q_OBJECT,但它在編譯時抱怨某事......我不記得它是什麼,但我認爲它是關於虛擬表 是的,未定義的引用'vtable'int DerivedClass – RuiDo 2014-08-27 10:54:05
你是如何通過setContextProperty完成類與QMContext的綁定的?哪個實例綁定到QML引擎,是派生的還是基類?你厭倦了使用派生的嗎? – KimKulling 2014-08-27 11:01:08