Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [qt] задание параметра слоту 
V
    Опции темы
kuvshinka
Дата 10.3.2010, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 27.4.2008

Репутация: нет
Всего: нет



Хочу по клику кнопки сделать выполнение слота (функции), передав туда парметр....
где именно задается значение сего параметра?
Делаю так:
в классе MyKlass:
Код

 public slots:           
        void my_func(int param);


определение слота:
Код

void MyKlass::my_func(int param)
{
 if (param==1) ....
else....
}

в конструкторе другого класса (или где-то еще):
Код

MyKlass *kl=new MyKlass();
connect(pushButton1,SIGNAL(clicked()), kl,SLOT(my_func(int))); // указывается только тип   параметра, а его значение где задать?

PM MAIL   Вверх
SABROG
Дата 10.3.2010, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



В своих сигналах - не вопрос. Каких параметров можно ожидать от сигнала clicked() кнопки?


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Artemon
Дата 10.3.2010, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 2
Всего: 20



emit valueChanged(value); /// value - параметр сигнала, valueChanged - имя сигнала



--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
andrew_121
Дата 10.3.2010, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 11
Всего: 33



kuvshinka, мдя... Qt-ешная сигнал-слотовая модель, никак не входит в рамки С++, точнее, даже нарушает их(необходимостью кодогенерации и НЕ способностью работать с шаблонами).
к примеру, для boost.signal или boost.function, это делается с использованием связывателя, или лямбда. но из-за того, что Qt-ешная сигнал-стотовая модель создается дополнительной кодогенерацией, и не поддерживает шаблоны - этого не реализовать в с++.

Добавлено @ 21:23
Цитата(Artemon @  10.3.2010,  21:17 Найти цитируемый пост)
emit valueChanged(value); /// value - параметр сигнала, valueChanged - имя сигнала

ты предлагаешь создать промежуточный метод(слот), в котором испускать сигнал?

Это сообщение отредактировал(а) andrew_121 - 10.3.2010, 21:23


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Artemon
Дата 10.3.2010, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 2
Всего: 20



Цитата

ты предлагаешь создать промежуточный метод(слот), в котором испускать сигнал?


Да, а уже из этого слота вызывать сигнал с подходящей сигнатурой.


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
andrew_121
Дата 10.3.2010, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 11
Всего: 33



Artemon, ну да, все что остается...
но если бы не убогая сигнал-слотовая модель, то это выглядело бы так:
Код

MyKlass *kl=new MyKlass();
connect(pushButton1,SIGNAL(clicked()), kl,SLOT(std::bind(&MyKlass::my_func, need_value)));

или так:
Код

MyKlass *kl=new MyKlass();
connect(pushButton1,SIGNAL(clicked()), kl,SLOT([](){my_func(need_value);}));


кстати второй вариант успешно работает в QtPy.



--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
SABROG
Дата 10.3.2010, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Чем отличается этот код

Код

MyKlass *kl=new MyKlass();
connect(pushButton1,SIGNAL(clicked()), kl,SLOT(std::bind(&MyKlass::my_func, need_value)));


от этого:

Код

MyKlass *kl=new MyKlass();
connect(pushButton1,SIGNAL(clicked()), kl,SLOT(my_func()));
...
void MyClass::my_func()
{
    int param = 1;
    if (param == 1)
    ...
}


Или

Код

MyKlass *kl=new MyKlass();
kl->setParam(1);
connect(pushButton1,SIGNAL(clicked()), kl,SLOT(my_func()));
...
class MyKlass
{
public:
    void setParam(int param) {MyKlass::param = param;}
private:
    int param;
}
...
void MyKlass::my_func()
{
    if (param ==1)
    ...
}


Правильный ответ - он бессмысленный во всех вариантах. Сигнал clicked() не передает никаких параметров, а прописывать константный параметр равносильно использованию константы внутри метода или класса. Всякие boost::bind'ы и std::bind1st/bind2nd это всё синтаксический сахар, цель которого меньше писать и выглядеть красиво.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
andrew_121
Дата 10.3.2010, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 11
Всего: 33



Цитата(SABROG @  10.3.2010,  22:13 Найти цитируемый пост)
Чем отличается этот код

