БлогNot. QT: "одноразовые" кнопки

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 [7640 просмотров]


теги: программирование c++ qt

К этой статье пока нет комментариев, Ваш будет первым