Russian Qt Forum
Февраль 10, 2012, 15:43
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Общие вопросы
(Модератор:
Sergeich
) >
qobject_cast не работает
Страниц: [
1
]
2
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: qobject_cast не работает (Прочитано 1548 раз)
Авварон
phpBB Neo
Offline
Сообщений: 1778
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, может в этом дело? (хотя другой проект спокойно использует плагины)
«
Последнее редактирование: Июль 30, 2010, 21:28 от Авварон
»
Записан
ilyagoo
Самовар
Offline
Сообщений: 150
Re: qobject_cast не работает
«
Ответ #1 :
Июль 30, 2010, 21:44 »
Q_OBJECT в определении класса не забыл?
Записан
Авварон
phpBB Neo
Offline
Сообщений: 1778
Re: qobject_cast не работает
«
Ответ #2 :
Июль 30, 2010, 21:48 »
нет все на месте, мета методы же вызываются и инхеритс срабатывает
added: сделал проект на кумейке, там каст пашет. Идеи?
«
Последнее редактирование: Июль 30, 2010, 22:04 от Авварон
»
Записан
Sancho_s_rancho
Бывалый
Offline
Сообщений: 451
Re: qobject_cast не работает
«
Ответ #3 :
Июль 30, 2010, 22:19 »
Вот одного я не пойму. Зачем в конструкторе плагинного класса приводить к интерфейсу. Это же делается в менеджере плагинов.
Записан
http://www.ekimoff.com
http://www.qtinfo.ru
Авварон
phpBB Neo
Offline
Сообщений: 1778
Re: qobject_cast не работает
«
Ответ #4 :
Июль 30, 2010, 22:28 »
да, делается, но там не заработало (ЛибаА->ЛибаБ->ЛибаА) и я решил проверить более простой варинт (ЛибаА->ЛибаБ). Методом тыка выяснилсоь что либа сделанная симейком цепляется как плагин к бинарнику собранному кумейком. А вот симейковский бинарь кривой (что там вообще может быть такое??)
аддед: наврал, оба кривые
«
Последнее редактирование: Июль 30, 2010, 22:35 от Авварон
»
Записан
Филоненко Михаил
Бывалый
Offline
Сообщений: 472
Re: qobject_cast не работает
«
Ответ #5 :
Июль 31, 2010, 06:25 »
Код:
# PLUGIN COMPILATION
add_definitions(-DQT_PLUGIN)
add_definitions(-DQT_NO_DEBUG)
Записан
skype: filonenko.mikhail
Wicked_Digger
Новичок
Offline
Сообщений: 33
Re: qobject_cast не работает
«
Ответ #6 :
Июль 31, 2010, 07:48 »
qobject_cast будет работать только если IPlugin отнаследован от QObject, а это не так, насколько я понял.
Записан
Sancho_s_rancho
Бывалый
Offline
Сообщений: 451
Re: qobject_cast не работает
«
Ответ #7 :
Июль 31, 2010, 11:45 »
Проще всего решить проблему заглянув в examples. Первый свой плагин писал с оглядкой на пример из Qt и с приведением не было проблем.
Записан
http://www.ekimoff.com
http://www.qtinfo.ru
Авварон
phpBB Neo
Offline
Сообщений: 1778
Re: qobject_cast не работает
«
Ответ #8 :
Июль 31, 2010, 12:06 »
сказал же, тот же код собранный кумейком, работает
Филоненко Михаил
есть эти макросы, да и не в них дело
проблему решил - дело было в структуре папок (в кратце - почему-то qt4_wrap_cpp( MOC_SOURCES ${HEADERS} ) не занулял
MOC_SOURCES и ни брались дополнитьльно с верхнего уровня (и видимо оказывали влияние на линковку) Сделал так:
Код:
set( MOC_SOURCES "" )
qt4_wrap_cpp( MOC_SOURCES ${HEADERS} )
всё заработало... по-моему это шаманство:)
«
Последнее редактирование: Июль 31, 2010, 12:42 от Авварон
»
Записан
Sancho_s_rancho
Бывалый
Offline
Сообщений: 451
Re: qobject_cast не работает
«
Ответ #9 :
Июль 31, 2010, 14:00 »
Цитата: Авварон от Июль 31, 2010, 12:06
сказал же, тот же код собранный кумейком, работает
Извини, пропустил.
Кстати. я заметил странную тягу к CMake. Много проектов на Qt за каким-то прикручивают CMake. Просто прикручивают "чтобы было", а потом героически борются с возникшими трудностями. Одно время Qt-шники сами вроде грозились перейти на cmake. Но кроме заявлений и _базовой_ поддержки в креаторе я сдвигов не заметил. Так зачем все эти жертвы?
Записан
http://www.ekimoff.com
http://www.qtinfo.ru
Филоненко Михаил
Бывалый
Offline
Сообщений: 472
Re: qobject_cast не работает
«
Ответ #10 :
Июль 31, 2010, 17:40 »
Цитата: Sancho_s_rancho от Июль 31, 2010, 14:00
Так зачем все эти жертвы?
1. Очень легко указывать что и куда инсталлировать, а потом и системо-зависимый инсталлятор создать. Да и деинсталляция не сложна.
2. Очень легко настроить что и куда собирать и с какими префиксами, постфиксами в зависимости от типа сброки (release, debug, ...).
3. Очень легко найти нужную библиотеку в системе, запустить нужную команду.
4. Можно использовать moc без лишних телодвижений. И для приватных слотов в том числе, когда сгенерированный мета-класс включается в единицу компляции исходного класса (#include "someclass.moc"). Может не правильно выразился...
5. Документированность гораздо лучше. А вот этот принцип Code Less. для qmake и не только не очень-то, на мой взгляд, хорош. Можно ли быстро в qmake проекте сделать генерацию исходных текстов или еще чего-либо и включить сгенерированные файлы в текущую цель (или отдельной библиотекой собрать)? А сами CMake'овцы рассказывают, показывают.
Из минусов только один мне встретившийся:
Нет красивой работы с файлами переводов.
Записан
skype: filonenko.mikhail
Sancho_s_rancho
Бывалый
Offline
Сообщений: 451
Re: qobject_cast не работает
«
Ответ #11 :
Август 01, 2010, 00:02 »
Цитата: Филоненко Михаил от Июль 31, 2010, 17:40
Цитата: Sancho_s_rancho от Июль 31, 2010, 14:00
Так зачем все эти жертвы?
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. Не совсем понял.
Вы бы не могли какой-нибудь пример из жизни привести.
«
Последнее редактирование: Август 01, 2010, 08:18 от Sancho_s_rancho
»
Записан
http://www.ekimoff.com
http://www.qtinfo.ru
break
Супер активный житель
Offline
Сообщений: 740
Re: qobject_cast не работает
«
Ответ #12 :
Август 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 целый язык со своими функциями - где можно устранять дублирование кода для подпроектов...
«
Последнее редактирование: Август 01, 2010, 01:00 от break
»
Записан
Филоненко Михаил
Бывалый
Offline
Сообщений: 472
Re: qobject_cast не работает
«
Ответ #13 :
Август 01, 2010, 11:11 »
Пример из жизни, для пятого пункта.
Необходимо в процессе сборки проекта, сгенерировать классы-обертки для QtScript с помощью QtScriptGenerator. Затем включить полученные файлы в проект. Включать можно как в виде динамического/статического Qt плагина, так и непосредственно в получаемый runtime.
А собственно переформулированный пятый пункт: документация по qmake скудна.
Записан
skype: filonenko.mikhail
Авварон
phpBB Neo
Offline
Сообщений: 1778
Re: qobject_cast не работает
«
Ответ #14 :
Август 01, 2010, 19:18 »
4. Можно использовать moc без лишних телодвижений. И для приватных слотов в том числе, когда сгенерированный мета-класс включается в единицу компляции исходного класса (#include "someclass.moc"). Может не правильно выразился...
[/quote]
по-подробнее плз, я как раз решения не нашел
Записан
Страниц: [
1
]
2
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> Печать
=> Интернационализация, локализация
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
=> Архив
===> Программирование
=====> Python
===> Веб программирование
=====> PHP, PERL, CGI
Загружается...