Russian Qt Forum

Qt => Общие вопросы => Тема начата: Авварон от Июль 30, 2010, 21:07



Название: qobject_cast не работает
Отправлено: Авварон от Июль 30, 2010, 21:07
Задался целью написать систему плагинов. Но вот беда - не могу скастать класс к IPlugin:
такой код:
Код:
TestPlugin::TestPlugin()
    : IPlugin()
{
    qDebug() << "TestPlugin::TestPlugin" << this->inherits("IPlugin")
            << qobject_cast<IPlugin*>(this);
}
печатает "TestPlugin::TestPlugin true QObject(0x0)". IPlugin живет в ExtensionSystem.dylib, TestPlugin - в TestPlugin.dylib (то есть я не могу скастать класс из 1й либы в другой. Внутри ExtensionSystem.dylib каст срабатывает). Где я не прав?
При этом динамик каст срабатывает и метаметоды IPlugin'а вызываются.
Использую cmake, может в этом дело? (хотя другой проект спокойно использует плагины)


Название: Re: qobject_cast не работает
Отправлено: ilyagoo от Июль 30, 2010, 21:44
Q_OBJECT в определении класса не забыл?


Название: Re: qobject_cast не работает
Отправлено: Авварон от Июль 30, 2010, 21:48
нет все на месте, мета методы же вызываются и инхеритс срабатывает
added: сделал проект на кумейке, там каст пашет. Идеи?


Название: Re: qobject_cast не работает
Отправлено: Sancho_s_rancho от Июль 30, 2010, 22:19
Вот одного я не пойму. Зачем в конструкторе плагинного класса приводить к интерфейсу. Это же делается в менеджере плагинов.


Название: Re: qobject_cast не работает
Отправлено: Авварон от Июль 30, 2010, 22:28
да, делается, но там не заработало (ЛибаА->ЛибаБ->ЛибаА) и я решил проверить более простой варинт (ЛибаА->ЛибаБ). Методом тыка выяснилсоь что либа сделанная симейком цепляется как плагин к бинарнику собранному кумейком. А вот симейковский бинарь кривой (что там вообще может быть такое??)
аддед: наврал, оба кривые


Название: Re: qobject_cast не работает
Отправлено: asvil от Июль 31, 2010, 06:25
Код:
# PLUGIN COMPILATION
add_definitions(-DQT_PLUGIN)
add_definitions(-DQT_NO_DEBUG)


Название: Re: qobject_cast не работает
Отправлено: Wicked_Digger от Июль 31, 2010, 07:48
qobject_cast будет работать только если IPlugin отнаследован от QObject, а это не так, насколько я понял.


Название: Re: qobject_cast не работает
Отправлено: Sancho_s_rancho от Июль 31, 2010, 11:45
Проще всего решить проблему заглянув в examples. Первый свой плагин писал с оглядкой на пример из Qt и с приведением не было проблем.


Название: Re: qobject_cast не работает
Отправлено: Авварон от Июль 31, 2010, 12:06
сказал же, тот же код собранный кумейком, работает

Филоненко Михаил
есть эти макросы, да и не в них дело

проблему решил - дело было в структуре папок (в кратце - почему-то qt4_wrap_cpp( MOC_SOURCES ${HEADERS} ) не занулял
MOC_SOURCES и ни брались дополнитьльно с верхнего уровня (и видимо оказывали влияние на линковку) Сделал так:
Код:
set( MOC_SOURCES "" )
qt4_wrap_cpp( MOC_SOURCES ${HEADERS} )
всё заработало... по-моему это шаманство:)


Название: Re: qobject_cast не работает
Отправлено: Sancho_s_rancho от Июль 31, 2010, 14:00
сказал же, тот же код собранный кумейком, работает
Извини, пропустил.

Кстати. я заметил странную тягу к CMake. Много проектов на Qt за каким-то прикручивают CMake. Просто прикручивают "чтобы было", а потом героически борются с возникшими трудностями. Одно время Qt-шники сами вроде грозились перейти на cmake. Но кроме заявлений и _базовой_ поддержки в креаторе я сдвигов не заметил. Так зачем все эти жертвы?


