БлогNot. QT: может ли виджет посылать сигнал самому себе...

QT: может ли виджет посылать сигнал самому себе...

В смысле, если сигнал посылается от this и обработчик - тоже this. Может, почему нет. Не очень ясно, зачем это нужно, если можно просто вызвать метод своего класса, но в учебных целях добавим подобный пример. Если порой такое не компилируется - например, при соединении из конструктора виджета со слотом, добавленным через дизайнер форм (у меня приложение стабильно падало), причина, вероятно, в этом же - на момент установки connect объект ещё не сконструирован.

Проект создан на основе QDialog вместо QWidget (для разнообразия), форма размечена в конструкторе вместо обычного "ручного" добавления, вот макет формы:

макет формы
макет формы

Чтобы действия ненавязчиво иллюстрировались поверх всех окон, вместо стандартной всплывающей подсказки QToolTip, которую любой виджет может установить методом setToolTip, используется альтернативный класс "уведомления в стиле Chrome" popup, взятый вот отсюда (сообщение всплывает в нижнем правом углу экрана):

вид приложения
вид приложения

Вот класс виджета dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QStringList>
#include "popup.h"

namespace Ui { class Dialog; }

class Dialog : public QDialog {
    Q_OBJECT
public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();
signals:
    void listChanged(void);
private slots:
    void on_pushButton_clicked();
    void on_pushButton_2_clicked();
    void listChangedSlot();
    void on_spinBox_valueChanged(int arg1);
private:
    Ui::Dialog *ui;
    PopUp *popUp; //всплывающее popup-окно
    int value; //текущий элемент из spinBox
    QStringList *list; //список строк
};

#endif // DIALOG_H

...и его реализация dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent): QDialog(parent), ui(new Ui::Dialog) {
 ui->setupUi(this);
 list = new QStringList();
 popUp = new PopUp();
 this->value = 0;
 connect (this,SIGNAL(listChanged()),this,SLOT(listChangedSlot()));
 connect (this,SIGNAL(listChanged()),this,SLOT(listChangedSlot()));
}

void Dialog::on_pushButton_clicked() { //Add
 int val = ui->spinBox->value();
 QString strval = QString::number(val);
 bool uniqueItem = false;
 if (!list->contains(strval)) {
  list->append(strval);
  uniqueItem = true;
  emit listChanged();
 }
 popUp->setPopupText(
  QString(uniqueItem ? "Добавлено: %1" : "%1 уже есть в списке").arg(this->value)
 );
 popUp->show();
}

void Dialog::on_pushButton_2_clicked() { //Delete
 int val = ui->spinBox->value();
 QString strval = QString::number(val);
 int pos = list->indexOf(strval);
 bool foundItem = false;
 if (list->contains(strval)) {
  list->removeAt(pos);
  foundItem = true;
  emit listChanged();
 }
 popUp->setPopupText(
  QString(foundItem ? "Удалено: %1" : "%1 не найдено в списке").arg(this->value)
 );
 popUp->show();
}

void Dialog::listChangedSlot() { //Slot for view
 ui->textEdit->clear(); ui->textEdit->append(list->join("\n"));
}

void Dialog::on_spinBox_valueChanged(int arg1) {
 this->value = arg1;
 popUp->setPopupText(QString("Выбрано значение: %1").arg(this->value));
 popUp->show();
}

Dialog::~Dialog() { delete ui; }

 Скачать папку с этим проектом QT5 в архиве .zip (6 Кб)

Обратите также внимание в коде, как легко переписать содержимое списка QStringList в текстовое поле QTextEdit, единственным вызовом метода join (у родительского класса QList этого метода нет).

17.03.2017, 21:42 [4176 просмотров]


теги: список c++ qt программирование учебное

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