Класс QPushButton представляет кнопку. Данный класс наследуется от класса QAbstractButton, который, в свою очередь, наследуется от QWidget.
Для создания кнопки можно использовать один из трех конструкторов класса:
QPushButton(QWidget *parent = nullptr) QPushButton(const QString &text, QWidget *parent = nullptr) QPushButton(const QIcon &icon, const QString &text, QWidget *parent = nullptr)
В конструкторы можно передать следующие параметры:
parent: указатель на родительский виджет, на котором будет отображаться кнопка.
text: текст кнопки в виде объекта QString
icon: картигка для кнопки в виде объекта QIcon
Создание простейшей кнопки:
#include <QApplication>
#include <QWidget>
#include <QPushButton>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QWidget widget;
widget.setWindowTitle("METANIT.COM");
widget.setMinimumWidth(250);
widget.setMinimumHeight(150);
QPushButton btn{"Click", &widget};
widget.show();
return app.exec();
}
Класс QPushButton определяет и наследует от QAbstractButton ряд методов, которые позволяют управлять функционалом кнопки. Но нас в первую очередь будет интересовать обработка нажатий. Для обработки событий в Qt применяется концепция сигналов. Когда кнопка активирована (т. е. нажата и отпущена, пока курсор мыши находится внутри кнопки), например, при нажатии пользователем на кнопку или при программном нажатии, генерируется сигнал clicked или иными словами событие нажатия:
void QAbstractButton::clicked(bool checked = false)
Данный сигнал определен как функция в родительском классе QAbstractButton. И нам надо отловить этот сигнал. Чтобы это сделать, применяется метод connect(), который определен в классе QObject. Этот метод имеет несколько разных версий, возьмем самую простую:
connect(const QObject *sender, const char *signal, const char *method, Qt::ConnectionType type = Qt::AutoConnection) const
Первый параметр - sender - это указатель на объект, на котором происходит событие. Второй параметр (signal) - указатель на метод сигнала. Третий параметр
(method) - указатель на функцию, которая будет срабатывать при генерации сигнала, то есть обработчик событий. Четвертный и необязательный параметр представляет тип соединения.
Например, обработаем событие нажатия:
#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QMessageBox>
void onClick();
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QWidget widget;
widget.setMinimumSize(250, 150);
widget.setWindowTitle("METANIT.COM");
QPushButton btn{"Click", &widget};
// устанавливаем для события clicked обработчик onClick
QObject::connect(&btn, &QPushButton::clicked, onClick);
widget.show();
return app.exec();
}
// обработчик нажатия
void onClick()
{
QMessageBox msgBox; // диалоговое окно
msgBox.setText("Hello METANIT.COM!"); // устанавливаем текст
msgBox.exec(); // отображаем диалоговое окно
}
В данном случае для обработки события определена функция onClick. В ней создаем объект QMessageBox, который представляет окно сообщения. с помощью метода setText устанавливаем текст сообщения.
И затем с помощью метода exec() отображаем окно сообщения на экране.
Для связи этой функции с событием нажатия выполняем следующий статический метод:
QObject::connect(&btn, &QPushButton::clicked, onClick);
Первому параметру передаем указатель на отслеживаемый объект - кнопку btn. Второй параметр представляет указатель на сигнал/событие нажатия кнопки - QPushButton::clicked - то есть, что мы обрабатываем.
И третий параметр - функция обработчика onClick.
В итоге при нажатии на кнопку отобразится окно с сообщением:
Для установки текста класс QPushButton предоставляет метод setText(), в который передается текст в виде объекта QString:
#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QMessageBox>
void onClick();
QPushButton* btn = nullptr;
int count{0};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QWidget widget;
widget.setMinimumSize(250, 150);
widget.setWindowTitle("METANIT.COM");
btn = new QPushButton("Click", &widget);
QObject::connect(btn, &QPushButton::clicked, onClick);
widget.show();
return app.exec();
}
void onClick()
{
btn->setText(QString::number(++count));
}
Здесь по нажатию увеличиваем значение переменной count и выводим ее значение на кнопку:
Если нам надо получить текст кнопки, то это можно сделать с помощью метода text(), который возвращает объект QString:
QString btnText = btn->text();
С помощью метода setIcon() или через один из параметров конструктора можно установить изображение, которое будет отображаться на кнопке. В этот метод передается объект QIcon из модуля gui.
Поэтому прежде всего надо подключить данный модуль в файле конфигурации проекта (который имеет расширение *.pro)
QT += widgets gui
Затем можно определить и использовать объект QIcon, в конструктор которого передается путь к файлу изображения:
#include <QApplication>
#include <QWidget>
#include <QPushButton>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QWidget widget;
widget.setMinimumSize(250, 150);
widget.setWindowTitle("METANIT.COM");
// установка изображения кнопки
QPushButton* btn = new QPushButton(QIcon("D:\\cpp.jpg"), "Click", &widget);
widget.show();
return app.exec();
}
В моем случае на кнопке будет отображаться картинка, которая расположена по пути "D:\cpp.jpg".
Метод setGeometry() позволяет определить область, где будет располагаться кнопка. Он имеет две версии:
void setGeometry(const QRect &) void setGeometry(int x, int y, int w, int h)
В метод можно передать ссылку на объект QRect, который устанавливает верхний левый угол кнопки, а также ширину и длину. Вторая версия метода позволяет последовательно указать x и y координаты верхнего угла, а также ширину (w) и высоту(h)
Применим вторую версию метода:
#include <QApplication>
#include <QWidget>
#include <QPushButton>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QWidget widget;
widget.setMinimumSize(250, 150);
widget.setWindowTitle("METANIT.COM");
QPushButton* btn = new QPushButton("Click", &widget);
btn->setGeometry(20, 10, 100, 30);
widget.show();
return app.exec();
}