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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Дважды вызывается слот: это шо за?  (Прочитано 5084 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« : Ноябрь 22, 2017, 20:31 »

Решил тут после долгого перерыва поковыряться с Qt. Поставил Qt 5.9.2, QtCreator 4.4.1. И решил сделать проект с формами, генерируемыми в Designer. Раньше писал код вообще вручную, используя только программную генерацию форм.

Сделал две формы: первая - MainWindows, вторая - SettingsWindow. На первой есть кнопка settingsButton, при ее нажатии должна открываться вторая форма. Элементарно.

Но оказалось, что при нажатии кнопки, слот, законнекченный с сигналом clicked() этой кнопки, вызывается два раза!

Я даже сделал такой код в слоте:

Код
C++ (Qt)
void MainWindow::on_settingsButton_clicked()
{
   static int counter=1;
   qDebug() << "Click to settings button" << counter;
 
   counter++;
}

И при одном клике вижу в консоли две строчки:

Код:
Click to settings button 1
Click to settings button 2

Я перепроверил ui-файл в XML-виде, думал может там какой-то двойной коннект прописан, а дезигнер его не отображает? Нет, один коннект.

Тогда почему слот два раза дергается?

Минимальный проект прикреплен.
Записан

Собираю информацию по крупицам
http://webhamster.ru
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Ноябрь 22, 2017, 20:35 »

Это потому, что вы связали сигнал и слот в дизайнере. Срабатывает эта связь + автоконнект по имени слота.
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #2 : Ноябрь 22, 2017, 20:39 »

Обожечки, автоконнект по имени. Совсем забыл про это.
Записан

Собираю информацию по крупицам
http://webhamster.ru
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #3 : Ноябрь 22, 2017, 20:50 »

Это потому, что вы связали сигнал и слот в дизайнере. Срабатывает эта связь + автоконнект по имени слота.

Но дело в том, что слот я тоже в дизайнере сделал. Сначала сделал слот путем выделения кнопки settingsButton потом ПКМ "Перейти к слоту". Потому что пока его не создашь, в таблице редактора сигналов и слотов его невозможно выбрать. Но и после такого создания, слота не видно.

Приходится перейти в режим "изменение сигналов/слотов" (хитрая кнопка сверху), выбрать кнопку settingsButton, потянуть, отпустить на форме, и тогда появится еще одна таблица сигналов-слотов, и там уже можно вручную добавить созданный слот. После чего он начинает видеться в таблице редактора сигналов и слотов.

Вопрос: а как правильно создавать слот?

Да, это очень нехорошо, что коннект-по-имени не виден в дизайнере...
Записан

Собираю информацию по крупицам
http://webhamster.ru
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #4 : Ноябрь 22, 2017, 20:58 »

Вопрос: а как правильно создавать слот?
Не давать ему странных имен, что-бы не было автоконнекта. Улыбающийся
Записан
zhbr
Гость
« Ответ #5 : Ноябрь 23, 2017, 06:53 »


Сначала сделал слот путем выделения кнопки settingsButton потом ПКМ "Перейти к слоту".

после этого выбрать нужный сигнал и больше делать ничего не надо.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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