Название: Кто послал сигнал в слот? Отправлено: radislav72 от Сентябрь 07, 2010, 10:01 Есть несколько виджетов, одинаковые сигналы которых подсоединены к одному слоту по принципу:
Код: connect(ui->cbMember, SIGNAL(editTextChanged(const QString &)), this, SLOT(formMembersList(const QString &))); Как узнать в слоте, от какого виджета пришел сигнал? QT 4.6.2, QT Creator Название: Re: Кто послал сигнал в слот? Отправлено: BRE от Сентябрь 07, 2010, 10:10 Посмотри на QObject::sender().
Название: Re: Кто послал сигнал в слот? Отправлено: Denjs от Сентябрь 07, 2010, 10:56 Как узнать в слоте, от какого виджета пришел сигнал? как написано выше - можно смотреть QObject::sender()QT 4.6.2, QT Creator но! Тролли пишут что данный путь нарушает "сигнал-слотовую-парадигму" . Кроме того, ссылка возвращаемая функцией будет "не валидна" в случае соединения объектов в разных потоках - смотрите Assistant. Цитировать Warning: As mentioned above, the return value of this function is not valid when the slot is called via a Qt::DirectConnection from a thread different from this object's thread. Do not use this function in this type of scenario. Потому - смотрите класс QSignalMapper, задача которого собственно и есть в том, что бы идентифицировать каждого из отправителей. Или меняйте "дизайн" - добавьте в сигнатуру слота поле идентифицирующее отправителя. Название: Re: Кто послал сигнал в слот? Отправлено: NicK от Сентябрь 07, 2010, 12:07 Код
Название: Re: Кто послал сигнал в слот? Отправлено: radislav72 от Сентябрь 07, 2010, 12:34 А как лучше поступить исходя из специфики программирования в QT? Через QObject::sender(), или используя QSignalMapper ?
Название: Re: Кто послал сигнал в слот? Отправлено: Karl-Philipp от Сентябрь 07, 2010, 15:21 А как лучше поступить исходя из специфики программирования в QT? Через QObject::sender(), или используя QSignalMapper ? Тут, наверное, лучше исходить из специфики вашей программы. Denjs процитировал и перевел, когда не стоит использовать QObject::sender().Название: Re: Кто послал сигнал в слот? Отправлено: SABROG от Сентябрь 08, 2010, 07:25 Denjs процитировал и перевел, когда не стоит использовать QObject::sender(). Только не совсем корректно...Цитировать object-oriented principle of modularity а не Цитировать "сигнал-слотовую-парадигму" Да и ссылка будет валидна в большенстве случаев даже, когда объекты будут находится в разных потоках. Там же написано, что проблема может быть только при Qt::DirectConnection. По умолчанию всегда передается Qt::AutoConnection, а это значит что для соединения объектов из разных потоков будет автоматически выбрано Qt::QueuedConnection соединение. Название: Re: Кто послал сигнал в слот? Отправлено: radislav72 от Сентябрь 08, 2010, 07:46 Спасибо всем за разяснения. Реализовал через QObject::sender()... вроде как быстрее (с точки зрения набирания кода :))
|