Russian Qt Forum
Сентябрь 21, 2024, 17:56 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Кто послал сигнал в слот?  (Прочитано 16660 раз)
radislav72
Гость
« : Сентябрь 07, 2010, 10:01 »

Есть несколько виджетов, одинаковые сигналы которых подсоединены к одному слоту по принципу:
Код:
connect(ui->cbMember, SIGNAL(editTextChanged(const QString &)), this, SLOT(formMembersList(const QString &)));

Как узнать в слоте, от какого виджета пришел сигнал?

QT 4.6.2, QT Creator
Записан
BRE
Гость
« Ответ #1 : Сентябрь 07, 2010, 10:10 »

Посмотри на QObject::sender().
Записан
Denjs
Гость
« Ответ #2 : Сентябрь 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, задача которого собственно и есть в том, что бы идентифицировать каждого из отправителей.
Или меняйте "дизайн" - добавьте в сигнатуру слота поле идентифицирующее отправителя.
Записан
NicK
Гость
« Ответ #3 : Сентябрь 07, 2010, 12:07 »

Код
C++ (Qt)
...
 
QObject* obj=QObject::sender();
if (QToolButton *tb=qobject_cast<QToolButton *>(obj)){
qDebug()<<tb->objectName();
...
 
}
 
...
Записан
radislav72
Гость
« Ответ #4 : Сентябрь 07, 2010, 12:34 »

А как лучше поступить исходя из специфики программирования в QT? Через QObject::sender(), или используя QSignalMapper ?
Записан
Karl-Philipp
Гость
« Ответ #5 : Сентябрь 07, 2010, 15:21 »

А как лучше поступить исходя из специфики программирования в QT? Через QObject::sender(), или используя QSignalMapper ?
Тут, наверное, лучше исходить из специфики вашей программы. Denjs процитировал и перевел, когда не стоит использовать QObject::sender().
Записан
SABROG
Гость
« Ответ #6 : Сентябрь 08, 2010, 07:25 »

Denjs процитировал и перевел, когда не стоит использовать QObject::sender().
Только не совсем корректно...
Цитировать
object-oriented principle of modularity
а не
Цитировать
"сигнал-слотовую-парадигму"

Да и ссылка будет валидна в большенстве случаев даже, когда объекты будут находится в разных потоках. Там же написано, что проблема может быть только при Qt::DirectConnection. По умолчанию всегда передается Qt::AutoConnection, а это значит что для соединения объектов из разных потоков будет автоматически выбрано Qt::QueuedConnection соединение.
Записан
radislav72
Гость
« Ответ #7 : Сентябрь 08, 2010, 07:46 »

Спасибо всем за разяснения. Реализовал через QObject::sender()... вроде как быстрее (с точки зрения набирания кода Улыбающийся)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.075 секунд. Запросов: 21.