Russian Qt Forum
Ноябрь 24, 2024, 20:43
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Общие вопросы
>
Система динамических расширений (Qt plugins)
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Система динамических расширений (Qt plugins) (Прочитано 8537 раз)
mks
Гость
Система динамических расширений (Qt plugins)
«
:
Январь 04, 2013, 15:54 »
Добрый день.
Читая книгу "Qt 4.7+ Практическое программирование на С++" автор Боровский, в главе касающейся динамических расширений, наткнулся на такую фразу:
"Определения сигналов и слотов не должны быть частью интерфейса. Интерфейс - это набор обычных виртуальных методов С++ и ничего более". Но объяснений почему так, в этой книге нет. С другой стороны просматривая исходники проекта
rexloader
вижу что там в интерфейсах используются сигналы. Проект собирается и нормально работает. Объясните в чём тут загвоздка, и почему Боровский не рекомендует использовать сигналы в интерфейсе ?
Благодарю за внимание.
Записан
Vass
Гость
Re: Система динамических расширений (Qt plugins)
«
Ответ #1 :
Январь 04, 2013, 17:28 »
По определению
интерфейс
подразумевает лишь объявление некоторой сущности, не содержащие какой либо логики.
В С++ нет как такового понятия
интерфейс
, как например в Java.
Поэтому интерфейсом назывется класс, в котором все методы объявлены
чисто виртуальными
Отсюда следует что, чтобы интерфейс оставался интерфейсом, а не становился просто абстрактным классом, он может наследоваться только от другого
интерфейса.
Но!
Для того чтобы объявить и использовать сигналы и слоты, класс должен быть наследником
QObject
, а
QObject
- это вполне себе класс, причем даже не абстрактный.
Соответственно если вы наследуете "
интерфейс
" от
QObject
, то это уже и не интерфейс вовсе, а
абстрактный класс.
Конечно, вы можете использовать этот абстрактный класс в своем коде как родительский класс далее (как вы и увидели в проекте-примере), но формально это уже
не
интерфейс
.
Записан
mks
Гость
Re: Система динамических расширений (Qt plugins)
«
Ответ #2 :
Январь 04, 2013, 19:25 »
Спасибо, примерно так и предполагал.
Записан
Dancing_on_water
Гость
Re: Система динамических расширений (Qt plugins)
«
Ответ #3 :
Январь 04, 2013, 19:46 »
Может я все-таки не прав (давно было)
Но можно сделать такую штуку
Цитировать
class A
{
Q_OBJECT
//виртуальные методы
Q_SIGNALS:
void testSignal();
}
class B: public QObject, public A
{
Q_OBJECT
}
И далее юзать сигнал и это будет работать.
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Система динамических расширений (Qt plugins)
«
Ответ #4 :
Январь 04, 2013, 20:03 »
Цитата: Dancing_on_water от Январь 04, 2013, 19:46
И далее юзать сигнал и это будет работать.
moc пропустит класс A, т.к. он не является наследником QObject.
Записан
Dancing_on_water
Гость
Re: Система динамических расширений (Qt plugins)
«
Ответ #5 :
Январь 04, 2013, 20:32 »
мок не компилятор, для moc-а сигналом является макрос Q_OBJECT.
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Система динамических расширений (Qt plugins)
«
Ответ #6 :
Январь 05, 2013, 10:37 »
Цитата: Dancing_on_water от Январь 04, 2013, 20:32
мок не компилятор, для moc-а сигналом является макрос Q_OBJECT.
Теоретик? А ты попробуй.
И получишь от moc:
Error: Class contains Q_OBJECT macro but does not inherit from QObject
Записан
Bepec
Гость
Re: Система динамических расширений (Qt plugins)
«
Ответ #7 :
Январь 05, 2013, 10:41 »
Old прав, если класс не унаследован от QObject, никоим образом ты туда сигналы не впихнёшь.
Разве что переписать moc
Записан
Dancing_on_water
Гость
Re: Система динамических расширений (Qt plugins)
«
Ответ #8 :
Январь 05, 2013, 10:57 »
Цитата: Old от Январь 05, 2013, 10:37
Теоретик? А ты попробуй.
И получишь от moc:
Error: Class contains Q_OBJECT macro but does not inherit from QObject
Не, просто лень вчера вечером было пробывать.
М-да, действительно вылетает. Значит мне не то помнится.
Записан
lit-uriy
Джедай : наставник для всех
Offline
Сообщений: 3880
Re: Система динамических расширений (Qt plugins)
«
Ответ #9 :
Январь 06, 2013, 13:10 »
mks, к выше сказанному добавлю - moc не понимает виртуального наследования, т.е. если класс является дважды наследником (хоть и не прямым) одного и того же класса, например, QObject-а.
Например:
class Interfase: public QObject ... (ради сигналов и слотов в интерфейсе)
class Target : public QWidget, public Interfase ... (собственно конечный класс)
при том, что
class QWidget : public QObject ...
т.е Terget дважды наследник QObject-а получается, вот это мета-объектный компилятор не съест.
Записан
Юра.
mks
Гость
Re: Система динамических расширений (Qt plugins)
«
Ответ #10 :
Январь 06, 2013, 13:59 »
lit-uriy
понятно. В случае из первого сообщения нет двойного наследования, наверно поэтому проблем и нет. Всем спасибо за дискуссию
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...