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