Класс 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(); }