Russian Qt Forum
Сентября 07, 2025, 01:58 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [SOLVED] QPushButton toggled(bool) и два сигнала  (Прочитано 8917 раз)
Blayder
Гость
« : Ноября 02, 2009, 13:54 »

Люди добрые, как сделать, что бы сигнал toggle(bool) отрабатывался только при переходе в состояние true, но не отрабатывал бы при переходе в состояние false.

В асистенте нашел некий пример:
Цитировать
For example, a slot that reacts to signals emitted by newly checked buttons but which ignores signals from buttons that have been unchecked can be implemented using the following pattern:

Код
void MyWidget::reactToToggle(bool checked)
{
   if (checked) {
      // Examine the new button states.
      ...
   }
}

Но что-то я недопонимаю, как его использовать?
Просто у меня задачка такая:
имеется группа кнопок, обьединенных QButttonGroup, которые по сути работают как переключатели категорий. При переходе одной из кнопок в нажатое состояние, должен будет грузиться виджет с определенным контентом и вся проблема в том, что по сигналу toggled(bool) мой слот отрабатывает дважды - при переходе предыдущей кнопки в состояние false и переходе новой кнопки с состояние true.

Как от этого ибавиться?

П.С. кнопки создаются уже в процессе создания главного окна и их может быть разное количество.
П.П.С. Примеры кода пока не имею возможности привести, ибо пишу с работы.
« Последнее редактирование: Ноября 07, 2009, 16:21 от Blayder » Записан
spectre71
Гость
« Ответ #1 : Ноября 02, 2009, 14:06 »

Да уж, великая проблема поставить проверку на false. Улыбающийся

А вообще не мешало бы иногда смотреть документацию по классам которые используешь.

QButtonGroup

Signals:

void buttonClicked ( QAbstractButton * button )
void buttonClicked ( int id )
void buttonPressed ( QAbstractButton * button )
void buttonPressed ( int id )
void buttonReleased ( QAbstractButton * button )
void buttonReleased ( int id )
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Ноября 02, 2009, 14:15 »

проблема в том, что по сигналу toggled(bool) мой слот отрабатывает дважды - при переходе предыдущей кнопки в состояние false и переходе новой кнопки с состояние true.

Как от этого ибавиться?
QActionGroup такими делами занимается
Записан
Blayder
Гость
« Ответ #3 : Ноября 02, 2009, 14:37 »

Ну с кликед то работает, даже в том случае, если она уже в состоянии тру и все.

Это все в документации я уже раз 5 перечитал, и проблема не изменилась...
Видать надо будет код привести, как вечером приду...
Но попробую на словах описать:

Есть функция виджета createCategory(QString category)
В этой фугкции создается кнопка, вставляется в лэйаут, добавляется в группу кнопок и водключается к слоту, который уже дальше делает свои черные дела...

Так вот как мне условно задать срабатывание сигнала тока по тру?...

Код
QSignalMapper *mpr = new QSignalMapper;
mpr->setMapping(btnCat,category);
connect(btnCat,SIGNAL(toggled(bool)),mpr,SLOT(map()));
connect(mpr,SIGNAL(mapped(QString)),this,SLOT(viewCat(QString)));
 
Вот примерный код навскидку, что из себя это представляет.
Как суда всунуть проверку на переход состояния...

Цитировать
QActionGroup такими делами занимается
Хм... с этим можно поколдовать...
Вечером дома попробую связать с кнопками...
« Последнее редактирование: Ноября 02, 2009, 14:42 от Blayder » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #4 : Ноября 02, 2009, 17:12 »

>>как сделать, что бы сигнал toggle(bool) отрабатывался только при переходе в состояние true,
ни как, есть сигнал аргумент которого показывает состояние. В слоте храни предыдущее состояние и сравнивай с новым.
Записан

Юра.
Blayder
Гость
« Ответ #5 : Ноября 02, 2009, 17:32 »

Тогда придется иначе это дело реализовать...
"Решаем головоломки на Qt" Веселый
Спасибо всем за советы!
Записан
spectre71
Гость
« Ответ #6 : Ноября 03, 2009, 10:21 »

Тогда придется иначе это дело реализовать...
"Решаем головоломки на Qt" Веселый
Спасибо всем за советы!

Головоломки придумываешь себе сам!
Если уж задаешь вопрос, потрудись рассмотреть ответы.
Вот тебе один пример. Подобных решений множество.

Код
C++ (Qt)
void MyWidget::MyWidget(QWidget *parent) {
// ...
// ...
 QButtonGroup*ButtonGroup = new QButtonGroup(this);
 ButtonGroup->addButton(PushButton1, 1);
 ButtonGroup->addButton(PushButton2, 2);
 ButtonGroup->setExclusive(true);
 QObject::connect(ButtonGroup, SIGNAL(buttonClicked(int)), this, SLOT(onButtonClicked(int)));
// ...
// ...
}
 
void MyWidget::onButtonClicked(int id) {
/*
// Block if Clicked already checked button, if necessary!
// Initialize prev_id with default checked button id or -1
 static int prev_id = -1;
 if(prev_id == id) {return;}
 prev_id = id;
*/

 
 QButtonGroup* ButtonGroup = qobject_cast<QButtonGroup*>(QObject::sender());
 QString message = QString::number(id);
 message += " | ";
 message += ButtonGroup->checkedButton()->text();
 QMessageBox::information(0, "Info", message);
}

 
« Последнее редактирование: Ноября 03, 2009, 10:55 от Spectre » Записан
Blayder
Гость
« Ответ #7 : Ноября 03, 2009, 10:54 »

Я до такого даж не додумался...
Всетаки учусь на ходу Веселый
Премного благодарен, Spectre.

А можно еще маленький вопрос?
Цитировать
static int prev_id = -1;
что делает static?  Строит глазки
Записан
spectre71
Гость
« Ответ #8 : Ноября 03, 2009, 11:03 »

Я до такого даж не додумался...
Всетаки учусь на ходу Веселый
Премного благодарен, Spectre.

А можно еще маленький вопрос?
Цитировать
static int prev_id = -1;
что делает static?  Строит глазки

In C, a variable declared as static in a function is initialised once, and retains its value between function calls.
The default initial value of an uninitialized static variable is zero.
If a function or global variable is declared static, it can only be accessed in that file.

Это уже C/C++, изучай язык на котором пишешь.
Записан
Blayder
Гость
« Ответ #9 : Ноября 07, 2009, 16:22 »

Премного благодарен, получилось оч хорошо.
Еще раз спасибо.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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