Название: Re: qobject_cast не работает
Отправлено: asvil от Июль 31, 2010, 17:40
Так зачем все эти жертвы?
1. Очень легко указывать что и куда инсталлировать, а потом и системо-зависимый инсталлятор создать. Да и деинсталляция не сложна.
2. Очень легко настроить что и куда собирать и с какими префиксами, постфиксами в зависимости от типа сброки (release, debug, ...).
3. Очень легко найти нужную библиотеку в системе, запустить нужную команду.
4. Можно использовать moc без лишних телодвижений. И для приватных слотов в том числе, когда сгенерированный мета-класс включается в единицу компляции исходного класса (#include "someclass.moc"). Может не правильно выразился...
5. Документированность гораздо лучше. А вот этот принцип Code Less. для qmake и не только не очень-то, на мой взгляд, хорош. Можно ли быстро в qmake проекте сделать генерацию исходных текстов или еще чего-либо и включить сгенерированные файлы в текущую цель (или отдельной библиотекой собрать)? А сами CMake'овцы рассказывают, показывают.

Из минусов только один мне встретившийся:
Нет красивой работы с файлами переводов.


Название: Re: qobject_cast не работает
Отправлено: Sancho_s_rancho от Август 01, 2010, 00:02
Так зачем все эти жертвы?
1. Очень легко указывать что и куда инсталлировать, а потом и системо-зависимый инсталлятор создать. Да и деинсталляция не сложна.
2. Очень легко настроить что и куда собирать и с какими префиксами, постфиксами в зависимости от типа сброки (release, debug, ...).
3. Очень легко найти нужную библиотеку в системе, запустить нужную команду.
4. Можно использовать moc без лишних телодвижений. И для приватных слотов в том числе, когда сгенерированный мета-класс включается в единицу компляции исходного класса (#include "someclass.moc"). Может не правильно выразился...
5. Документированность гораздо лучше. А вот этот принцип Code Less. для qmake и не только не очень-то, на мой взгляд, хорош. Можно ли быстро в qmake проекте сделать генерацию исходных текстов или еще чего-либо и включить сгенерированные файлы в текущую цель (или отдельной библиотекой собрать)? А сами CMake'овцы рассказывают, показывают.

Из минусов только один мне встретившийся:
Нет красивой работы с файлами переводов.
1. Что и куда программисту надо постоянно инсталлировать? Сиди и кодь потихоньку. Когда Программа готова: для виндовс  берем что-то типа nsis.sourceforge.net, для линукс готовим deb или rpm или что-то иное. Ни один вменяемый человек на линукс в обход менеджера пакетов идти не будет (т.е. ни каких configure/make/make install).
2. Не совсем понял. Если речь о дефайнах и условиях всяких,то это все есть в qmake. Если речь идет о том, как исполнимый файл назвать и куда запихнуть, то не интересовался особо. Вероятно это кому-то нужно.
3. Не понятно зачем системе сборки для вас искать какую-то библиотеку. Открываешь менеджер пакетов и говоришь ему установить devel пакет такой-то библиотеки. Это телодвижения разработчика. А пользователь просто ставит rpm или deb, в котором все зависимости должны быть указаны.
4. Не приходилось. Вероятно это кому-то нужно.
5. Не совсем понял.
Вы бы не могли какой-нибудь пример из жизни привести.


Название: Re: qobject_cast не работает
Отправлено: break от Август 01, 2010, 00:50
Цитировать
Так зачем все эти жертвы?

Обсуждалось сотню раз - главная причина более правильная работа с зависимостями - cmake сможет корректно определить какую часть сложного проекта надо пересобрать при изменении скажем h файла в одной из зависимых либ (а это изменение может быть очень плачевным т.к. размер структур может поменяться). Мы в своем проекте после перехода на cmake правктическ4и перестали делать полный rebuild - до этого это приходилось делать каждый раз после серьезных коммитов товарищей...

Подробнее о проблеме qmake профи с этого форума обсуждали здесь:
http://www.prog.org.ru/topic_11935_0.html
особенно начиная с этих постов
http://www.prog.org.ru/index.php?topic=11935.msg74785#msg74785
http://www.prog.org.ru/index.php?topic=11935.msg74806#msg74806
http://www.prog.org.ru/index.php?topic=11935.msg74841#msg74841
http://www.prog.org.ru/index.php?topic=11935.msg74851#msg74851
http://www.prog.org.ru/index.php?topic=11935.msg74861#msg74861

Так что переходить однозначно стоит (особенно для сложного проекта состоящего из большого количества подпроектов - просто либ и плагинов) - по своим ощущениям скажу работать в QtCreator хуже не стало - все абсолютно также, кроме того при грамотном подходе можно сделать так что файлы подпроектов будет организовывать очень удобно т.к. cmake целый язык со своими функциями - где можно устранять дублирование кода для подпроектов...


Название: Re: qobject_cast не работает
Отправлено: asvil от Август 01, 2010, 11:11
Пример из жизни, для пятого пункта.
Необходимо в процессе сборки проекта, сгенерировать классы-обертки для QtScript с помощью QtScriptGenerator. Затем включить полученные файлы в проект. Включать можно как в виде динамического/статического Qt плагина, так и непосредственно в получаемый runtime.

А собственно переформулированный пятый пункт: документация по qmake скудна.


Название: Re: qobject_cast не работает
Отправлено: Авварон от Август 01, 2010, 19:18
4. Можно использовать moc без лишних телодвижений. И для приватных слотов в том числе, когда сгенерированный мета-класс включается в единицу компляции исходного класса (#include "someclass.moc"). Может не правильно выразился...
[/quote]
по-подробнее плз, я как раз решения не нашел


Название: Re: qobject_cast не работает
Отправлено: asvil от Август 01, 2010, 19:34
по-подробнее плз, я как раз решения не нашел
Код:
# здесь c++ файлы содержащие include "*.moc"
set(Q_SOURCES)
# здесь заголовочные файлы не содержащие Q_OBJECT или содержащие Q_OBJECT, но файлы реализаций которых содержат include "*.moc"
set(HEADERS)

# здесь заголовочные файлы содержащие Q_OBJECT, и файлы реализаций которых НЕ содержат include "*.moc"
set(Q_HEADERS)

#Далее оборачиваем двумя способами:
#Для  Q_HEADERS
qt4_wrap_cpp(MOC_SOURCES ${Q_HEADERS})
#Для Q_SOURCES
qt4_automoc(${Q_SOURCES})
# добавляем диреекторию сборки в пути компилятора.
set(CMAKE_INCLUDE_CURRENT_DIR TRUE)
Сгенерированные *.moc файлы в cmake переменную сохранять не надо, так как они включаются в файлах реализаций. Важно добавить директорию сборки в пути для компилятора.


Название: Re: qobject_cast не работает
Отправлено: Авварон от Август 01, 2010, 20:09
а, ясно, я qt4_automoc неправильно использовал:) Спасибо