Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.08.2015, 19:47   #1
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию QSpinBox установить значение без высылки сигнала

Можно ли установить значение в QSpinBox без высылки сигнала?
Дело в том что два спин-бокса связаны между собой, что приводит к рекрусивному вызову сигналов и слотов.
Вот упрощенный пример:
Код:
connect(box1, SIGNAL(valueChanged(int), SLOT(slotBox2(int)));
connect(box2, SIGNAL(valueChanged(int), SLOT(slotBox1(int)));
слоты
Код:
void slotBox1(int changed)
{
    box2->setValue(changed * k2);
}

void slotBox2(int changed)
{
    box1->setValue(changed * k1);
}
SAMOUCHKA вне форума Ответить с цитированием
Старый 07.08.2015, 00:59   #2
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Подключайтесь к слоту setValue(int), тогда рекурсия будет прервана при установке значения, которое уже стояло в QSpinBox. Связь между QSpinBox'ами будет такая:

Код:
connect(box1, SIGNAL(valueChanged(int)), box2, SLOT(setValue(int)));
connect(box2, SIGNAL(valueChanged(int)), box1, SLOT(setValue(int)));
А дальше уже подключайте, как Вы написали:

Код:
connect(box1, SIGNAL(valueChanged(int), SLOT(slotBox2(int)));
connect(box2, SIGNAL(valueChanged(int), SLOT(slotBox1(int)));
Тогда при изменении значения у любого QSpinBox'a мы будем попадать и в slotBox1(int), и в slotBox2(int).
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).

Последний раз редактировалось Krasiosoft; 07.08.2015 в 01:02.
Krasiosoft вне форума Ответить с цитированием
Старый 07.08.2015, 14:43   #3
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Слот - это функция, которую ты можешь привязать к сигналу.
Но если ты не хочешь привязывать к сигналу, то можешь ее просто вызвать (как обычную функцию, т.к. она ей и является).

Но скорее всего, если тебе потребовалось то, о чем ты пишешь - ты делаешь что-то не так (ищи костыли в своем коде).

Ну вот у Krasiosoft решение нормальное (если оно решает твою проблему).
rrrFer вне форума Ответить с цитированием
Старый 07.08.2015, 18:25   #4
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
Слот - это функция, которую ты можешь привязать к сигналу.
Но если ты не хочешь привязывать к сигналу, то можешь ее просто вызвать (как обычную функцию, т.к. она ей и является).

Но скорее всего, если тебе потребовалось то, о чем ты пишешь - ты делаешь что-то не так (ищи костыли в своем коде).

Ну вот у Krasiosoft решение нормальное (если оно решает твою проблему).
Тут без этого ни как!
Так как при изменении значения первого бокса, должно пропорционально изменятся значение второго и на оборот. Это один режим, второй когда их значения меняются не зависимо.
SAMOUCHKA вне форума Ответить с цитированием
Старый 08.08.2015, 18:27   #5
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Выходит, что значения у QSpinBox должны быть разные?

Например:
Код:
box1->value() == 1
box2->value() == 3
Если изменить значение box1 на 2, тогда значение box2 изменяется, например, на 2*3:

Код:
box1->value() == 2
box2->value() == 6
Код:
box1->value() == 3
box2->value() == 9
и т.д.

Что-то вроде этого нужно?
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Старый 08.08.2015, 21:01   #6
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию

Да это и нужно
SAMOUCHKA вне форума Ответить с цитированием
Старый 08.08.2015, 21:10   #7
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Так тогда можно сделать так:


Код:
connect(box1, SIGNAL(valueChanged(int), SLOT(slotBox2(int)));
connect(box2, SIGNAL(valueChanged(int), SLOT(slotBox1(int)));
Код:
void slotBox1(int changed)
{
    if(box2->value()!=changed*3) box2->setValue(changed*3);
}

void slotBox2(int changed)
{
    if(box1->value()!=changed/3) box1->setValue(changed/3);
}
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Установить значение полю связи Xaenar БД в Delphi 1 21.02.2012 01:59
QSpinBox Cheburashka08 Qt и кроссплатформенное программирование С/С++ 0 10.12.2011 20:32
QSpinBox Asdprom Qt и кроссплатформенное программирование С/С++ 0 11.11.2011 19:35
Установить значение в списке option Даниил_глазко JavaScript, Ajax 1 22.08.2011 16:40
ПОЛУЧИТЬ И УСТАНОВИТЬ ЗНАЧЕНИЕ ИЗ EDIT И В НЕГО Dimarik Win Api 2 26.03.2011 16:02