Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
 Аватар для Джон Кофи
266 / 81 / 18
Регистрация: 05.04.2018
Сообщений: 1,102
Записей в блоге: 1

Множественный вызов метода после connect

13.01.2020, 14:21. Показов 2884. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет. Необходимо, чтобы слот вызвался лишь единожды, но, тк сигнал вызывается множество раз, то и слот будет вызван не один раз. А как сделать, чтобы слот отработал только один раз? (в этом слоте нельзя сделать дисконнект)
C++ (Qt)
1
2
3
4
connect(_model, &Model::finished, this, [=](){
    _model->getData(chooseID);
},
Qt::UniqueConnection);
думал, Qt::UniqueConnection поможет, но нет.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.01.2020, 14:21
Ответы с готовыми решениями:

Вызов метода после завершения потока
Здравствуйте. Есть вот такой простой пример: private void Work() { Thread.Sleep(10000);//Что-то делаем ...

Вызов родительского метода после BeginInvoke
Есть форма с гридом. Пользователь из нее может запустить довольно продолжительную хранимую процедуру в базе. После этого грид нужно...

Вызов метода сразу после загрузки окна
Мне нужно чтобы метод PrimaryData(); отработал сразу после инициализации окна. Можна ли это сделать так чтобы не вызывать этот метод с...

14
16 / 14 / 4
Регистрация: 21.11.2014
Сообщений: 320
13.01.2020, 14:50
Ну можно типа костыля сделать : внутри класса делаешь bool isProcessing и метод setProcessing(bool flag) в слоте проверку делаешь if(!isProcessing) return

Добавлено через 9 минут
Qt :: UniqueConnection не работает для лямбда-выражений, функций, не являющихся членами, и функторов; они применяются только для подключения к функциям-членам.
1
 Аватар для Джон Кофи
266 / 81 / 18
Регистрация: 05.04.2018
Сообщений: 1,102
Записей в блоге: 1
13.01.2020, 15:31  [ТС]
Цитата Сообщение от Nightwalker Посмотреть сообщение
Ну можно типа костыля сделать : внутри класса делаешь bool isProcessing и метод setProcessing(bool flag) в слоте проверку делаешь if(!isProcessing) return
не то
Цитата Сообщение от Nightwalker Посмотреть сообщение
Qt :: UniqueConnection не работает для лямбда-выражений, функций, не являющихся членами, и функторов; они применяются только для подключения к функциям-членам.
да, "наткнулся" после того, как эту тему создал. Но, используя старый способ коннекта Qt :: UniqueConnection всё-равно позволял вызов несколько раз один за другим слота, что-то в этом я не понимаю, хотя, доку прочел.
Получилось так:
C++ (Qt)
1
2
3
4
5
6
7
8
9
std::unique_ptr<QMetaObject::Connection> pconn{new QMetaObject::Connection};
QMetaObject::Connection &conn = *pconn;
conn = connect(_model, &Model::finished, this, [=](){
    _model->getData(chooseID);
});
 
connect(_model, &Model::dataReceived, [=](){
    disconnect(conn);
});
0
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,282
13.01.2020, 16:12
C++ (Qt)
1
2
3
4
5
6
7
8
{
    static int cx = 0;
    if(cx++) return;
 
    ...
    тело слота
    ...
}
1
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
13.01.2020, 17:38
alexu_007, а как же переполнение?
1
фрилансер
 Аватар для Алексей1153
6465 / 5678 / 1131
Регистрация: 11.10.2019
Сообщений: 15,118
13.01.2020, 23:55
Цитата Сообщение от TRam_ Посмотреть сообщение
а как же переполнение
C++
1
static uint64_t cx = 0;
Добавлено через 5 минут
а вообще, зачем счётчик, bool должно быть достаточно. Причём - снаружи лямбды
0
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,282
14.01.2020, 02:19
Цитата Сообщение от TRam_ Посмотреть сообщение
alexu_007, а как же переполнение?
4 млрд, если считать количество вызовов слота по 1000 раз в секунду - то ресурс составляет 4 млн. секунд, это 46 дней. Потом программа крашится.
0
 Аватар для Джон Кофи
266 / 81 / 18
Регистрация: 05.04.2018
Сообщений: 1,102
Записей в блоге: 1
14.01.2020, 08:49  [ТС]
в последнем моем примере всё ок, работает. Счетчики и флаги не то, стараюсь избегать.
0
фрилансер
 Аватар для Алексей1153
6465 / 5678 / 1131
Регистрация: 11.10.2019
Сообщений: 15,118
14.01.2020, 08:57
Джон Кофи, я бы даже сказал, что если есть необходимость указать Qt::UniqueConnection для коннекта к лямбде, то это звоночек, что тут нужна не лямбда, а слот-функция. Тогда флаги и счётчики будут не нужны

зачем идти против ветра
0
 Аватар для Джон Кофи
266 / 81 / 18
Регистрация: 05.04.2018
Сообщений: 1,102
Записей в блоге: 1
14.01.2020, 09:01  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
слот-функция
дак пробовал, не заработало не знаю почему, я вообще не понимаю тогда зачем Qt::UniqueConnection, если не для использования в моем случае.
0
фрилансер
 Аватар для Алексей1153
6465 / 5678 / 1131
Регистрация: 11.10.2019
Сообщений: 15,118
14.01.2020, 09:10
Цитата Сообщение от Джон Кофи Посмотреть сообщение
дак пробовал, не заработало
покажи код
0
 Аватар для Джон Кофи
266 / 81 / 18
Регистрация: 05.04.2018
Сообщений: 1,102
Записей в блоге: 1
14.01.2020, 09:40  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
покажи код
изначально сигнал модели не передает никаких данных, а я беру int chooseID из той области, в которой коннект и объявлен.
C++ (Qt)
1
2
3
connect(_model, &Model::finished, this, [=](){
    _model->getData(chooseID);
});
тк мне нужно использовать oldstyle, то для передачи параметра мне нужно вызвать сигнал, который этот chooseID передаст? то есть сделать при получении сигнала &Model::finished еще один, который передаст chooseID.
В итоге получаем:
C++ (Qt)
1
2
connect(_model, &Model::finished, [=]() { this->signal(chooseID);});
connect(this, SIGNAL(signal(int)), SLOT(callGetData(int)), Qt::UniqueConnection);
callGetData() будет вызывать метод модели getData и передавать в него chooseID.
Ну и в итоге этот SLOT(callGetData(int)) попадает в "бесконечный вызов"
0
фрилансер
 Аватар для Алексей1153
6465 / 5678 / 1131
Регистрация: 11.10.2019
Сообщений: 15,118
14.01.2020, 10:30
"signal" - зарезервированное для Qt слово, его лучше не использовать

суть проблемы лично мне осталась не ясна. Покажи функцию (содержащую локальную переменную chooseID), в которой всё это делается
0
 Аватар для Джон Кофи
266 / 81 / 18
Регистрация: 05.04.2018
Сообщений: 1,102
Записей в блоге: 1
14.01.2020, 10:58  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
"signal" - зарезервированное для Qt слово, его лучше не использовать
это я "тут" так написал, у меня уже нет того кода, ветку спушил, удалил)
Цитата Сообщение от Алексей1153 Посмотреть сообщение
суть проблемы
слот вызывается бесконечно один за другим (сигнал &Model::finished эмитится много! раз), поэтому мне нужен был дисконнект после выполнения слота, чтобы этот слот вызывался только ОДИН раз.

