Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Blayder от Ноябрь 02, 2009, 13:54



Название: [SOLVED] QPushButton toggled(bool) и два сигнала
Отправлено: 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.

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

П.С. кнопки создаются уже в процессе создания главного окна и их может быть разное количество.
П.П.С. Примеры кода пока не имею возможности привести, ибо пишу с работы.


Название: Re: QPushButton toggled(bool) и два сигнала
Отправлено: spectre71 от Ноябрь 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 )


Название: Re: QPushButton toggled(bool) и два сигнала
Отправлено: Igors от Ноябрь 02, 2009, 14:15
проблема в том, что по сигналу toggled(bool) мой слот отрабатывает дважды - при переходе предыдущей кнопки в состояние false и переходе новой кнопки с состояние true.

Как от этого ибавиться?
QActionGroup такими делами занимается


Название: Re: QPushButton toggled(bool) и два сигнала
Отправлено: Blayder от Ноябрь 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 такими делами занимается
Хм... с этим можно поколдовать...
Вечером дома попробую связать с кнопками...


Название: Re: QPushButton toggled(bool) и два сигнала
Отправлено: lit-uriy от Ноябрь 02, 2009, 17:12
>>как сделать, что бы сигнал toggle(bool) отрабатывался только при переходе в состояние true,
ни как, есть сигнал аргумент которого показывает состояние. В слоте храни предыдущее состояние и сравнивай с новым.


Название: Re: QPushButton toggled(bool) и два сигнала
Отправлено: Blayder от Ноябрь 02, 2009, 17:32
Тогда придется иначе это дело реализовать...
"Решаем головоломки на Qt" :D
Спасибо всем за советы!


Название: Re: QPushButton toggled(bool) и два сигнала
Отправлено: spectre71 от Ноябрь 03, 2009, 10:21
Тогда придется иначе это дело реализовать...
"Решаем головоломки на Qt" :D
Спасибо всем за советы!

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

Код
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);
}

 


Название: Re: QPushButton toggled(bool) и два сигнала
Отправлено: Blayder от Ноябрь 03, 2009, 10:54
Я до такого даж не додумался...
Всетаки учусь на ходу :D
Премного благодарен, Spectre.

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


Название: Re: QPushButton toggled(bool) и два сигнала
Отправлено: spectre71 от Ноябрь 03, 2009, 11:03
Я до такого даж не додумался...
Всетаки учусь на ходу :D
Премного благодарен, 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++, изучай язык на котором пишешь.


Название: Re: [SOLVED] QPushButton toggled(bool) и два сигнала
Отправлено: Blayder от Ноябрь 07, 2009, 16:22
Премного благодарен, получилось оч хорошо.
Еще раз спасибо.