Добавьте QGroupBox в QButtonGroup

У меня есть группа из 3 QRadioButtons и 2 проверяемых QGroupBox, которые должны быть взаимоисключающими. Мне нравится удобство добавления моих переключателей в QButtonGroup для автоматической обработки этого, но я не могу понять, как добавить QGroupBox в группу кнопок, потому что он не наследуется от QAbstractButton, и я не могу найти доступ к его флажку.

Например,

QRadioButton* rb1 = new QRadioButton("Button1");
QRadioButton* rb2 = new QRadioButton("Button2");
QRadioButton* rb3 = new QRadioButton("Button3");
QGroupBox* gb1 = new QGroupBox;
gb1->setCheckable(true);
QGroupBox* gb2 = new QGroupBox;
gb2->setCheckable(true);
QRadioButton* rb1 = new QRadioButton("Button1");

QButtonGroup* grp = new QButtonGroup;
grp->addButton(rb1);
grp->addButton(rb2);
grp->addButton(rb3);
grp->addButton(gb1);   //these two fail
grp->addButton(gb2);

Есть ли простой способ сделать это? Я знаю, что могу подключиться к сигналу clicked() QGroupBox, но я предпочитаю делать это более аккуратно, чем это.


person Phlucious    schedule 28.04.2015    source источник


Ответы (1)


Вы можете добавлять производные классы QAbstractButton только к экземпляру QButtonGroup. Итак, в вашем случае, если вы хотите обрабатывать QGroupBox как один из эксклюзивных элементов, я думаю, вам нужно реализовать его самостоятельно. Возможно, вы могли бы подключить все СИГНАЛЫ от упомянутого виджета к одному и тому же СЛОТУ, и в этом СЛОТЕ вы можете обновить проверенные/непроверенные виджеты с помощью функции отправителя:

QObject* object = sender();

if ( object == groupBox1 )
{
    // ...
}
else if ( object == groupBox1 )
{
    // ...

Но если вам нужно сделать это во многих местах, вы должны реализовать для этой цели какой-то вспомогательный класс.

person p.i.g.    schedule 28.04.2015
comment
Значит, нет способа подключиться к дочернему QCheckBox QGroupBox? Например, я могу подключиться к QLineEdit, встроенному в QComboBox, с помощью простого QComboBox::lineEdit(). - person Phlucious; 29.04.2015
comment
Но в этом случае QLineEdit является членом QComboBox, но QGroupBox может содержать любое количество и любые производные объекты QWidget... поэтому для этого нет специальной функции. Но, возможно, вы можете использовать функцию QObject::findChildren для получения QCheckBox* дочерний элемент QGroupBox, после чего вы можете создавать соединения. - person p.i.g.; 29.04.2015