![]() |
|
![]() ![]() ![]() |
|
kuvshinka |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 386 Регистрация: 27.4.2008 Репутация: нет Всего: нет |
Хочу по клику кнопки сделать выполнение слота (функции), передав туда парметр....
где именно задается значение сего параметра? Делаю так: в классе MyKlass:
определение слота:
в конструкторе другого класса (или где-то еще):
|
||||||
|
|||||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
В своих сигналах - не вопрос. Каких параметров можно ожидать от сигнала clicked() кнопки?
|
|||
|
||||
Artemon |
|
|||
а ты мне нравишься ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1771 Регистрация: 24.2.2004 Где: Челябинск Репутация: 2 Всего: 20 |
emit valueChanged(value); /// value - параметр сигнала, valueChanged - имя сигнала
-------------------- Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru |
|||
|
||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 11 Всего: 33 |
kuvshinka, мдя... Qt-ешная сигнал-слотовая модель, никак не входит в рамки С++, точнее, даже нарушает их(необходимостью кодогенерации и НЕ способностью работать с шаблонами).
к примеру, для boost.signal или boost.function, это делается с использованием связывателя, или лямбда. но из-за того, что Qt-ешная сигнал-стотовая модель создается дополнительной кодогенерацией, и не поддерживает шаблоны - этого не реализовать в с++. Добавлено @ 21:23
ты предлагаешь создать промежуточный метод(слот), в котором испускать сигнал? Это сообщение отредактировал(а) andrew_121 - 10.3.2010, 21:23 -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
Artemon |
|
|||
а ты мне нравишься ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1771 Регистрация: 24.2.2004 Где: Челябинск Репутация: 2 Всего: 20 |
Да, а уже из этого слота вызывать сигнал с подходящей сигнатурой. -------------------- Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru |
|||
|
||||
andrew_121 |
|
||||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 11 Всего: 33 |
Artemon, ну да, все что остается...
но если бы не убогая сигнал-слотовая модель, то это выглядело бы так:
или так:
кстати второй вариант успешно работает в QtPy. -------------------- Удалил аккаунт. Прощайте! |
||||
|
|||||
SABROG |
|
||||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Чем отличается этот код
от этого:
Или
Правильный ответ - он бессмысленный во всех вариантах. Сигнал clicked() не передает никаких параметров, а прописывать константный параметр равносильно использованию константы внутри метода или класса. Всякие boost::bind'ы и std::bind1st/bind2nd это всё синтаксический сахар, цель которого меньше писать и выглядеть красиво. |
||||||
|
|||||||
andrew_121 |
|
||||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 11 Всего: 33 |
тем, что слот может быть произвольный. и иметь произвольное кол-во аргументов и типов, а значит гибкий. и не нужен промежуточный слот. Добавлено через 2 минуты и 20 секунд а я хочу вызвать слот с нужными мне параметрами! и не говорите что в этом нет надобности! конечно, можно подумать над иным подходом к задаче. но зачем, если использование связывателей и лямбда никак не противоречит С++ ?! Добавлено через 14 минут и 42 секунды UP
естественно. но я не говорю про константу. я имел ввиду переменную.
хорошо что не вы утверждаете стандарты. -------------------- Удалил аккаунт. Прощайте! |
||||
|
|||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
QMetaObject::invokeMethod()
Через этот метод можно симулировать посылку сигналов от любого объекта к любому объекту, вызывать любые слоты с нужными параметрами. И всё это может работать даже когда объекты в разных потоках.
Это противоречит мета-объектной системе Qt, она больше чем простые callback'и, это накладывает ограничения. |
|||
|
||||
andrew_121 |
|
||||||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 11 Всего: 33 |
тривиальный пример:
а вот так:
немного усложним задачу:
Добавлено @ 23:02 да, если бы я мог создать анонимный объект вместо слота, в котором мог бы связать то что мне нужно с тем что мне нужно, то вопроса бы не возникло. но так я не могу! именно из-за метаобъектной системы! интересно...мы пишем на Qt используя С++, или на С++ используя Qt ?! разницу ощущаете? ![]() Это сообщение отредактировал(а) andrew_121 - 10.3.2010, 23:19 -------------------- Удалил аккаунт. Прощайте! |
||||||
|
|||||||
kuvshinka |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 386 Регистрация: 27.4.2008 Репутация: нет Всего: нет |
мда, действительно сигнал-слотовая модель получается какая-то, мягко говоря, несовершенная...
а такая вышеуказанная задачка возникла как один из возможных вариантов решения следующей проблемы: мне надо каким-то образом по кликам разных кнопок (тут-то и задаются коннекты кнопок с различными слотами gl-класса) выводить различные фигуры на виджет-потомок от QGLWidget (все фигуры отображаются естественно в paintGL и только в нем)? Как-то наверное надо передавать параметр в метод paintGL, определяющий в зав-ти от нажатой кнопки что именно надо визуализировать, а что - нет (то есть выводить на экран только часть кода метода paintGL), но как это все осуществить, если принудительно я не вызываю метод paintGL (а вызывается он при визуализации (метод show()) gl-виджета через экземпляр этого класса)? Как можно решить данную проблему? |
|||
|
||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 11 Всего: 33 |
для этого смотрите: http://doc.trolltech.com/4.6/qsignalmapper.html -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
SABROG |
|
||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
В ECMAScript тоже анонимные объекты есть, но их нет в C++ и это не вина Qt и мета-объектной системы.
Не нравится wait()? Ок, сделай структуру any классом и унаследуйся от QObject'a. Оверхед? Ок, сделай другой класс. Не красиво, слишком много классов? Ок, перенеси функцию print_result() в класс my_thread(), сделай её слотом и выводи своё значение. Не хочешь менять структуру any? Ладно, передай в другой поток ссылку на метод print_result(), это будет не потокобезопасно, зато ровно также как и bind() вместо слота. Вариантов море.
Ага, это Страуструп пишет на программистах. Идеального ничего нет и со многими вещами приходится считаться. Несмотря на то, что язык C++ по своей сути должен быть переносимым, он таковым является не полностью. Разная размерность типов для разных компиляторов, архитектур, разное соблюдение стандартов, разные byte orders, разные размеры указателей для классов с виртуальным наследованием, разное выравнивание, разная оптимизация. И как следствие всего этого собираемая/не собираемая, рабочая/не рабочая, быстрая/медленная программа. |
||||
|
|||||
kuvshinka |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 386 Регистрация: 27.4.2008 Репутация: нет Всего: нет |
вау....
в качестве примера по-быстрому слепила проектик (мне главное суть решения такой задачки понять) - укажите в нем какие именно слоты там должны быть при такой задаче (вывод части кода метода paintGL в зав-ти от нажатой кнопки)? буду ооочень благодарна за помощь... Присоединённый файл ( Кол-во скачиваний: 3 ) ![]() |
|||
|
||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 11 Всего: 33 |
у меня есть, лямбда зовутся ![]() gcc-4.5.0 mingw32(на основе gcc-4.5.0) это все понятно. но зачем все так усложнять, если в стандарте с++0х есть и std::bind и лямбда ?! Добавлено через 14 минут и 30 секунд kuvshinka, слишком мало информации чтоб что-то внятное ответить. проект смотрел. -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |