Здравствуйте, гость ( Вход | Регистрация )
Obey-Kun | Дата 3.4.2010, 4:11 |
Цитата при таком подходе тебе нужно будет сделать видимым объявление перечисления внутри класса дочернего объекта. Так ведь в любом случае надо делать объявление перечисления видимым как минимум в MainWindow (он испускает сигнал) и во Вью (там слот). У меня enum объявлен в файле с константнами, типа того: Раскрывающийся текст
Ну а файл с константами подключается там, где надо. Так что не страшно. Кстати, всё почему-то заработало без ковыряния с Q_ENUMS. |
|
Litkevich Yuriy | Дата 3.4.2010, 4:03 |
при таком подходе тебе нужно будет сделать видимым объявление перечисления внутри класса дочернего объекта. Инкапсуляция похоронена заживо. А самое главное - похоронена концепция компонентного подхода (предоставляемая сигналами и слотами), т.к. компонент стал жёстко зависеть от конкретного includ'а можно конечно отказатся от объявления в сигнале и слоте перечисления и использовать int, но тогда контроль области определения функции (диаппазона изменения int'а) будешь делать своими глазами |
|
Obey-Kun | Дата 3.4.2010, 3:56 |
Цитата ну слот - функция, просто в отличие от функции-члена класса с ним можно связать сигнал. Да я знаю. Просто по-хорошему в моём случае слот можно сделать приватным и коннектить к нему сигнал пэрента в конструкторе. Это ради нормальной инкапсуляции и всё такое. |
|
Litkevich Yuriy | Дата 3.4.2010, 3:46 |
тогда слот придётся делать публичным... так точно обычно делают? ну слот - функция, просто в отличие от функции-члена класса с ним можно связать сигнал.А часть функций реализуют публичное API класса. Например: QLabel::setText() - открытый слот |
|
Obey-Kun | Дата 3.4.2010, 3:28 |
Цитата вообще соединять в дочернем объекте сигнал родителя - плохая идея, т.к., как минимум, при чтении кода, сначала читается код верхнего, по иерархии, объекта. И лишь при возникновении непонимания лезишь внутрь дочернего. Поэтому такое соединение нужно делать в родительском объекте. Вот-вот . Теперь всегда буду так делать. но с другой стороны, тогда слот придётся делать публичным... так точно обычно делают? |
|
Litkevich Yuriy | Дата 3.4.2010, 3:26 |
мало того объявления родительского сигнала в дочернем объекте не видно, обычно. Наверное это и есть причина ошибки. Дело в том, что компилятор не контролирует соединение | |
Obey-Kun | Дата 3.4.2010, 3:26 |
Экспериментировал. В MainWindow было:
Ясен пень, что connect(parent, SIGNAL(signalToolChosen(QFrost::ToolType)), SLOT(slotSetTool(QFrost::ToolType))); в конструкторе Area как надо не работало, ведь создавалось оно без родительского виджета, а потом уже он назначался. Исправил на:
Разумеется, всё заработало. |
|
Litkevich Yuriy | Дата 3.4.2010, 3:24 |
QObject::connect: Cannot connect (null)::signalToolC... проблему выделил жирным. Т.е. неизвестно какому классу принадлежит функцияconnect(parent, SIGNAL(signalToolChosen(QFrost::ToolType)), вообще соединять в дочернем объекте сигнал родителя - плохая идея, т.к., как минимум, при чтении кода, сначала читается код верхнего, по иерархии, объекта. И лишь при возникновении непонимания лезишь внутрь дочернего.SLOT(slotSetTool(QFrost::ToolType))); Поэтому такое соединение нужно делать в родительском объекте. |
|
Obey-Kun | Дата 3.4.2010, 3:17 |
я балбес, декларэйшн не написал теперь заработало и я не свой объект передаю, а енумную фигню спасибо Кстати, правлильная ошибка из-за отсутствия соответствующих макросов выглядит примерно так:
добавил Q_ENUMS(QFrost::ToolType) после макроса Q_OBJECT в хедерах классов, где енум надо использовать в системе сигналов-слотов, но это не помогло... как надо-то? странно... смотрите, сейчас сделано так:
И ругается
Если заставить этот connect выполняться попозже, то всё ок, коннект проходит и всё работает. Есть идеи? |
|
Litkevich Yuriy | Дата 3.4.2010, 2:22 |
вообще-то ошибки компиляции быть не должно, просто соединение может не установиться. Покажи полностью объявление класса, в котором объявлен слот pickInstrument вообще существуем много всяких примочек в Qt, чтобы зарегестрировать свои типы данных: Q_ENUMS Q_DECLARE_METATYPE qRegisterMetaType() ... |
|
Просмотр темы полностью (откроется в новом окне) | |
Текстовая версия | Сейчас: 29.3.2024, 3:54 |