тем, что слот может быть произвольный. и иметь произвольное кол-во аргументов и типов, а значит гибкий.
и не нужен промежуточный слот.

Добавлено через 2 минуты и 20 секунд
Цитата(SABROG @  10.3.2010,  22:13 Найти цитируемый пост)
Сигнал clicked() не передает никаких параметров

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

Добавлено через 14 минут и 42 секунды
UP
Цитата(SABROG @  10.3.2010,  22:13 Найти цитируемый пост)
а прописывать константный параметр равносильно использованию константы внутри метода или класса

естественно.
но я не говорю про константу. я имел ввиду переменную.

Цитата(SABROG @  10.3.2010,  22:13 Найти цитируемый пост)
Всякие boost::bind'ы и std::bind1st/bind2nd это всё синтаксический сахар, цель которого меньше писать и выглядеть красиво.

хорошо что не вы утверждаете стандарты.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
SABROG
Дата 10.3.2010, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



QMetaObject::invokeMethod()

Через этот метод можно симулировать посылку сигналов от любого объекта к любому объекту, вызывать любые слоты с нужными параметрами. И всё это может работать даже когда объекты в разных потоках.

Цитата(andrew_121 @  10.3.2010,  22:28 Найти цитируемый пост)
но зачем, если использование связывателей и лямбда никак не противоречит С++ ?! 

Это противоречит мета-объектной системе Qt, она больше чем простые callback'и, это накладывает ограничения.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
andrew_121
Дата 10.3.2010, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 11
Всего: 33



тривиальный пример:
Код

my_thread: public QThread {
public:
   int my_var...
...
   void run() {
      ...
   }
};

struct any {
   void print_result(int v) {
      std::cout << "result = " << v << std::endl;
   }
};

int main() {
...
   any any;
   my_thread thread;

   // вот я хочу отобразить значение my_thread::my_var по завершении. как?!
   QObject::connect(&thread, SIGNAL(finished()), &any, SLOT(print_result(int)));

   thread.start();
   return ...
}


а вот так:
Код

my_thread: public QThread {
public:
   int my_var...
...
   void run() {
      ...
   }
};

struct any {
   void print_result(int v) {
      std::cout << "result = " << v << std::endl;
   }
};

