Генерация классов Qt Q_OBJECT прагматично - PullRequest
1 голос
/ 01 декабря 2010

Как можно создать класс, основанный на Q_OBJECT (класс с сигналами и / или слотами), с помощью метапрограммирования?Мне все равно, являются ли они шаблонами или препроцессором, ни один из них не работает, и мне это действительно нужно.

Я хочу иметь возможность связывать произвольные функции, подобные вещам, с сигналами Qt.Сигналы Qt на это не способны, сигналы буста есть.Итак, мне нужен объект Qt, который может подключиться к сигналу Qt и просто перенаправить его на сигнал повышения.Мне нужно сделать это кучу, так что было бы неплохо автоматизировать.

Основная проблема, как представляется, - не большой сюрприз - процессор moc.Он не понимает базовую предварительную обработку (кроме ifs) и, очевидно, также не может выполнять шаблоны классов.

Есть идеи?

1 Ответ

1 голос
/ 01 декабря 2010

Вот что я обнаружил в системе 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

... и это просто совершенно недостаточно для этой задачи.Иногда ответы людей вызывают у меня удивление.

К сожалению, конечно, вся эта магия во многом зависит от используемой версии МОК.


У меня естьнашел лучший, более простой способ сделать это.Я начал серию статей в блоге о создании этого монстра.См http://crazyeddiecpp.blogspot.com/2011/01/quest-for-sane-signals-in-qt-step-1.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...