Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: radislav72 от Сентябрь 07, 2010, 10:01



Название: Кто послал сигнал в слот?
Отправлено: 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
Как узнать в слоте, от какого виджета пришел сигнал?
QT 4.6.2, QT Creator
как написано выше - можно смотреть QObject::sender()
но! Тролли пишут что данный путь нарушает "сигнал-слотовую-парадигму" . Кроме того, ссылка возвращаемая функцией будет "не валидна" в случае соединения объектов в разных потоках - смотрите 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
Код
C++ (Qt)
...
 
QObject* obj=QObject::sender();
if (QToolButton *tb=qobject_cast<QToolButton *>(obj)){
qDebug()<<tb->objectName();
...
 
}
 
...


Название: 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()... вроде как быстрее (с точки зрения набирания кода :))