У меня есть некоторые динамически добавленные QWidgets, и я хочу выполнить некоторые задачи, когда они будут изменены.
Я думаю, что не могу использовать connect (), потому что мне также нужно имя QWidget, которое вызвало изменение.
Как я также могу увидеть, какой QWidget был изменен, и все же перехватить событие изменения значения с помощью общего обработчика?
Быстрый и грязный способ — использовать connect () как обычно, а затем в методе вашего слота вызвать sender (), чтобы выяснить, какой объект отправил сигнал. Например:
// slot method that you've connected all of your widgets' stateChanged(int) signals to
void MyClass :: someWidgetsStateChanged(int newState)
{
const QObject * s = sender();
if (dynamic_cast<const QCheckBox *>(s) == _myFirstCheckbox) printf("First checkbox is now %s\n", newState?"Checked":"unchecked");
else if (dynamic_cast<const QCheckBox *>(s) == _mySecondCheckbox) printf("Second checkbox is now %s\n", newState?"Checked":"unchecked");
[... and so on...]
}
Обратите внимание, что причина, по которой это считается «грязным», заключается в том, что он нарушает инкапсуляцию. В частности, метод someWidgetsStateChanged (), описанный выше, теперь ведет себя по-разному в зависимости от того, какой объект сгенерировал сигнал, и, например, если, например, в какой-то момент в будущем вы подключите QPushButton :: clicked () (или что-либо еще) к тому же слоту, вам, вероятно, придется обновить реализацию someWidgetsStateChanged (), чтобы обработать ее соответствующим образом. Тем не менее, это работает и не требует больших усилий для реализации.
Используйте это для перехвата событий перед их передачей в экземпляры подкласса QObject:
http://qt-project.org/doc/qt-4.8/qobject.html#installEventFilter
После некоторых дополнительных размышлений я пришел к вопросу, почему бы не расширить эти контроллеры?
Чтобы я мог подключить их к родительскому объекту, используя parent () или пользовательский конструктор.
Это потенциально требует, хотя, чтобы я определял их как классы друзей …