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

