Книга: Основы программирования в Linux
Кнопки Qt
Разделы на этой странице:
Кнопки Qt
Кнопки виджетов вездесущи и мало отличаются внешним видом, способом применения и API в разных комплектах инструментов. Неудивительно, что Qt предлагает стандартные кнопки PushButton
, флажки CheckBox
и радиокнопки (или зависимые переключатели) RadioButton
.
QButton: базовый класс кнопок
Все виджеты кнопок в комплекте Qt — потомки абстрактного класса QButton
. У этого класса есть методы для опроса и переключения включенного/выключенного состояния кнопки и задания текста кнопки или ее графического представления.
Вам никогда не придется обрабатывать виджет типа QButton
(не путайте с виджетом QPushButton
!), поэтому нет смысла приводить конструкторы. Далее перечислено несколько полезных функций-методов этого класса:
#include <qbutton.h>
virtual void QButton::setText(const QString&);
virtual void QButton::setPixmap(const QPixmap&);
bool QButton::isToggleButton() const;
virtual void QButton::setDown(bool);
bool QButton::isDown() const;
bool QButton::isOn() const;
enum QButton::ToggleState { Off, NoChange, On }
ToggleState QButton::state() const;
У функций isDown
и isOn
одно назначение. Обе они возвращают TRUE
, если кнопка была нажата или активизирована.
Часто вам нужно отключить или сделать серым вариант, если он недоступен в данный момент. Сделать недоступным любой виджет, включая QButton, можно с помощью вызова метода QWidget::setEnable(FALSE)
.
У QButton
есть три подкласса, заслуживающие внимания:
? QPushButton
— виджет простой кнопки, выполняющий некоторое действие при щелчке кнопкой мыши;
? QCheckBox
— виджет кнопки, способный изменять состояние с включенного на выключенное для обозначения некоторого выбора;
? QRadioButton
— виджет кнопки, обычно применяемый в группе таких же кнопок, только одна из которых может быть активна в любой момент времени.
QPushButton
QPushButton
— стандартная кнопка общего вида, содержащая текст, такой как "OK" или "Cancel" и/или пиксельную пиктограмму. Как все кнопки класса QButton
, она порождает при активизации сигнал clicked
и обычно используется для связи со слотом и выполнения некоторого действия.
Вы уже применяли кнопку QPushButton
в примерах, и есть лишь еще одна интересная деталь, касающаяся этого простейшего из виджетов Qt. Кнопку QPushButton
можно превратить из кнопки, не помнящей своего состояния, в кнопку-выключатель (т.е. способную быть включенной и выключенной), вызвав метод setToggleButton
. (Если помните, у комплекта GTK+ из предыдущей главы есть для этих целей разные виджеты.)
Далее для полноты описания приведены конструкторы и полезные методы.
#include <qpushbutton.h>
QPushButton(QWidget *parent, const char *name = 0);
QPushButton(const QString& text, QWidget *parent, const char *name = 0);
QPushButton(const QIconSet& icon, const QString& text,
QWidget *parent, const char * name = 0);
void QPushButton::setToggleButton(bool);
QCheckBox
QCheckBox
— это кнопка, у которой есть состояние, ее можно включить и выключить (или установить и сбросить). Внешний вид QCheckBox
зависит от стиля отображения окон текущей системы (Motif, Windows и т.д.), но обычно она отображается как флажок с сопроводительным текстом справа.
Вы можете также перевести кнопку QCheckBox
в третье промежуточное состояние, которое означает "без изменения". Оно бывает полезно в редких случаях, когда вы не можете прочесть состояние выбора, который предоставляет кнопка QCheckBox
(и, следовательно, самостоятельно установить или сбросить флажок), но хотите дать пользователю возможность оставить выбор неизменным наряду с установкой и сбросом.
#include <qcheckbox.h>
QCheckBox(QWidget *parent, const char *name = 0);
QCheckBox(const QString& text, QWidget *parent, const char *name = 0);
bool QCheckBox::isChecked();
void QCheckBox::setTristate(bool y = TRUE);
bool QCheckBox::isTristate();
QRadioButton
Радиокнопки — кнопки-переключатели, применяемые для отображения исключающего выбора, когда можно выбрать только один вариант из группы представленных (вспомните снова старые автомобильные радиоприемники, в которых можно было нажать только одну кнопку блока). Сами по себе кнопки QRadioButton
не многим отличаются от кнопок QCheckBox
, поскольку группировка и исключительный выбор обрабатываются классом QButtonGroup
, главное же их отличие заключается в том, что они отображаются как круглые кнопки, а не как флажки.
QButtonGroup
— виджет, облегчающий обработку групп кнопок за счет предоставления удобных методов.
#include <qbuttongroup.h>
QButtonGroup(QWidget *parent = 0, const char* name = 0);
QButtonGroup(const QString& title, QWidget* parent = 0,
const char * name = 0);
int insert (QButton *button, int id = -1);
void remove(QButton *button);
int id(QButton *button) const;
int count() const;
int selectedId() const;
Применять виджет QButtonGroup
проще простого: он даже предлагает необязательную рамку вокруг кнопок, если используется конструктор title
.
Добавить кнопку в QButtonGroup
можно с помощью метода insert
или заданием QButtonGroup
в качестве родительского виджета кнопки. Для уникального обозначения каждой кнопки в группе можно задать id
в методе insert
. Это особенно полезно при определении выбранной кнопки, т.к. функция selectedId
возвращает id
выбранной кнопки.
Все кнопки QRadioButton
, добавляемые в группу, автоматически становятся кнопками с исключающим выбором.
Далее приведены прототипы конструкторов QRadioButton
и одного уникального метода, который не вызовет большого удивления:
#include <qradiobutton.h>
QRadioButton(QWidget* parent, const char* name = 0);
QRadioButton(const QString& text, QWidget *parent, const char *name = 0);
bool QRadioButton::isChecked();
Выполните упражнение 17.5.
Упражнение 17.5. Виджет QButton
Теперь применим полученные знания в примере с кнопками Qt. Приведенная далее программа создает кнопки разных типов (радиокнопки, флажки и простые кнопки), чтобы показать, как использовать эти виджеты в ваших приложениях.
1. Введите файл Buttons.h:
#include <qmainwindow.h>
#include <qcheckbox.h>
#include <qbutton.h>
#include <qradiobutton.h>
class Buttons : public CMainWindow {
Q_OBJECT
public:
Buttons(QWidget *parent = 0, const char *name = 0);
2. Вы запросите состояние ваших кнопок позже, в функции слота, поэтому объявите указатели кнопок и вспомогательную функцию PrintActive
с атрибутом private в объявлении класса:
private:
void PrintActive(QButton *button);
QCheckBox *checkbox;
QRadioButton *radiobutton1, *radiobutton2;
private slots:
void Clicked();
}
3. Далее следует файл Buttons.срр:
#include "Buttons.moc"
#include <qbuttongroup.h>
#include <qpushbutton.h>
#include <qapplication.h>
#include <qlabel.h>
#include <qlayout.h>
#include <iostream>
Buttons::Buttons(QWidget *parent, const char *name) :
QMainWindow(parent, name) {
QWidget* widget = new QWidget(this);
setCentralWidget(widget);
QVBoxLayout *vbox = new QVBoxLayout(widget, 5, 10, "vbox");
checkbox = new QCheckBox("CheckButton", widget, "check");
vbox->addWidget(checkbox);
4. Затем вы создаете QButtonGroup
для двух ваших радиокнопок (переключателей).
QButtonGroup *buttongroup = new QButtonGroup(0);
radiobutton1 = new QRadioButton("RadioButton1", widget, "radio1");
buttongroup->insert(radiobutton1);
vbox->addWidget(radiobutton1);
radiobutton2 = new QRadioButton("RadioButton2", widget, "radio2");
buttongroup->insert(radiobutton2);
vbox->addWidget(radiobutton2);
QPushButton* button = new QPushButton("Ok", widget, "button");
vbox->addWidget(button);
resize(350, 200);
connect(button, SIGNAL(clicked()), this, SLOT(Clicked()));
}
5. Затем приведен удобный метод для вывода состояния заданной кнопки QButton
:
void Buttons::PrintActive(QButton *button) {
if (button->isOn())
std::cout << button->name() << " is checkedn";
else
std::cout" << button->name() << " is not checkedn";
}
void Buttons::Clicked(void) {
PrintActive(checkbox);
PrintActive(radiobutton1);
PrintActive(radiobutton2);
std::cout << "n";
}
int main(int argc, char **argv) {
QApplication app(argc, argv);
Buttons *window = new Buttons();
app.setMainWidget(window);
window->show();
return app.exec();
}
Как это работает
Этот простой пример показывает, как опрашивать виджеты кнопок Qt разных типов. После создания все они по большей части действуют одинаково. Например, функция PrintActive
демонстрирует, как получить состояние кнопки (включена или выключена). Обратите внимание на то, как она действует в случае запоминающих состояние кнопок разных типов, таких как флажки и переключатели (радиокнопки). В основном отличаются только вызовы для создания виджета кнопки. Радиокнопки, наиболее сложные (т.к. только одна в группе может быть включена), при создании требуют больше всего работы. В случае радиокнопок вы должны создать QButtonGroup
для того, чтобы гарантировать активность только одной радиокнопки в группе в любой момент времени.
- Использование кнопки Автосумма
- Исчезла Панель задач – нет часов, свернутых программ, кнопки Пуск
- Как разместить значки возле кнопки Пуск?
- На Панели быстрого запуска возле кнопки меню Пуск вмещается всего три значка. Как увеличить ее емкость?
- В Диспетчере задач пропали все вкладки, кнопки и пункты меню
- Как одним щелчком кнопки мыши закрыть несколько окон одновременно?
- Диски С: и D: невозможно открыть простым щелчком кнопки мыши. Появляется сообщение Не найден файл file.exe. Что делать?
- Перемещение и копирование ячеек с помощью кнопки мыши
- Повторное использование анимации для кнопки в состоянии hover
- 12.4.3. Кнопки
- Кнопки и группы кнопок
- Кнопки на панели инструментов или меню