Previous Entry Поделиться Next Entry
QtDbus
coder
olegy wrote in ru_qt4
Два дня отладки - лазанья в кишках QtDbus.
1. Выяснил, как передавать передавать свои типы данных по D-Bus (это не совсем тривиально, здесь хоть кто то объяснил)
2. Сделал типа такого
typedef QMap<QString, QVariant> VariantMap;
//---------------------------------------------------------------------------------
Q_DECLARE_METATYPE(VariantMap)
//---------------------------------------------------------------------------------
QDBusArgument &operator << (QDBusArgument &arg, const VariantMap &m);
const QDBusArgument &operator >> (const QDBusArgument &arg, VariantMap &m);
//---------------------------------------------------------------------------------
inline void  RegisterVariantMapTypes()
{
  qDBusRegisterMetaType<VariantMap>();
}

3. Сервер упорно отказывался принимать аргумент такого типа. При отладке поучалось что такой тип не зарегистрирован.
4. Выяснилось, что регистрируется тип QMap (кот. уже зарегистрирован), а адаптерный класс (QDBusAbstractAdaptor) не может получить id класса по имени "VariantMap".
Вылечилось только когда отказался от typedef (сделал наследника от QMap).

Вот такие вот грабли с темплейтами C++
UPD:
вот на что я наступил - bugreports.qt.nokia.com/browse/QTBUG-6833,
спасибо wecanstoptrain

  • 1
Одна из причин по которой Линус на C++ матерится. Как говорится, «лишь убогий рассудком может сказать что досконально знает C++, мудрец же поймёт — его не знает никто!» :)

Какой компилятор/платформа?

[oleg@olegstation ~]$ gcc --version
gcc (GCC) 4.1.2 20070626 (Red Hat 4.1.2-14)
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

[oleg@olegstation ~]$ uname -a
Linux olegstation 2.6.25.2 #3 SMP Fri May 9 17:40:18 EEST 2008 i686 i686 i386 GNU/Linux
[oleg@olegstation ~]$ qmake --version
QMake version 2.01a
Using Qt version 4.5.0 in /usr/local/Trolltech/Qt-4.5.0/lib

PS
То же самое на рабочей машине с G++ 4.2 и Qt 4.6
Думаю трабл заключается в механизме работы typedef

это проблема совместимости системы метатипов Qt и typedef.

Заключается в том, что при регистрации типа с помощью макроса Q_DECLARE_METATYPE инстанциируется структура из шаблона и проверяется наличие регистрации типа с помощью статичной переменной метода. Таким образом для типа, определенного с помощью typedef, происходит подстановка настоящего класса, который и был скрыт за конструкцией typedef. (см. Qt/qmetatype.h)

Бага пока не пофиксена. Но, возможно, в одном из будущих релизов это исправят.

http://bugreports.qt.nokia.com/browse/QTBUG-6833

  • 1
?

Log in