Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt GUI _ вопрос по QGroupBox

Автор: DAVID 7.5.2014, 19:01

Вопрос такой: можно ли создать QGroupBox с функцией радио кнопки. С функцией обычной кнопки я делаю так:

qGB_ob1 = new QGroupBox(tr ("Yes"));
qGB_ob1->setCheckable (true);
qGB_ob1->setChecked (false);
... ... ...

но кнопка нужна как у QRadioButton

Автор: DAVID 7.5.2014, 20:14


Вот как на этом изображении, только вместо обычной кнопки нужна радио кнопка

Автор: igor_bogomolov 7.5.2014, 23:14

http://www.forum.crossplatform.ru/index.php?showtopic=6035&st=0

Автор: DAVID 8.5.2014, 10:57

В итоге создал такой класс:

class RadioGroupBox : public QGroupBox
{
    Q_OBJECT

public:

    RadioGroupBox (const QString &QS_ob, QWidget *parent = 0):
        QGroupBox (QS_ob, parent)
    {
        setCheckable (true);
        connect (this, SIGNAL (clicked ()), SLOT (slot_for_clicked ()));
    }

    void paintEvent (QPaintEvent *event)
    {
           QStylePainter paint (this);
           QStyleOptionGroupBox option;
           initStyleOption (&option);

           paint.drawComplexControl (QStyle::CC_GroupBox, option);

           option.rect = style()->subControlRect (QStyle::CC_GroupBox, &option,
                                                  QStyle::SC_GroupBoxCheckBox, this);
           paint.save();
           QPixmap px (option.rect.width(), option.rect.height());
           px.fill (this, option.rect.left(), option.rect.top());
           QBrush brush (px);
           paint.fillRect (option.rect, brush);
           paint.restore();

           paint.drawPrimitive (QStyle::PE_IndicatorRadioButton, option);
    }

private slots:

    void slot_for_clicked ()
    {
        if (! isChecked()) setChecked (true);
    }
};

Однако когда курсор мыши попадает в область переключателя происходит мерцание.
Как это можно исправить?

Автор: igor_bogomolov 8.5.2014, 15:53

Это из-за того, что под индикатором радиобаттона живет своей жизнью индикатор чекбокса. Он не затирается полностью. По крайней мере не под всеми стилями.
Попробуй заменить строку

px.fill (this, option.rect.left(), option.rect.top());
на
px.fill(option.palette.color(QPalette::Window));
Если не поможет, придётся отказываться от drawComplexControl и отрисовывать его самому. Как это делать смотри в исходниках. Проблема только в том, что отрисовка от стиля зависит.

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)