Могу ли я получить доступ к сигналам / слотам Qt объектов вне области видимости? - PullRequest
4 голосов
/ 14 ноября 2010

Соответствуют ли сигналы / слоты Qt объему родного C ++?

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

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

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

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

Ответы [ 3 ]

4 голосов
/ 14 ноября 2010

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

4 голосов
/ 14 ноября 2010

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

в доме,

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

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

1 голос
/ 15 ноября 2010

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

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

...