Шаг 42.
Библиотека Qt.
Класс QGroupBox

    На этом шаге рассмотрим класс QGroupBox.

    Виджеты группировки кнопок, в основном, не предназначены для взаимодействия с пользователем. Их основная задача — повысить удобство использования и упростить понимание программы. Для этого важно, чтобы элементы интерфейса были объединены в отдельные логические группы. Кроме того, нужно помнить, что кнопки переключателей QRadioButton не могут использоваться отдельно друг от друга и должны быть объединены вместе.

    Класс QGroupBox является классом для такой группировки и представляет собой контейнер, содержащий в себе различные элементы управления. Он может иметь поясняющую надпись в верхней области, и эта надпись может содержать клавишу быстрого доступа, при нажатии на которую фокус переводится на саму группу, а также можно снабдить его дополнительным флажком, который будет управлять доступностью сгруппированных элементов (рис. 1). Этот класс определен в заголовочном файле QGroupBox.

    Приложение, показанное на рис. 1, представляет собой группу переключателей, отвечаю-щих за цвет фона. Например, выбор переключателя Красный приведет к тому, что фон виджета верхнего уровня станет красным. Флажок Яркость управляет яркостью цвета, а выбор переключателя Медуза осуществляет загрузку в качестве фона окна соотвествующей картинки.


Рис.1. Пример группировки кнопок

    В листинге приводится текст заголовочного файла приложения, окно которого показано на рис. 1:

#ifndef GRBUT_H
#define GRBUT_H
#include <QGroupBox>
class QCheckBox;
class QRadioButton;
//объявляем класс GrBut, производный от класса QGroupBox
class GrBut : public QGroupBox {
    Q_OBJECT
private:
//объявляем переменные
    QCheckBox* chb;
    QRadioButton* rbred;
    QRadioButton* rbgreen;
    QRadioButton* rbblue;
    QRadioButton* rbpic1;
    QRadioButton* rbpic2;
    QRadioButton* rbpic3;
    QRadioButton* rbpic4;
public:
//конструктор класса, параметр parent
//указывает на родительский виджет (равен 0)
//создается виджет верхнего уровня
    GrBut(QWidget* parent = 0);
public slots:
//в закрытой секции класса объявляем слот
    void ButClicked();
};
#endif // GRBUT_H

    В листинге приводится текст файла, в которм находится реализация класса rb:

