Russian Qt Forum

Qt => Вопросы новичков => Тема начата: NickSin от Апрель 11, 2014, 15:38



Название: Вопрос по QGroupBox
Отправлено: NickSin от Апрель 11, 2014, 15:38
Вопрос такой, как в QGroupBox отследить нажатие вложенных в него боксов, ратиокнопок? В доках только говориться о глобальном нажатии на всю группу.


Название: Re: Вопрос по QGroupBox
Отправлено: kambala от Апрель 11, 2014, 18:52
кнопки через QButtonGroup


Название: Re: Вопрос по QGroupBox
Отправлено: NickSin от Апрель 13, 2014, 14:44
кнопки через QButtonGroup
Каждую по отдельности чтоль?  Ибо для каждой писать, получится много лишнего кода?
А есть вообще какой-нибудь класс, где  можно все кнопки, обьедененные в группу, просматривать на события глобально?


Название: Re: Вопрос по QGroupBox
Отправлено: kambala от Апрель 13, 2014, 18:18
buttonGroup->addButton(myButton); — не так и много кода для каждой кнопки.

если под «глобально» имеется в виду чтобы все клик-события кнопок шли через одну сущность, то QButtonGroup этим и занимается.


Название: Re: Вопрос по QGroupBox
Отправлено: NickSin от Апрель 14, 2014, 12:10
buttonGroup->addButton(myButton); — не так и много кода для каждой кнопки.

если под «глобально» имеется в виду чтобы все клик-события кнопок шли через одну сущность, то QButtonGroup этим и занимается.
Про это понял, другого понять не могу, как его на лэйаут вместить - или такое пока невозможно?


Название: Re: Вопрос по QGroupBox
Отправлено: kambala от Апрель 14, 2014, 12:22
QButtonGroup — это не UI объект. радиокнопки свои помещаешь в групбокс, как и раньше.


Название: Re: Вопрос по QGroupBox
Отправлено: NickSin от Апрель 14, 2014, 13:22
QButtonGroup — это не UI объект. радиокнопки свои помещаешь в групбокс, как и раньше.
Можно я поясню?
тоесть создаю баттом бокс, в него пихаю кнопки, а потом баттом бокс пихаю в гроупбокс?


Название: Re: Вопрос по QGroupBox
Отправлено: NickSin от Апрель 14, 2014, 13:33
QButtonGroup — это не UI объект. радиокнопки свои помещаешь в групбокс, как и раньше.
Можно я поясню?
тоесть создаю баттом бокс, в него пихаю кнопки, а потом баттом бокс пихаю в гроупбокс?

ну или пример приведите, если можете, я вас не понимаю просто.


Название: Re: Вопрос по QGroupBox
Отправлено: Bepec от Апрель 14, 2014, 13:53
Готовых компонентов нет, ибо это предельно просто.

QGroupBox - виджет и служит для размещения на себе виджетов. Точка.

QButtonGroup - объект(не визуальный) и позволяет объединять кнопки в группы. Т.е. addButton(ui.radio1, 0). У него есть сигналы нажатия на группу и всякие плюшки.

QComboBox - виджет и как бы в группы не объединяется. Ибо незачем.

Ещё проще - конкретизируйте задачу целиком, и мы вам подскажем как её проще решить.

PS всю задачу, не "хочу получить нажатия", а "нужен интерфейс в котором при нажатии на виджет происходит то-то то-то".


Название: Re: Вопрос по QGroupBox
Отправлено: kambala от Апрель 14, 2014, 14:15
Код
C++ (Qt)
#include <QtGui>
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
#include <QtWidgets/QtWidgets>
#endif
 
#include <Windows.h>
 
class Widget : public QWidget
{
   Q_OBJECT
 
public:
   Widget(QWidget *parent = 0) : QWidget(parent), box(new QGroupBox("box", this)), b1(new QRadioButton("b1", box)), b2(new QRadioButton("b2", box))
   {
       QVBoxLayout *vbl = new QVBoxLayout(box);
       vbl->addWidget(b1);
       vbl->addWidget(b2);
 
       bg.addButton(b1);
       bg.addButton(b2);
       connect(&bg, SIGNAL(buttonClicked(QAbstractButton *)), SLOT(buttonFromGroupClicked(QAbstractButton *)));
   }
 
private slots:
   void buttonFromGroupClicked(QAbstractButton *button)
   {
       qDebug() << "selected button with title" << button->text();
   }
 
private:
   QGroupBox *box;
   QRadioButton *b1, *b2;
   QButtonGroup bg;
};
 
int main(int argc, char **argv)
{
   QApplication app(argc, argv);
 
   Widget w;
   w.show();
   w.adjustSize();
 
   return app.exec();
}
 
#include "main.moc"
 


Название: Re: Вопрос по QGroupBox
Отправлено: NickSin от Апрель 15, 2014, 09:05
Готовых компонентов нет, ибо это предельно просто.

QGroupBox - виджет и служит для размещения на себе виджетов. Точка.

