![]() |
|
![]() ![]() ![]() |
|
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, слишком мало информации чтоб что-то внятное ответить. проект смотрел. -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
SABROG |
|
||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Ага, вот только стандарт еще не вышел. А судя по тому, что из черновиков выкинули концепты (boost::concept), то не известно что будет с лямбдой. Либо синтаксис поменяют, либо тоже выкинут. И обратите внимание на предупреждение gcc: http://gcc.gnu.org/gcc-4.5/cxx0x_status.html
|
||||
|
|||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 11 Всего: 33 |
что-что, но лямбда не выкинут. что бы там не писали по этому поводу, но обратной дороги нет. и стандарт реализовывать все равно придется. кстати в gcc стандарт реализован больше чем в 2010 студии. и работа не остановится. каждую неделю новый снэпшот. -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
kuvshinka |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 386 Регистрация: 27.4.2008 Репутация: нет Всего: нет |
andrew_121: чем Вам "мало информации чтоб что-то внятное ответить"? там даже в проекте подписано (и не закомментированно, чтобы сразу было видно) что хотелось бы сделать - в конструкторе класса MainWindow написать соот-ие слоты, при которых по щелчку кнопки1 вызывалась бы первая часть метода paintGL, по Кнопке2 - вторая его часть...
|
|||
|
||||
SABROG |
|
||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Думаю многие также говорили про классы QHttp, поддержке Direct3d, или классе QMatrix в Qt. Я также думал, что в новом Delphi останутся те же методы в классе TTrayIcon, а они поменялись и моя программа перестала собираться. Думал, что Qt смогу всегда через MSYS собирать, но тролли и это зарубили. Думал, что скрытие (hide) закладок QTabWidget'a быстро добавят, хрен.
Стандарт, но не черновики.
Для меня это равносильно фразе "приложения Qt, где используются фичи нового стандарта могут не собираться на других платформах и компиляторах". |
||||
|
|||||
kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 8 Всего: 160 |
kuvshinka, где Q_OBJECT макрос?! Я негодую!
![]() Вы с этим чудом из одной группы что-ли? ![]()
Да... Дожили... Вы HelloWorld-то не напишете. "Модель несовершенная". Мат. Много мата. В архиве кое-как работающий пример. Выкинут очевидный бред. Многое добавлено. Всё равно гамно, но я пытался недалеко отойти от Вашего поделия... Присоединённый файл ( Кол-во скачиваний: 2 ) ![]() -------------------- |
|||
|
||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 11 Всего: 33 |
ну вам то это не впервой. тролли постоянно что-то меняю и удаляют. но спор то не об этом. а о том, что метаобъектная модель нарушает/препятствует использования все мощи с++, а это ничто иное как шаблоны(на мой взгляд). допустим, не будет в стандарте std::bind, и лямбда. но использовать шаблоны все равно нельзя! страшно представить проект на Qt(в качестве ГУЯ) и библиотеки классов для кроссплатформенного программирования(типа boost). это же придется писать огромное кол-во переходников и адаптеров! в общем, я совсем не против Qt, я против moc. Добавлено @ 00:50 радует тот факт, что хоть PyQt и PySide хоть и являются всего лишь обертками, но в них не присутствуют следы moc`a Это сообщение отредактировал(а) andrew_121 - 11.3.2010, 00:55 -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 8 Всего: 160 |
SABROG, andrew_121, Вам не кажется, что Вы увлеклись?
-------------------- |
|||
|
||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 11 Всего: 33 |
так же, абсолютно не вижу надобности/плюсос метаобъектной системы. в бусте это все реализованно. и очень переносимо. и очень удобно. и очень потокобкзопастно. и не нарушая/не противореча остальным возможностям с++ !
Добавлено через 58 секунд kemiisto, да, и правда. сорри ![]() накипело ![]() -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
SABROG |
|
||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Согласен. Можешь лишнее удалить? От наших недопониманий стандарт быстрей не выйдет, а тролли вряд ли найдут способ как сделать полнофункциональную мета-объектную систему с теми возможностями языка, которые представляет C++.
Читай вот, почему не boost: http://doc.trolltech.com/4.6/templates.html Это сообщение отредактировал(а) SABROG - 11.3.2010, 01:07 |
||||
|
|||||
kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 8 Всего: 160 |
Нет конечно. В этом разделе я обычный участник. -------------------- |
|||
|
||||
andrew_121 |
|
||||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 11 Всего: 33 |
не правда. очередь сообщений: http://www.boost.org/doc/libs/1_42_0/doc/h....html#id1697099 в бусте это реализовано намного правильней. так же, бустовские сигналы, умеют возвращать значения. а в Qt с этим полный аут. только посредством свойств классов. думаю, если вы без маньякального патриотизма прочтете про boost.signals и про boost.function, вы найдете больше плюсов, чем минусов.
совсем чуть-чуть. Добавлено через 1 минуту и 52 секунды
спасибо! думаю за пять лет, ничего не изменилось. -------------------- Удалил аккаунт. Прощайте! |
||||
|
|||||
SABROG |
|
||||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Слоты могут возвращать значения, если вызваны напрямую. У буста своя система событий, которая никак не переплетается с Qt'шной, от чего собственно у него и проблемы с потокобезопасностью: FAQ к версии 1.42.0
Это все говорит о том, что идет обычный callback.
Необходимость ставить boost, чтобы собрать Qt'шное приложение уже большой минус. Пока в нем острой необходимости не наблюдалось за 3-4 года работы с Qt. Это сообщение отредактировал(а) SABROG - 11.3.2010, 01:22 |
||||||
|
|||||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 11 Всего: 33 |
для этого есть Boost.Signals2
ведать задачи разные. я не представляю как и что можно писать не используя буст. а сигнал может вернуть значение возвращаемое слотом? а это очень удобно. зы пофлудим. все равно почистят тему. -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
А ты видел как они реализованы? Через мутексы! Там очередь даже не используется. Это означает, что пока слот в одном потоке обрабатывает сигнал, управление в поток не вернется до его обработки. Потому и результат сигнала можно получить. В Qt же сигнал отправился и поток пошел работать дальше и не важно как долго будет выполняться слот в другом потоке, работают "одновременно" оба, особенно это видно на двухядернике. Я когда-то писал на ассемблере и делал всё тоже самое, что могу сделать сейчас хоть на перле хоть на питоне. Благо Сишные библиотеки я уже тогда юзал из асма. Также как и WINAPI и COM с ActiveX.
Может. Это соединение называется Qt::BlockingQueuedConnectio |
|||
|
||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 11 Всего: 33 |
да, это минус. этот тип соединения я знаю. вот только не уверен что сигнал вернет значение, возвращаемое слотом. нужно экспериментировать. Добавлено через 8 минут и 51 секунду
вот подумал....и не вспомнил ситуации, когда этот факт мне реально мешал. я конечно понимаю, что асинхронные сигналы это удобно. но не всегда! так же как и синхронные. -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 11 Всего: 33 |
SABROG, я тут набросал пример, и не понимаю, как я могу получить значение возвращаемое слотом, при испускании сигнала?
я даже не представляю как это описать синтаксически. сигналы/слоты в Qt ведь не объекты. в моем представлении, сигнал и слот, должны быть объектами. тогда все понятно. но в данном случае, нет.
Это сообщение отредактировал(а) andrew_121 - 11.3.2010, 03:59 -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
SABROG |
|
||||||||||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
В этом случае сигналы даже не нужны, достаточно простого вызова слота:
Вообще использование сигналов и слотов в Qt не обязательное условие о чем тролли и пишут. Можно тот же паттерн Observer сделать. Просто нужно позаботится о мутексах или атомарных операциях, чтобы сделать его потокобезопасным.
С тем же успехом можно вообще отдельный поток не создавать. Реальная ситуация, главный поток принимает соединения от клиентов, второй поток выполняет тяжелую работу над запросом. В случае с boost::signals2 пока отдельный поток выполняет тяжелую работу основной поток не знает подключился ли кто-то еще или нет, а из-за долгого молчания сервера на клиентской стороне начинает тикать таймаут в 60 секунд. Если твой второй поток за это время не уложится, то клиент отключится даже не узнав по какой причине его не пустили на сервер.
К счастью в Qt есть выбор.
Передавай в качестве параметра сигнала указатель типа QWeakPointer и меняй значение. Сигнал испускай сам, а не через QTimer. Можно даже так сделать:
|
||||||||||||
|
|||||||||||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 11 Всего: 33 |
для работы с сетью и вводом-выводом(в том числе и файловым(мультиплексированым и асинхронным)) использую asio, потому такой проблемы не возникало. а вообще, если понять архитектуру asio и принцип организации, то становится ясно, почему при работе с ней, не возникает подобных проблем. а ведь в ней все основано функциональных объектах. вы часто видели в пользовательском коде такое? я нет) в общем, все зависит от требований к коду. мне крайне сложно писать что-то более или менее крупное, не используя всеобразные связыватели и шаблоны/алгоритмы. -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Не видел. Потому, что мало кто зацикливается на том, что слот или сигнал должен вернуть значение. Как я уже говорил не сигналами со слотами едиными жив C++. В asio только один плюс - Completion Port. В остальном он использует те же API и неблокирующие сокеты как и Qt. Я предложил уже троллям "допилить" модуль QtNetwork, чтобы эвенты сокетов получать через Completion Port. Пока ни ответа ни привета. |
|||
|
||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 11 Всего: 33 |
это, если я не ошибаюсь, толь вендовая модель? -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Да, под *nix'ы это уже другой вопрос. Но я им инфу и для *nix'ов бросил. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |