2010-12-01 99 views
1

如何通過元編程來製作基於Q_OBJECT的類(具有信號和/或插槽的類)?我不在乎它是模板還是預處理器,既不可行,也非常需要它。實際生成Qt Q_OBJECT類

我想要的是能夠像Qt信號一樣綁定任意函數。 Qt信號是不可能的,升壓信號是。所以,我需要一個Qt對象,它可以連接到一個Qt信號,並簡單地將它轉發給一個升壓信號。我需要這麼做,所以自動化會很好。

主要問題似乎是 - 毫無意外 - moc處理器。它不瞭解基本的預處理(ifs除外),顯然也不能做模板類。

任何想法?

+0

根據我的經驗,使用模板和QObject進行任何操作都很麻煩。我只能想象它將如何改變我們的問題。 – 2010-12-01 00:07:44

回答

1

這就是我所發現的有關Qt的MOC系統:

使用一些http://www.codeproject.com/KB/cross-platform/qt_reversing.aspx ...

因爲我知道,生成的對象都將有一個單一的插槽,並沒有別的(就是這樣)用預處理器生成moc內容應該是可能的,雖然也許很困難。

qt_moc_data _ ??? []數組中的大部分信息都可以進行硬編碼。唯一感興趣的線條似乎是插槽,只有一個。其餘的可以是{ 5, 0,0,0,1,14,0,0,0,0,0,0,0,0 ... slot line ...., 0}

槽線描述在上面的鏈接。

qt_moc_stringdata _ ???需要是這樣的:#object_name "\0\0" (param > 1 ? param-1:0 count commas) "\0" #functionname #paramtypelist

我相信所有這些都可以用預處理器生成。棘手的部分將是插槽線必須包含數字,以提供索引到qt_moc_stringdata _ ???

還有一些需要生成的函數,以及一個QMetaClass類型的變量或其他東西......除了調用者必須重新解析所有參數之外,大多數東西應該是相當直接的。

儘管如此,我相信預處理器可以生成它的全部內容,而且這似乎是唯一的方法。我從qtcenter論壇得到的唯一幫助是使用方法:

#ifdef MYCLASS 
struct myclass : QObject 
{ 
    ... a QObject definition... 
}; 
#endif 

...這只是普通的完全不足以任務。有時候人們給的答案讓我感到驚訝。

不幸的是,所有這些魔法都將取決於所使用的moc版本。


我發現了一個更好,更簡單的方法來實現此目的。我已經開始撰寫關於創建這個怪物的博客文章系列。請參閱http://crazyeddiecpp.blogspot.com/2011/01/quest-for-sane-signals-in-qt-step-1.html