QButtonGroup - объект(не визуальный) и позволяет объединять кнопки в группы. Т.е. addButton(ui.radio1, 0). У него есть сигналы нажатия на группу и всякие плюшки.

QComboBox - виджет и как бы в группы не объединяется. Ибо незачем.

Ещё проще - конкретизируйте задачу целиком, и мы вам подскажем как её проще решить.

PS всю задачу, не "хочу получить нажатия", а "нужен интерфейс в котором при нажатии на виджет происходит то-то то-то".

Задача такова:
 Есть список чекбоксов, которые отвечают за применение/не применение фильтра к обьекту. Их я собрал в группу при помощи QGroupBox

Так вот я хочу отслеживать любое "применение/не применение" на чекбоксах, чтобы применять или не применять выбранные фильтры.
Да я могу каждый раз отслеживать сигнал от каждой "кнопки" , но если у меня их 20-30 , то  не хочется писать соединение сигнал-слот для каждой кнопки, хочется более гибкого решения!


Название: Re: Вопрос по QGroupBox
Отправлено: Bepec от Апрель 15, 2014, 09:23
Псевдокод:
Код:
//*.h
private:
    QButtonGroup group;
private:
    void init();
private slots:
    void buttonClicked( QAbstractButton *);
//*.cpp
void init()
{
group->setExclusive(false);
QList<QCheckBox*> listCheckBox = ui.groupBox->findChildren<QCheckBox*>();
for (int i = 0; i < listCheckBox.size(); i++)
{
group.addButton(listCheckBox[i],i);
}
connect(&group, SIGNAL(buttonClicked ( QAbstractButton *)), this, SLOT(buttonClicked ( QAbstractButton *));
}

И всё. Теперь при нажатии на каждый из находящихся на ui.groupBox будет вызываться слот buttonClicked( QAbstractButton *)


Название: Re: Вопрос по QGroupBox
Отправлено: NickSin от Апрель 15, 2014, 09:31
Код
C++ (Qt)
#include <QtGui>
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
#include <QtWidgets/QtWidgets>
#endif
 
#include <Windows.h>
 
class Widget : public QWidget
{
   Q_OBJECT
 
public:
   Widget(QWidget *parent = 0) : QWidget(parent), box(new QGroupBox("box", this)), b1(new QRadioButton("b1", box)), b2(new QRadioButton("b2", box))
   {
       QVBoxLayout *vbl = new QVBoxLayout(box);
       vbl->addWidget(b1);
       vbl->addWidget(b2);
 
       bg.addButton(b1);
       bg.addButton(b2);
       connect(&bg, SIGNAL(buttonClicked(QAbstractButton *)), SLOT(buttonFromGroupClicked(QAbstractButton *)));
   }
 
private slots:
   void buttonFromGroupClicked(QAbstractButton *button)
   {
       qDebug() << "selected button with title" << button->text();
   }
 
private:
   QGroupBox *box;
   QRadioButton *b1, *b2;
   QButtonGroup bg;
};
 
int main(int argc, char **argv)
{
   QApplication app(argc, argv);
 
   Widget w;
   w.show();
   w.adjustSize();
 
   return app.exec();
}
 
#include "main.moc"
 

Псевдокод:
Код:
//*.h
private:
    QButtonGroup group;
private:
    void init();
private slots:
    void buttonClicked( QAbstractButton *);
//*.cpp
void init()
{
group->setExclusive(false);
QList<QCheckBox*> listCheckBox = ui.groupBox->findChildren<QCheckBox*>();
for (int i = 0; i < listCheckBox.size(); i++)
{
group.addButton(listCheckBox[i],i);
}
connect(&group, SIGNAL(buttonClicked ( QAbstractButton *)), this, SLOT(buttonClicked ( QAbstractButton *));
}

И всё. Теперь при нажатии на каждый из находящихся на ui.groupBox будет вызываться слот buttonClicked( QAbstractButton *)

Спасибо всем большое, единственное что я искал - это связь,  не понимал как задействовать QButtonGroup.
Еще раз спасибо


Название: Re: Вопрос по QGroupBox
Отправлено: NickSin от Апрель 16, 2014, 10:19
Извиняюсь последний вопрос,  а вот после добавления в группу, нельзя сделать чтобы чек ставился на множество кнопок?
Что за свойство за это отвечает?  Просто я могу выбирать только одну кнопку, а мне нужно несколько


Название: Re: Вопрос по QGroupBox
Отправлено: OKTA от Апрель 16, 2014, 10:30
В каком смысле чек?


Название: Re: Вопрос по QGroupBox
Отправлено: NickSin от Апрель 16, 2014, 10:37
В каком смысле чек?
Извиняюсь за неточность, в плане чекбокс, чтобы можно было выбрать разные чекбоксы.
Сейчас ситуация такая, что если я поставлю галочку на один чекбокс,  то при нажатии на второй с первого галка убирается.
А мне нужно чтобы галки сохранялись, чтобы по ним уже организовывать фильтр в дальнейшем.


Название: Re: Вопрос по QGroupBox
Отправлено: NickSin от Апрель 16, 2014, 10:46
Все разобрался, спасибо!