int main() {
...
   any any;
   my_thread thread;

   // если бы не moc, можно было бы так -
   QObject::connect(&thread, SIGNAL(finished()), &any, SLOT(std::bind(&any::print_result, &any, thread.my_var));

   thread.start();
   return ...
}


немного усложним задачу:
Код

my_thread: public QThread {
public:
   int my_var...
...
   void run() {
      ...
   }
};

struct any {
   void print_result(const char* v) {
      std::cout << "result = " << v << std::endl;
   }
};

int main() {
...
   any any;
   my_thread thread;

   // или вот так -
   QObject::connect(&thread, SIGNAL(finished()), &any, SLOT( // но приемник уже указывать нет надобности
         [&]() {
            if ( thread.my_var == 1 )
               any.print_result("one!");
            else if ( thread.my_var == 2 )
               any.print_result("two!");
         };
      )
   );

   thread.start();
   return ...
}



Добавлено @ 23:02
Цитата(SABROG @  10.3.2010,  22:52 Найти цитируемый пост)
QMetaObject::invokeMethod()

да, если бы я мог создать анонимный объект вместо слота, в котором мог бы связать то что мне нужно с тем что мне нужно, то вопроса бы не возникло. но так я не могу! именно из-за метаобъектной системы!

Цитата(SABROG @  10.3.2010,  22:52 Найти цитируемый пост)
Это противоречит мета-объектной системе Qt

интересно...мы пишем на Qt используя С++, или на С++ используя Qt ?! разницу ощущаете? smile 

Это сообщение отредактировал(а) andrew_121 - 10.3.2010, 23:19


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
kuvshinka
Дата 10.3.2010, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 27.4.2008

Репутация: нет
Всего: нет



мда, действительно сигнал-слотовая модель получается какая-то, мягко говоря, несовершенная...
а такая вышеуказанная задачка возникла как один из возможных вариантов решения следующей проблемы:
мне надо каким-то образом по кликам разных кнопок (тут-то и задаются коннекты кнопок с различными слотами gl-класса) выводить различные фигуры на виджет-потомок от QGLWidget (все фигуры отображаются естественно в paintGL и только в нем)?  Как-то наверное надо передавать параметр в  метод paintGL, определяющий в зав-ти от нажатой кнопки что именно надо визуализировать, а что - нет (то есть выводить на экран только часть кода метода paintGL), но как это все осуществить, если принудительно я не вызываю метод paintGL (а вызывается он при визуализации (метод show()) gl-виджета через экземпляр этого класса)? 
Как можно решить данную проблему?

PM MAIL   Вверх
andrew_121
Дата 10.3.2010, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 11
Всего: 33



Цитата(kuvshinka @  10.3.2010,  23:10 Найти цитируемый пост)
мне надо каким-то образом по кликам разных кнопок (тут-то и задаются коннекты кнопок с различными слотами gl-класса) выводить различные фигуры на виджет-потомок от QGLWidget

для этого смотрите: http://doc.trolltech.com/4.6/qsignalmapper.html


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
SABROG
Дата 10.3.2010, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(andrew_121 @  10.3.2010,  22:58 Найти цитируемый пост)
анонимный объект вместо слота,

В ECMAScript тоже анонимные объекты есть, но их нет в C++ и это не вина Qt и мета-объектной системы.

Код

thread.start();
thread.wait();
any.print_result(my_var);


Не нравится wait()? Ок, сделай структуру any классом и унаследуйся от QObject'a. Оверхед? Ок, сделай другой класс. Не красиво, слишком много классов? Ок, перенеси функцию print_result() в класс my_thread(), сделай её слотом и выводи своё значение. Не хочешь менять структуру any? Ладно, передай в другой поток ссылку на метод print_result(), это будет не потокобезопасно, зато ровно также как и bind() вместо слота. Вариантов море.

Цитата(andrew_121 @  10.3.2010,  22:58 Найти цитируемый пост)
интересно...мы пишем на Qt используя С++, или на С++ используя Qt ?! разницу ощущаете?

Ага, это Страуструп пишет на программистах. Идеального ничего нет и со многими вещами приходится считаться. Несмотря на то, что язык C++ по своей сути должен быть переносимым, он таковым является не полностью. Разная размерность типов для разных компиляторов, архитектур, разное соблюдение стандартов, разные byte orders, разные размеры указателей для классов с виртуальным наследованием, разное выравнивание, разная оптимизация. И как следствие всего этого собираемая/не собираемая, рабочая/не рабочая, быстрая/медленная программа.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
kuvshinka
Дата 10.3.2010, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 27.4.2008

Репутация: нет
Всего: нет



вау....
в качестве примера по-быстрому слепила проектик (мне главное суть решения такой задачки понять) - укажите в нем какие именно слоты там должны быть при такой задаче (вывод части кода метода paintGL в зав-ти от нажатой кнопки)? буду ооочень благодарна за помощь...

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  Dimcheg.rar 10,49 Kb
PM MAIL   Вверх
andrew_121
Дата 10.3.2010, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 11
Всего: 33



Цитата(SABROG @  10.3.2010,  23:27 Найти цитируемый пост)
В ECMAScript тоже анонимные объекты есть, но их нет в C++

у меня есть, лямбда зовутся smile 
gcc-4.5.0
mingw32(на основе gcc-4.5.0)

Цитата(SABROG @  10.3.2010,  23:27 Найти цитируемый пост)
Не нравится wait()? Ок, сделай структуру any классом и унаследуйся от QObject'a. Оверхед? Ок, сделай другой класс. Не красиво, слишком много классов? Ок, перенеси функцию print_result() в класс my_thread(), сделай её слотом и выводи своё значение. Не хочешь менять структуру any? Ладно, передай в другой поток ссылку на метод print_result(), это будет не потокобезопасно, зато ровно также как и bind() вместо слота. Вариантов море.

это все понятно.
но зачем все так усложнять, если в стандарте с++0х есть и std::bind и лямбда ?!

Добавлено через 14 минут и 30 секунд
kuvshinka, слишком мало информации чтоб что-то внятное ответить.
проект смотрел.



--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0963 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.