Russian Qt Forum

Qt => Вопросы новичков => Тема начата: billy4685 от Апрель 16, 2015, 11:27



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


Название: Re: Как вызывать сторонюю функцию по нажатию кнопки?
Отправлено: Пантер от Апрель 16, 2015, 11:36
В Qt5 ты можешь хоть лямбду вызвать. Есть Qt4, то никак.


Название: Re: Как вызывать сторонюю функцию по нажатию кнопки?
Отправлено: m_ax от Апрель 16, 2015, 11:56
Есть Qt4, то никак.
Почему никак? Просто вызывать эту внешнюю функцию через дополнительный слот, например)


Название: Re: Как вызывать сторонюю функцию по нажатию кнопки?
Отправлено: Пантер от Апрель 16, 2015, 12:05
Есть Qt4, то никак.
Почему никак? Просто вызывать эту внешнюю функцию через дополнительный слот, например)
Дык, человеку же слот не хочется. Вруг, это какое-то принципиальное решение, а тут ты со своими шуточками.


Название: Re: Как вызывать сторонюю функцию по нажатию кнопки?
Отправлено: billy4685 от Апрель 16, 2015, 12:42
В Qt5 ты можешь хоть лямбду вызвать. Есть Qt4, то никак.
У меня как раз Qt5.3. Пытался следующим образом:

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

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


Название: Re: Как вызывать сторонюю функцию по нажатию кнопки?
Отправлено: Пантер от Апрель 16, 2015, 12:45
Код
C++ (Qt)
connect(but, &QPushButton::clicked, []() {newWindow();});
 


Название: Re: Как вызывать сторонюю функцию по нажатию кнопки?
Отправлено: m_ax от Апрель 16, 2015, 12:48
Или проще:
Код
C++ (Qt)
connect(but, &QPushButton::clicked, newWindow);
 


Название: Re: Как вызывать сторонюю функцию по нажатию кнопки?
Отправлено: billy4685 от Апрель 16, 2015, 13:25
Код
C++ (Qt)
connect(but, &QPushButton::clicked, []() {newWindow();});
 
Это не работает в моем случаи.


Название: Re: Как вызывать сторонюю функцию по нажатию кнопки?
Отправлено: billy4685 от Апрель 16, 2015, 13:27
Или проще:
Код
C++ (Qt)
connect(but, &QPushButton::clicked, newWindow);
 
Это сработало. Спасибо. Но а если я хочу передавать значение в функцию newWindow(), как быть тогда?
connect(but, &QPushButton::clicked, newWindow(i));
так не тянет.


Название: Re: Как вызывать сторонюю функцию по нажатию кнопки?
Отправлено: m_ax от Апрель 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 (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)


Название: Re: Как вызывать сторонюю функцию по нажатию кнопки?
Отправлено: Пантер от Апрель 16, 2015, 13:38
А можно еще через std::bind. Мне он больше лямбды нравится.


Название: Re: Как вызывать сторонюю функцию по нажатию кнопки?
Отправлено: billy4685 от Апрель 16, 2015, 13:47
спасибо, сейчас попробую


Название: Re: Как вызывать сторонюю функцию по нажатию кнопки?
Отправлено: m_ax от Апрель 16, 2015, 13:50
Да, и через std::bind попробуйте.. Тоже полезно иметь в виду такую возможность)


Название: Re: Как вызывать сторонюю функцию по нажатию кнопки?
Отправлено: billy4685 от Апрель 16, 2015, 14:44
спасибо, все работает)