На этом шаге рассмотрим класс виджета переключателя QRadioButton.
Свое название — radio button — виджет переключателя получил благодаря своей схожести с кнопками радиоприемника, на панели которого может быть нажата только одна из кнопок. Нажатие на другую кнопку радиоприемника приводит к тому, что в группе автоматически отключается кнопка, нажатая до этого.
Переключатель представляет собой виджет (рис. 1), который может находиться в одном из двух состояний: включено (on) или выключено (off). Эти состояния пользователь может устанавливать с помощью мыши или клавиши Пробел, когда кнопка находится в фокусе. Класс QRadioButton виджета переключателя определен в заголовочном файле QRadioButton.
Этот виджет должен предоставлять пользователю, по меньшей мере, выбор одной из двух альтернатив. Виджеты переключателей не могут использоваться в отдельности и должны быть сгруппированы вместе. Их группировку можно выполнить, например, при помощи класса QGroupBox.
Поясняющие надписи должны быть определены для каждого используемого в группе переключателя, а также желательно задать и сочетания клавиш для быстрого доступа к каждому из переключателей. Это достигается включением в надпись символа & перед нужной буквой.
Рис.1. Переключатели
В листинге приводится текст заголовочного файла приложения, окно которого показано на рис. 1:
#ifndef RB_H #define RB_H #include <QWidget< class QGroupBox; class QRadioButton; class QPalette; class QPushButton; class QLabel; //объявляем класс rb, производный от класса QWidget class rb:public QWidget { //макрос Q_OBJECT задаем в начале определения //класса, т.к. он содержит слот Q_OBJECT private: //объявляем переменные QGroupBox *gb; QRadioButton *rbred; QRadioButton *rbgreen; QRadioButton *rbblue; QLabel *l; QPushButton *bclose; public: //конструктор класса, параметр parent //указывает на родительский виджет (равен 0) //создается виджет верхнего уровня rb(QWidget *parent=0); private slots: //в закрытой секции класса объявляем слот void ris(); }; #endif // RB_H
В листинге приводится текст файла, в которм находится реализация класса rb:
#include "rb.h" #include <QVBoxLayout> #include <QHBoxLayout> #include <QGroupBox> #include <QRadioButton> #include <QLabel> //реализация конструктора класса rb::rb(QWidget *parent):QWidget (parent) { //создаем группировку кнопок gb= new QGroupBox("&Цвет"); //создаем три переключателя rbred = new QRadioButton("&Красный"); rbgreen = new QRadioButton("&Зеленый"); rbblue = new QRadioButton("&Синий"); //устанавливаем переключатель во включенное состояние rbgreen->setChecked(true); //создаем надпись, отображающую текст в html-формате l=new QLabel ("<P ALIGN=CENTER><FONT COLOR=GREEN> Надпись<BR>зеленого<BR>цвета</FONT></P>"); //закрытый слот ris() вызывается при щелчке на переключателях connect(rbred,SIGNAL(clicked()),SLOT(ris())); connect(rbgreen,SIGNAL(clicked()),this,SLOT(ris())); connect(rbblue,SIGNAL(clicked()),this,SLOT(ris())); QHBoxLayout* phbxLayout = new QHBoxLayout; QVBoxLayout* pvbxLayout = new QVBoxLayout; pvbxLayout->addWidget(rbred); pvbxLayout->addWidget(rbgreen); pvbxLayout->addWidget(rbblue); gb->setLayout(pvbxLayout); phbxLayout->addWidget(gb); phbxLayout->addWidget(l); setLayout(phbxLayout); } //описание слота: в зависимости от выбранного переключателя //изменяются цвет надписи и ее текст void rb::ris() { if(rbred->isChecked()) { l->setText("<P ALIGN=CENTER><FONT COLOR=RED> Надпись<BR>красного<BR>цвета</FONT></P>"); } else { if(rbblue->isChecked()) { l->setText("<P ALIGN=CENTER><FONT COLOR=Blue> Надпись<BR>синего<BR>цвета</FONT></P>"); } else l->setText("<P ALIGN=CENTER><FONT COLOR=GREEN> Надпись<BR>зеленого<BR>цвета</FONT></P>"); } }
Рассмотрим текст файла main.cpp:
#include <QApplication>
#include "rb.h"
int main(int argc, char** argv)
{
QApplication app(argc, argv);
app.setApplicationDisplayName("Переключатели");
//создаем объект класса rb
rb rb;
rb.resize(300,150);
rb.show();
return app.exec();
}
Файлы приложения можно взять здесь.
На следующем шаге рассмотрим группировку кнопок.