QT: "одноразовые" кнопки
Была на днях проблемка у человека, вот к ней пример. Требовалось иметь в программе набор кнопок, нажатия которых будут "одноразовыми", то есть, кнопка после первого нажатия выполняет некий код и деактивируется. При этом, писать кучу однотипных обработчиков нажатия кнопок не хочется, а хочется иметь один слот-обработчик, который будет как-то различать кнопки между собой (какая именно из них была нажата). Разумеется, вместо кнопок можно и с другими компонентами обращаться по аналогии.
Нет ничего легче. С помощью QT Creator создадим класс-потомок QWidget
: меню Файл - Новый файл или проект - слева выбрать "Приложения", справа "Приложение Qt Widgets", нажать кнопку "Выбрать", ввести какое нужно Название, например, OneClick
, нажать кнопку "Далее" еще 2 раза, выбрать базовый класс = QWidget
, указать нужное Имя класса, например, Widget
. Форму создавать не нужно, мы её создадим программно, так что отключаем эту галочку. Снова жмём кнопку "Далее", потом "Завершить".
В заголовочном файле widget.h
предусмотрим метод createButton
для программного создания одной кнопки с нужной надписью и слот slotButtonClicked
, который будет обрабатывать нажатия всех кнопок, вот полный код файла:
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QPushButton> #include <QVBoxLayout> class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = 0); private: QPushButton* createButton (const QString& str); private slots: void slotButtonClicked (); }; #endif // WIDGET_H
В main.cpp
вообще ничего не меняем, а в widget.cpp
из конструктора нашего виджета программно накидаем на форму 10 кнопок, расположенных по вертикали. Для этого используем вертикальную сетку QVBoxLayout
и вызовем в цикле createButton
, передавая ей надписи на кнопках "1", "2", ..., "10". В слоте slotButtonClicked
будем определять, от какой из кнопок пришло событие, выводить её имя в заголовок окна и деактивировать. Подробнее см. в коммментариях, вот полный код файла:
#include "widget.h" Widget::Widget(QWidget *parent) : QWidget(parent) { //конструктор QVBoxLayout *myLayout = new QVBoxLayout; //новая вертикальная сетка for (int i=1; i<=10; i++) //добавляем туда кнопки 1..10 myLayout->addWidget(createButton(QString("%1").arg(i))); setLayout(myLayout); } QPushButton* Widget::createButton (const QString& str) { QPushButton* pcmd = new QPushButton(str); //создали кнопку с нужной надписью pcmd->setMinimumWidth(200); //задали ей минимальную ширину connect(pcmd, SIGNAL(clicked()), this, SLOT(slotButtonClicked())); //назначили метод обработки клика return pcmd; } void Widget::slotButtonClicked() { ((QWidget *)sender())->setDisabled(true); //выключили кнопку - //метод setDisabled есть в классе QWidget QString str = ((QPushButton*)sender())->text(); //получили текст кнопки-отправителя setWindowTitle(str); //повесили его в заголовок окна виджета //любые другие действия, зависящие от значения str }
Скачать этот пример в архиве .zip с проектом QT5 (2 Кб)
17.02.2016, 10:04 [7763 просмотра]