2010-11-14 2 views
4

Должны ли сигналы/слоты Qt следовать за областью C++?Могу ли я получить доступ к сигналам/слотам Qt из объектов?

Скажем, у меня есть следующие классы: дом, кухня, подвал, Плита и Полка.

class House {Kitchen kitchen, Cellar cellar;}; 
class Kitchen {Stove stove;}; 
class Cellar {Shelf shelf;}; 

Теперь я хочу отправить сигнал с полки в подвал к плите на кухне. Это единственный способ сделать это, подключив сигнал от полки к подвалу и слот от кухни до печи, а затем в доме, соединяющем подвал и кухню? Или есть способ сделать это напрямую?

У меня есть класс, который должен связываться с пользовательским интерфейсом, и мне интересно, нужно ли мне «проксировать» все различные сигналы/слоты через промежуточные классы. Или это показатель плохого дизайна?

+0

Если кто-то ответил на ваш вопрос с ответом, который вам помог, отметьте его как правильный ответ. – g19fanatic

ответ

3

Вы можете установить соединение любым способом дома, так как там вы можете получить доступ к обоим объектам. «Соединитель» должен иметь доступ как к отправителю, так и к приемнику во время компиляции, это все, что ему нужно.

3

Вы должны быть в состоянии просто связать сигнал от экземпляра полки к экземпляру Печное

в доме,

connect(cellar->shelf,SIGNAL(signalHere()),kitchen->stove,SLOT(slotHere()));

просто убедитесь, что shelf и stove общественные переменные в Kitchen и Cellar и вы будете установлены

+0

Они не являются публичными. – problemofficer

+3

@problemofficer: Он ответил на ваш вопрос: «Есть ли способ сделать это прямо?». Да, вы можете сделать это напрямую, сделав подобъекты доступными. Вы можете сделать это, сделав их общедоступными, объявив классы друзей, написав функцию, которая возвращает указатель или ссылку и т. Д. –

+0

@problemofficer: поскольку полка и плита не являются общедоступными, вам нужно сделать больше для настройки соединения. Вам нужно будет установить соединение из двух сигналов: от сигнала в доме до сигнала на кухне и одного из этого сигнала на кухне до слота в печи. То же самое для полки и подвала. Пример: «Дом» connect (это, СИГНАЛ (полученныйSignalFromCellar()), кухня, SIGNAL (send2Stove())); 'Кухня' connect (это, СИГНАЛ (send2Stove()), полка, SLOT (переданоThroughKitchen())); ' – g19fanatic

1

Вы не можете использовать сигналы/слоты для классов, которые не являются QObjects, поэтому нет, ваш пример не будет работать вообще.

Вы можете обойти инкапсуляцию, если вы инициализируете дочерние объекты своим родительским объектом, поэтому вы можете сделать грязным трюками вроде: connect(this->shelf, SIGNAL(signalHere()), kitchen->children()[0], SLOT(aStoveSlot())). однако это будет работать только в том случае, если первый ребенок кухни - это действительно Плита ... так что, поскольку это очевидная зависимость, вы должны сделать это видимым, сделав печью общедоступной, или добавив метод доступа к печи.

+0

Это был просто пример. Фактический класс наследует QObject. Спасибо за грязный трюк. – problemofficer

+0

Тем не менее, я думаю, что это разъяснение важно. –