#include "GrBut.h"
#include <QRadioButton>
#include <QCheckBox>
#include <QPushButton>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QPalette>
//реализация конструктора класса
GrBut::GrBut(QWidget* parent/*= 0*/) : QGroupBox("Группа кнопок", parent)
{
    //вызовом метода setCheckable()
    //с параметром true устанавливается флажок,
    //который "включается" методом setChecked()
    setCheckable(true);
    setChecked(true);
    //создаем переключатели
    rbred = new QRadioButton("&Красный");
    rbgreen = new QRadioButton("&Зеленый");
    rbblue = new QRadioButton("&Синий");
    rbpic1 = new QRadioButton("&Хризантема");
    rbpic2 = new QRadioButton("&Маяк");
    rbpic3 = new QRadioButton("&Тюльпаны");
    rbpic4 = new QRadioButton("М&едуза");
    //устанавливаем переключатель во включенное состояние
    rbgreen->setChecked(true);
    //cигнал clicked() для каждого переключателя
    //соединяется со слотом ButClicked()
    connect(rbred, SIGNAL(clicked()), SLOT(ButClicked()));
    connect(rbgreen, SIGNAL(clicked()), SLOT(ButClicked()));
    connect(rbblue, SIGNAL(clicked()), SLOT(ButClicked()));
    connect(rbpic1, SIGNAL(clicked()), SLOT(ButClicked()));
    connect(rbpic2, SIGNAL(clicked()), SLOT(ButClicked()));
    connect(rbpic3, SIGNAL(clicked()), SLOT(ButClicked()));
    connect(rbpic4, SIGNAL(clicked()), SLOT(ButClicked()));
    //флажок Яркость (указатель chb) включается сразу
    //после своего создания при помощи метода setChecked()
    chb = new QCheckBox("&Яркость");
    chb->setChecked(true);
    //cигнал clicked() для флажка
    //соединяется со слотом ButClicked()
    connect(chb, SIGNAL(clicked()), SLOT(ButClicked()));
    //созданные виджеты размещаются в два столбца
    //при помощи объектов классов QVBoxLayout и QHBoxLayout
    QHBoxLayout* phbl = new QHBoxLayout;
    QVBoxLayout* pvbl1 = new QVBoxLayout;
    QVBoxLayout* pvbl2 = new QVBoxLayout;
    pvbl1->addWidget(rbred);
    pvbl1->addWidget(rbgreen);
    pvbl1->addWidget(rbblue);
    pvbl1->addWidget(chb);
    pvbl2->addWidget(rbpic1);
    pvbl2->addWidget(rbpic2);
    pvbl2->addWidget(rbpic3);
    pvbl2->addWidget(rbpic4);
    phbl->addLayout(pvbl1);
    phbl->addLayout(pvbl2);
    setLayout(phbl);
    //вызывается слот ButClicked() для инициализации
    ButClicked();
}
//реализация метода ButClicked()
void GrBut::ButClicked()
{
    //создается объект палитры
    QPalette pal = palette();
    //проверяется состояние флажка Яркость для установки
    //переменной nLight, управляющей яркостью цвета
    int nLight = chb->isChecked() ? 150 : 80;
    //в операторах if выполняется анализ состояния
    //кнопок-переключателей при помощи метода isChecked()
    if(rbred->isChecked()) {
        //цвет фона палитры QWidget::backgroundRole()
        //изменяется вызовом метода QPalette::setColor()
        pal.setColor(backgroundRole(), QColor(Qt::red).light(nLight));
        //изменяется цвет текста
        pal.setColor(QPalette::WindowText, Qt::white);
    }
    else if(rbgreen->isChecked()) {
        pal.setColor(backgroundRole(), QColor(Qt::green).light(nLight));
        pal.setColor(QPalette::WindowText, Qt::black);
    }
    else if(rbblue->isChecked()) {
        pal.setColor(backgroundRole(), QColor(Qt::blue).light(nLight));
        pal.setColor(QPalette::WindowText, Qt::yellow);
    }
    else if(rbpic1->isChecked()) {
        //цвет фона палитры QWidget::backgroundRole()
        //изменяется вызовом метода QPalette::setBrush()
        //в качестве фона устанавливается
        //растровое изображение
        pal.setBrush(backgroundRole(), QBrush(QPixmap("Chrysanthemum.jpg")));
        pal.setColor(QPalette::WindowText, Qt::white);
    }
    else if(rbpic2->isChecked()){
        pal.setBrush(backgroundRole(), QBrush(QPixmap("Lighthouse.jpg")));
        pal.setColor(QPalette::WindowText, Qt::yellow);
    }
    else if(rbpic3->isChecked()){
        pal.setBrush(backgroundRole(), QBrush(QPixmap("Tulips.jpg")));
        pal.setColor(QPalette::WindowText, Qt::black);
    }
    else {
        pal.setBrush(backgroundRole(), QBrush(QPixmap("Jellyfish.jpg")));
        pal.setColor(QPalette::WindowText, Qt::white);
    }
    //цвет фона устанавливается в виджете при
    //помощи метода QWidget::setPalette()
    setPalette(pal);
    //фон автоматически заполняется
    setAutoFillBackground(true);
}

    Рассмотрим текст файла main.cpp:

#include <QApplication>
#include "GrBut.h"
int main (int argc, char** argv)
{
    QApplication app(argc, argv);
    app.setApplicationDisplayName("Группировка кнопок");
    //создаем объект класса GrBut
    GrBut gb;
    gb.resize(300,300);
    gb.show();
    return app.exec();
}

    Файлы приложения можно взять здесь.

    На следующем шаге рассмотрим базовый класс для виджетов настройки.




Предыдущий шаг Содержание Следующий шаг