Russian Qt Forum
Ноябрь 24, 2024, 18:39 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Система динамических расширений (Qt plugins)  (Прочитано 8531 раз)
mks
Гость
« : Январь 04, 2013, 15:54 »

Добрый день.
Читая книгу "Qt 4.7+ Практическое программирование на С++" автор Боровский, в главе касающейся динамических расширений, наткнулся на такую фразу:
"Определения сигналов и слотов не должны быть частью интерфейса. Интерфейс - это набор обычных виртуальных методов С++ и ничего более". Но объяснений почему так, в этой книге нет. С другой стороны просматривая исходники проекта rexloader вижу что там в интерфейсах используются сигналы. Проект собирается и нормально работает. Объясните в чём тут загвоздка, и почему Боровский не рекомендует использовать сигналы в интерфейсе ?
Благодарю за внимание.
Записан
Vass
Гость
« Ответ #1 : Январь 04, 2013, 17:28 »

По определению интерфейс подразумевает лишь объявление некоторой сущности, не содержащие какой либо логики.
В С++ нет как такового понятия интерфейс, как например в Java.
Поэтому интерфейсом назывется класс, в котором все методы объявлены чисто виртуальными
Отсюда следует что, чтобы интерфейс оставался интерфейсом, а не становился просто абстрактным классом, он может наследоваться только от другого
интерфейса.
Но! Для того чтобы объявить и использовать сигналы и слоты, класс должен быть наследником QObject, а QObject - это вполне себе класс, причем даже не абстрактный.
Соответственно если вы наследуете "интерфейс" от QObject, то это уже и не интерфейс вовсе, а абстрактный класс.

Конечно, вы можете использовать этот абстрактный класс в своем коде как родительский класс далее (как вы и увидели в проекте-примере), но формально это уже не интерфейс.
Записан
mks
Гость
« Ответ #2 : Январь 04, 2013, 19:25 »

Спасибо, примерно так и предполагал.
Записан
Dancing_on_water
Гость
« Ответ #3 : Январь 04, 2013, 19:46 »

Может я все-таки не прав (давно было)

Но можно сделать такую штуку

Цитировать
class A
{
  Q_OBJECT
//виртуальные методы
 Q_SIGNALS:
 void testSignal();
}

class B: public QObject, public A
{
  Q_OBJECT
}
И далее юзать сигнал и это будет работать.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #4 : Январь 04, 2013, 20:03 »

И далее юзать сигнал и это будет работать.
moc пропустит класс A, т.к. он не является наследником QObject.
Записан
Dancing_on_water
Гость
« Ответ #5 : Январь 04, 2013, 20:32 »

мок не компилятор, для moc-а сигналом является макрос Q_OBJECT.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #6 : Январь 05, 2013, 10:37 »

мок не компилятор, для moc-а сигналом является макрос Q_OBJECT.
Теоретик? А ты попробуй. Улыбающийся
И получишь от moc:
Error: Class contains Q_OBJECT macro but does not inherit from QObject
Записан
Bepec
Гость
« Ответ #7 : Январь 05, 2013, 10:41 »

Old прав, если класс не унаследован от QObject, никоим образом ты туда сигналы не впихнёшь.

Разве что переписать moc Веселый
Записан
Dancing_on_water
Гость
« Ответ #8 : Январь 05, 2013, 10:57 »

Теоретик? А ты попробуй. Улыбающийся
И получишь от moc:
Error: Class contains Q_OBJECT macro but does not inherit from QObject

Не, просто лень вчера вечером было пробывать.  Смеющийся

М-да, действительно вылетает. Значит мне не то помнится.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #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
Гость
« Ответ #10 : Январь 06, 2013, 13:59 »

lit-uriy понятно. В случае из первого сообщения нет двойного наследования, наверно поэтому проблем и нет. Всем спасибо за дискуссию  Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.142 секунд. Запросов: 23.