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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [SOLVED] QPushButton toggled(bool) и два сигнала  (Прочитано 8677 раз)
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.357 секунд. Запросов: 24.