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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Вопрос по QGroupBox  (Прочитано 9348 раз)
NickSin
Гость
« : Апрель 11, 2014, 15:38 »

Вопрос такой, как в QGroupBox отследить нажатие вложенных в него боксов, ратиокнопок? В доках только говориться о глобальном нажатии на всю группу.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Апрель 11, 2014, 18:52 »

кнопки через QButtonGroup
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
NickSin
Гость
« Ответ #2 : Апрель 13, 2014, 14:44 »

кнопки через QButtonGroup
Каждую по отдельности чтоль?  Ибо для каждой писать, получится много лишнего кода?
А есть вообще какой-нибудь класс, где  можно все кнопки, обьедененные в группу, просматривать на события глобально?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Апрель 13, 2014, 18:18 »

buttonGroup->addButton(myButton); — не так и много кода для каждой кнопки.

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
NickSin
Гость
« Ответ #4 : Апрель 14, 2014, 12:10 »

buttonGroup->addButton(myButton); — не так и много кода для каждой кнопки.

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

Сообщений: 4747



Просмотр профиля WWW
« Ответ #5 : Апрель 14, 2014, 12:22 »

QButtonGroup — это не UI объект. радиокнопки свои помещаешь в групбокс, как и раньше.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
NickSin
Гость
« Ответ #6 : Апрель 14, 2014, 13:22 »

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

QButtonGroup — это не UI объект. радиокнопки свои помещаешь в групбокс, как и раньше.
Можно я поясню?
тоесть создаю баттом бокс, в него пихаю кнопки, а потом баттом бокс пихаю в гроупбокс?

ну или пример приведите, если можете, я вас не понимаю просто.
Записан
Bepec
Гость
« Ответ #8 : Апрель 14, 2014, 13:53 »

Готовых компонентов нет, ибо это предельно просто.

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

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

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

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

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

Сообщений: 4747



Просмотр профиля WWW
« Ответ #9 : Апрель 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"
 
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
NickSin
Гость
« Ответ #10 : Апрель 15, 2014, 09:05 »

Готовых компонентов нет, ибо это предельно просто.

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

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

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

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

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

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

Так вот я хочу отслеживать любое "применение/не применение" на чекбоксах, чтобы применять или не применять выбранные фильтры.
Да я могу каждый раз отслеживать сигнал от каждой "кнопки" , но если у меня их 20-30 , то  не хочется писать соединение сигнал-слот для каждой кнопки, хочется более гибкого решения!
Записан
Bepec
Гость
« Ответ #11 : Апрель 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 *)
Записан
NickSin
Гость
« Ответ #12 : Апрель 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.
Еще раз спасибо
Записан
NickSin
Гость
« Ответ #13 : Апрель 16, 2014, 10:19 »

Извиняюсь последний вопрос,  а вот после добавления в группу, нельзя сделать чтобы чек ставился на множество кнопок?
Что за свойство за это отвечает?  Просто я могу выбирать только одну кнопку, а мне нужно несколько
« Последнее редактирование: Апрель 16, 2014, 10:25 от NickSin » Записан
OKTA
Гость
« Ответ #14 : Апрель 16, 2014, 10:30 »

В каком смысле чек?
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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