Цитата Сообщение от Алексей1153 Посмотреть сообщение
Покажи функцию (содержащую локальную переменную chooseID), в которой всё это делается
C++ (Qt)
1
2
3
4
5
QModelIndexList chooseUsers = ui->_usersView->selectionModel()->selectedRows(Users::ID);
const int chooseUserID = chooseUsers.at(0).data().toInt();
 
connect(_model, &Model::finished, [=]() { this->signal(chooseID);});
connect(this, SIGNAL(signal(int)), SLOT(callGetData(int)), Qt::UniqueConnection);
0
фрилансер
 Аватар для Алексей1153
6465 / 5678 / 1131
Регистрация: 11.10.2019
Сообщений: 15,118
14.01.2020, 12:29
не вижу, где заполняется chooseID. Если имеется в виду chooseUserID , то

1)коннект сделать в конструкторе - всего один раз
C++ (Qt)
1
connect(_model, Model::finished, this, this->callGetData);
2) у слота callGetData убрать аргументы

3) сделать переменную int chooseUserID полем класса объекта this

4) слот callGetData будет использовать this->chooseUserID


кстати, сделай проверку, что chooseUsers не пустой, иначе вот тут может крашнуться

C++ (Qt)
1
chooseUsers.at(0)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.01.2020, 12:29
Помогаю со студенческими работами здесь

Полиморфизм: вызов метода базового класса, переопределенного метода и нового метода
В базовом классе метод помечен как virtual. Насколько я понял из книги: override означает, что метод не утрачивает связи с базовым...

Множественный рекурсивный вызов функции
hello world... еще раз)) то о что меня интересует вероятно есть в языке, я не знаю как эта штука называется но вот чувство такое есть что...

Множественный вызов рабочих копий формы
Возникла трудность в реализации. Имеется датагрид. При щелчке мышью по строке, вызывается отдельная форма для редактирования записи....

IdHTTP метод WorkBegin множественный вызов
Создаю запрос в idHTTP, отправляю его в post режиме. Это всё происходит в отдельном потоке. Код : slRaw = new TStringList(); m...

Вызов методов классов друг у друга (вызов метода из другого класса)
Есть несколько классов, которые могут вызывать методы (функции) друг у друга. Логика: класс1 имеет метод А, класс2 имеет метод Б, класс1...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru