Qt "подстановочный знак" в сигналах подключения - PullRequest
2 голосов
/ 05 марта 2012

В Qt можно подключить сигнал к слоту, используя:

connect(x, SIGNAL(S()), y, SLOT(func()));

Где x и y - указатели на экземпляры класса, который наследуется от QObject.

Я ищудля чего-то вроде:

connect(*, SIGNAL(S()), y, SLOT(func()));

, который соединит любого, кто посылает сигнал S, в слот func () of y.Или:

connect(C, SIGNAL(S()), y, SLOT(func()));

, где C разработает класс (не только экземпляр), так что все сигналы S, излучаемые любым экземпляром C, будут подключены.

Я предполагаю, что это должно бытьможно также использовать эти «символы подстановки» вместо «y»:

connect (x, SIGNAL(S()), C, SLOT(func()));

соединит сигнал S экземпляра x с любым экземпляром класса C

Как это сделать в Qt

Ответы [ 3 ]

1 голос
/ 05 марта 2012

Я полагаю, почему не существует магического подстановочного подхода к подключению всех сигналов от экземпляров класса к слоту, потому что класс должен будет отслеживать все свои экземпляры, чтобы перебирать их и устанавливать соединение. И выполнение соединения после того, как был сделан этот вызов, потребовало бы, чтобы класс установил что-то в конец своего конструктора, чтобы будущие экземпляры также получили соединение. В общем, это было бы вопросом, если бы вы создали подкласс класса и добавили его в конструктор. Если вы не знаете слот во время создания, вам нужно будет, чтобы класс отслеживал экземпляры, чтобы впоследствии вы могли вызвать свой собственный метод соединения с подстановочным сигнальным слотом.

0 голосов
/ 05 марта 2012

Ответ во многом зависит от того, находится ли данный класс под вашим контролем или нет. Невозможно выполнить подстановочный знак в точности так, как вы описали, но вы можете получить тот же эффект, используя фильтры событий (для класса, который вам не принадлежит) или изменив класс так, чтобы он излучал определенный сигнал при каждом получении любого сигнала. (если это ваше). Если ни одна из этих работ не работает, обертывание существующего класса может позволить вам добавить необходимую функцию.

Короче говоря, общего решения не существует, поэтому сообщите нам более подробную информацию о конкретной ситуации.

0 голосов
/ 05 марта 2012

Есть ли причина, по которой вы этого не делаете в конструкторе соответствующих классов? Каждый раз, когда вы хотите что-то сделать для всех экземпляров класса, это хорошее место для начала. Пусть конструктор возьмет указатель на объект с сигналом (или слотом) и установит соединение обычным способом - с указателем this вместо x или y.

...