Избавиться от QSignalMapper

120
01 августа 2019, 15:40

Мне нужно что бы несколько объектов вызывали один слот, и можно было понять, какой объект вызвал слот. В данном примере я попробовал использовать QSignalMapper. Но он работает только со строками и с числами. Объекты у меня не получилось передать. И тк QSignalMapper отмечен как QT_DEPRECATED, хочу от него избавиться.

widget.h

#ifndef WIDGET_H
#define WIDGET_H
#include <QSignalMapper>
#include <QWidget>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
    Q_OBJECT
public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();
public slots:
    void le(const QString &num);
private:
    Ui::Widget *ui;
    QSignalMapper *signalMapper;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget),
    signalMapper(new QSignalMapper(this))
{
    ui->setupUi(this);
    ui->lineEdit_1->setPlaceholderText("#1");
    ui->lineEdit_2->setPlaceholderText("#2");
    ui->lineEdit_3->setPlaceholderText("#3");
    connect(ui->lineEdit_1, &QLineEdit::returnPressed, signalMapper, QOverload<>::of(&QSignalMapper::map));
    signalMapper->setMapping(ui->lineEdit_1, ui->lineEdit_1);
    connect(ui->lineEdit_2, &QLineEdit::returnPressed, signalMapper, QOverload<>::of(&QSignalMapper::map));
    signalMapper->setMapping(ui->lineEdit_2, ui->lineEdit_2);
    connect(ui->lineEdit_3, &QLineEdit::returnPressed, signalMapper, QOverload<>::of(&QSignalMapper::map));
    signalMapper->setMapping(ui->lineEdit_3, ui->lineEdit_3);
    connect(signalMapper, QOverload<QObject *>::of(&QSignalMapper::mapped), this, &Widget::le);
}
Widget::~Widget()
{
    delete signalMapper;
    delete ui;
}
void Widget::le(QObject *num)
{
    QLineEdit *le = dynamic_cast<QLineEdit*>(num);
    if (le) {
        le->setReadOnly(true);
        ui->textBrowser->append(le->text());
    }
}
Answer 1

Оказывается "Qt предоставляет функцию Qobject::sender(), которая возвращает указатель на объект, пославший сигнал."

widget.h

#ifndef WIDGET_H
#define WIDGET_H
#include <QSignalMapper>
#include <QWidget>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
    Q_OBJECT
public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();
public slots:
    void lele();
private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->lineEdit_1->setPlaceholderText("#1");
    ui->lineEdit_2->setPlaceholderText("#2");
    ui->lineEdit_3->setPlaceholderText("#3");
    connect(ui->lineEdit_1, &QLineEdit::returnPressed, this, &Widget::lele);
    connect(ui->lineEdit_2, &QLineEdit::returnPressed, this, &Widget::lele);
    connect(ui->lineEdit_3, &QLineEdit::returnPressed, this, &Widget::lele);
}
Widget::~Widget()
{
    delete ui;
}
void Widget::lele()
{
    QLineEdit *le = dynamic_cast<QLineEdit *>(sender());
    if (le) {
        ui->textBrowser->append(le->text());
        le->setReadOnly(true);
    } else {
        ui->textBrowser->append("false");
    }
}
READ ALSO
Функции вызывают друг друга с++

Функции вызывают друг друга с++

Я совсем поверхностно знаю с++, но эту проблему мне необходимо срочно решить(нет времени на прочтение книги)

98
Global Libraries как зависимость Gradle в IDEA

Global Libraries как зависимость Gradle в IDEA

Есть некие глобальные библиотеки заданные в IDEA, могу ли я их подключить в buildgradle? Если я подключаю их вручную, то они сбрасываются при первом...

122