Russian Qt Forum
Май 08, 2024, 22:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 ... 15 16 [17]
241  Qt / Общие вопросы / Как избежать бесконечного рекурсивного вызова слотов? : Октябрь 22, 2013, 10:15
Иногда встречается ситуация, когда при смене значения в одном компоненте надо поменять значение в другом, и наоборот, например
Код
C++ (Qt)
connect(spinbox1, SIGNAL(valueChanged(int)), this, SLOT(slotValueChanged1(int)));
connect(spinbox2, SIGNAL(valueChanged(int)), this, SLOT(slotValueChanged2(int)));
void MyClass::slotValueChanged1(int i)
{
    spinbox2->setValue(i);
}
void MyClass::slotValueChanged2(int i)
{
    spinbox1->setValue(i);
}
Если не предпринять дополнительных мер, то слоты будут бесконечно вызывать друг друга.
Очевидны два метода решения
Первый - использовать метод QObject::blockSignals
Код
C++ (Qt)
void MyClass::slotValueChanged1(int i)
{
    this->blockSignals(true);
    spinbox2->setValue(i);
    this->blockSignals(false);}
 
void MyClass::slotValueChanged2(int i)
{
    this->blockSignals(true);
    spinbox1->setValue(i);
    this->blockSignals(false);
}
Считаю, что это плохое решение, т.к. блокируется весь механизм сигнал/слот, а не только те сигналы которые надо.

Другой вариант - ввести переменную, определяющую находимся ли мы уже внутри слота. Он не имеет недостатков первого метода, но имеет свои недостатки: много кода, на каждую пару слотов надо вводить отдельную переменную.
Код
C++ (Qt)
bool in_slot=false;
void MyClass::slotValueChanged1(int i)
{
    if(!in_slot)
    {
        in_slot=true;
        spinbox2->setValue(i);
        in_slot=false;
    }
}
void MyClass::slotValueChanged2(int i)
{
    if(!in_slot)
    {
        in_slot=true;
        spinbox1->setValue(i);
        in_slot=false;
    }
}
Есть ли какое-то стандартное решение для такой ситуации, не имеющее недостатков указанных решений?
242  Qt / Общие вопросы / Re: Перенос реализаций методов из h в cpp : Октябрь 18, 2013, 11:37
Класс нешаблонный и гуёвый так что тормоза не критичны.
Всем спасибо. Сделал с помощью Qt Creator.
243  Qt / Общие вопросы / Re: Перенос реализаций методов из h в cpp : Октябрь 18, 2013, 10:55
Тормоза возникают когда эти методы меняются, и пересобираестя всё, куда эти хедеры подключены.
244  Qt / Общие вопросы / Re: Перенос реализаций методов из h в cpp : Октябрь 18, 2013, 08:43
Может какая утилита есть?
245  Qt / Общие вопросы / Перенос реализаций методов из h в cpp : Октябрь 18, 2013, 08:11
Добрый день.

Мне достался код, где много методов класса реализовано в заголовках. Из-за этого есть большие проблемы со скоростью сборки проекта.
Как автоматизировать процесс переноса реализаций методов в cpp?
Страниц: 1 ... 15 16 [17]

Страница сгенерирована за 0.125 секунд. Запросов: 23.