Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
3 / 3 / 0
Регистрация: 01.10.2015
Сообщений: 28

Как определить sender() и/или senderSignalIndex() в фанкторе

02.02.2021, 20:45. Показов 3021. Ответов 6

Студворк — интернет-сервис помощи студентам
У QObject есть перегрузка статического метода connect(const QObject *sender, PointerToMemberFunction signal, Functor functor), в слотах QObject объекта можно вызвать sender() или senderSignalIndex() и узнать кто отправил сигнал, как узнать в фанкторе какой QObject объект отправил сигнал вызвавший эту функцию или лямбду? Заранее благодарен за ответ!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.02.2021, 20:45
Ответы с готовыми решениями:

Аналог Sender из Delphi в java. Есть ли? Или как получить ссылку на объект
Добрый день. В Delphi есть возможность использовать ссылку на объект, который вызвал процедуру: procedure...

Как определить тип Sender'a объекта при использовании динамически созданных объекитах
Есть динамически созданные объекты на форме: int counter=0; for(int i=1; i<4; i++) { for(int j=1; j<4; j++) { ...

Как работает класс Sender?
Можно какую-нибудь ссылочку на sender, не ясно как работает данный класс

6
фрилансер
 Аватар для Алексей1153
6472 / 5688 / 1131
Регистрация: 11.10.2019
Сообщений: 15,168
02.02.2021, 21:51
bubus, в квадратных скобках лямбды нужно захватить указатель на источник. Больше, наверное, никак. Либо с костылями какими-нибудь
0
3 / 3 / 0
Регистрация: 01.10.2015
Сообщений: 28
02.02.2021, 22:07  [ТС]
Тоже об этом думал, но тогда получается что только лямбду можно использовать, а свободную функцию не получится. Думал может ещё есть какой-то метод, смотрел исходники, там тоже ничего интересного не увидел. Вроде как и senderSignalIndex(), в случае с лямбдой, должен вернуть нужный индекс. Как попробую, отпишусь.
0
фрилансер
 Аватар для Алексей1153
6472 / 5688 / 1131
Регистрация: 11.10.2019
Сообщений: 15,168
02.02.2021, 22:24
bubus, скажу больше - лямбду/статическую функцию даже открепить нельзя через disconnect ))

за такими удобствами - к старому синтаксису с "SIGNAL/SLOT"

а удобство лямбд в краткости:

C++ (Qt)
1
2
3
4
5
auto* b=new QPushButton(this);
connect(b,&QPushButton::click,[b]
{
    b->hide();
});
Добавлено через 3 минуты
теоретически, конечно можно сделать трамплин в виде слота со старым синтаксисом, в котором достать sender(), а затем уже вызвать нужный функтор, имя которого будет лежать в свойстве объекта

setProperty("myfunctor",id) / property("myfunctor")

по идентификатору нужный функтор находить через мапу std::map, например
0
3 / 3 / 0
Регистрация: 01.10.2015
Сообщений: 28
08.02.2021, 23:38  [ТС]
Моя задача решилась через небольшой QObject класс посредник, которым владеет не QObject класс, в котором и осущевствляется коннект с лямбдой.
0
 Аватар для kapbepucm
1568 / 741 / 321
Регистрация: 02.05.2020
Сообщений: 1,660
09.02.2021, 11:08
Цитата Сообщение от Алексей1153 Посмотреть сообщение
скажу больше - лямбду/статическую функцию даже открепить нельзя через disconnect
можете подробнее описать?
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <QApplication>
#include <QPushButton>
#include <QDebug>
 
class MainWindow: public QPushButton
{
public:
  MainWindow(): QPushButton(nullptr){
    connect(this, &QPushButton::clicked, [this](){
      qDebug() << "test";
      disconnect(this, &QPushButton::clicked, nullptr, nullptr);
    });
  }
};
 
int main(int argc, char** argv)
{
  QApplication app(argc, argv);
  MainWindow w;
  w.show();
  return app.exec();
}
Добавлено через 37 секунд
почему отвязка работает*
0
фрилансер
 Аватар для Алексей1153
6472 / 5688 / 1131
Регистрация: 11.10.2019
Сообщений: 15,168
09.02.2021, 11:16
kapbepucm, https://doc.qt.io/qt-5/qobject.html#disconnect

случаи 1 и 2 возможны, но при этом сигнал отключается от всех получателей/слотов

а вот случай 3 - отключить один конкретный получатель (в данном случае - функтор) уже никак. Только все разом по 1 и 2

но если случай 1 и 2 устраивают - то да, будем считать, что это возможно
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.02.2021, 11:16
Помогаю со студенческими работами здесь

Как правильно использовать sender
Такая ситуация. Я в коде создаю некоторое количество обьектов Panel, а в одном Panel по 2 обьекта Label. Все создано кодом. Количество...

Как пользоваться object sender?
private void textBox_Click(object sender, EventArgs e) { //textBox1.Text = &quot;123&quot;; // а нужно чтобы откуда был сделан клик, туда...

Как закинуть sender as button в функцию?
Форма шиндовс. Используются обычные кнопки их 30 штук. Код для них зависит именно от текущей кнопки (какое значение оно имеет). ...

Как получить имя label из sender?
Нужно при клике на 'label1' передать имя первого лейбла во второй. public Form1() { InitializeComponent(); ...

Как получить имя объекта из sender?
Следующий код - не работает: private: System::Void button_Click(System::Object^ sender, System::EventArgs^ e) { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru