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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как вызывать сторонюю функцию по нажатию кнопки?  (Прочитано 6508 раз)
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« : Апрель 16, 2015, 11:27 »

Здравствуйте, господа форумчане. Как вызвать функцию не член класса, по нажатию кнопки? Пытался методом connect, ну ничего не вышло, требует чтобы в SLOT()  бросался только слот объявлен в данном классе. А мне нужно по нажатию кнопки выполнить функцию, которая не является членом класса, в методе которого я и хочу вызвать эту функцию. Может, кто-то даст дельний совет? Может быть данное можно реализовать используя только события QEvent, а не через connect?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Апрель 16, 2015, 11:36 »

В Qt5 ты можешь хоть лямбду вызвать. Есть Qt4, то никак.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #2 : Апрель 16, 2015, 11:56 »

Есть Qt4, то никак.
Почему никак? Просто вызывать эту внешнюю функцию через дополнительный слот, например)
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Апрель 16, 2015, 12:05 »

Есть Qt4, то никак.
Почему никак? Просто вызывать эту внешнюю функцию через дополнительный слот, например)
Дык, человеку же слот не хочется. Вруг, это какое-то принципиальное решение, а тут ты со своими шуточками.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« Ответ #4 : Апрель 16, 2015, 12:42 »

В Qt5 ты можешь хоть лямбду вызвать. Есть Qt4, то никак.
У меня как раз Qt5.3. Пытался следующим образом:

Код:
connect(but, SIGNAL(clicked()), newWindow());

но бьет ошибку. Если же эту функцию делаю членом класса, и в connect уже ишу SLOT(newWindow()) вместо newWindow(), то все работает.
На всяк вариант прикрепил архив (набросал маленький пример по этому поводу).
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Апрель 16, 2015, 12:45 »

Код
C++ (Qt)
connect(but, &QPushButton::clicked, []() {newWindow();});
 
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #6 : Апрель 16, 2015, 12:48 »

Или проще:
Код
C++ (Qt)
connect(but, &QPushButton::clicked, newWindow);
 
« Последнее редактирование: Апрель 16, 2015, 12:53 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« Ответ #7 : Апрель 16, 2015, 13:25 »

Код
C++ (Qt)
connect(but, &QPushButton::clicked, []() {newWindow();});
 
Это не работает в моем случаи.
Записан
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« Ответ #8 : Апрель 16, 2015, 13:27 »

Или проще:
Код
C++ (Qt)
connect(but, &QPushButton::clicked, newWindow);
 
Это сработало. Спасибо. Но а если я хочу передавать значение в функцию newWindow(), как быть тогда?
connect(but, &QPushButton::clicked, newWindow(i));
так не тянет.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #9 : Апрель 16, 2015, 13:32 »

Цитировать
Это не работает в моем случаи.
В профайле добавьте
CONFIG += c++11

Цитировать
Но а если я хочу передавать значение в функцию newWindow(), как быть тогда?
Тогда через лямбду
Код
C++ (Qt)
connect(but, &QPushButton::clicked, []() { newWindow(i); });
 

Если параметр i внешний, то тогда так:
Код
C++ (Qt)
connect(but, &QPushButton::clicked, [&]() { newWindow(i); });
 

или так
Код
C++ (Qt)
connect(but, &QPushButton::clicked, [=]() { newWindow(i); });
 
Если вместо [&] используется [=], все используемые переменные будут скопированы, что позволяет использовать лямбда-функцию вне области действия исходных переменных.
https://ru.wikipedia.org/wiki/C%2B%2B11#.D0.9B.D1.8F.D0.BC.D0.B1.D0.B4.D0.B0-.D1.84.D1.83.D0.BD.D0.BA.D1.86.D0.B8.D0.B8_.D0.B8_.D0.B2.D1.8B.D1.80.D0.B0.D0.B6.D0.B5.D0.BD.D0.B8.D1.8F
« Последнее редактирование: Апрель 16, 2015, 13:37 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #10 : Апрель 16, 2015, 13:38 »

А можно еще через std::bind. Мне он больше лямбды нравится.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« Ответ #11 : Апрель 16, 2015, 13:47 »

спасибо, сейчас попробую
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #12 : Апрель 16, 2015, 13:50 »

Да, и через std::bind попробуйте.. Тоже полезно иметь в виду такую возможность)
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« Ответ #13 : Апрель 16, 2015, 14:44 »

спасибо, все работает)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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