проблема отображения сигнала с QlineEdit - PullRequest
0 голосов
/ 30 мая 2019

Я хочу передать аргумент в слот.поэтому я использую отображение сигналов.Я передаю переменную QlinEedit в качестве аргумента слоту, используя setmapping.но моя функция слота не вызывает.

QSignalMapper* maper = new QSignalMapper (this) ;
connect(ui->step2,SIGNAL(returnPressed()),maper,SLOT(map()));
maper->setMapping(ui->step2,ui->step2);
connect (maper, SIGNAL(mapped(QLineEdit*)), this, SLOT(on_steps_returnPressed(QLineEdit*))) ;

1 Ответ

0 голосов
/ 31 мая 2019

Класс QSignalMapper устарел, и вы должны использовать новый синтаксис сигнала / слотов с лямбда-функцией:

connect(ui->step2, &QLineEdit::returnPressed, [=]() { this->on_steps_returnPressed(ui->step2); });

Вы также можете передавать только текст внутри вас QLineEdit вместо указателяна нем:

connect(ui->step2, &QLineEdit::returnPressed, [=]() { this->on_steps_returnPressed(ui->step2->text()); });

Если вы все равно должны использовать QSignalMapper, вы должны использовать сигнал QSignalMapper::mapped(QWidget*).Поскольку слот должен иметь ту же сигнатуру, что и подключенный сигнал, on_steps_returnPressed становится on_steps_returnPressed(QWidget*) (приведите параметр к QLineEdit):

QSignalMapper* maper = new QSignalMapper (this) ;
connect(step2, SIGNAL(returnPressed()), maper, SLOT(map()));
maper->setMapping(step2, step2);
connect(maper, SIGNAL(mapped(QWidget*)), this, SLOT(on_steps_returnPressed(QWidget*)));

Ваш слот должен быть примерно таким:

void on_steps_returnPressed(QWidget* widget)
{
    QLineEdit* edit = qobject_cast<QLineEdit*>(widget);
    if (!edit)
        return;
    label->setText(edit->text());
}

Полный пример для сравнения двух решений:

class Widget: public QWidget
{
    Q_OBJECT
public:
    Widget(QWidget* parent=nullptr): QWidget(parent),
        lineEdit1(new QLineEdit(this)),
        lineEdit2(new QLineEdit(this)),
        label(new QLabel(this))
    {
        QVBoxLayout* layout = new QVBoxLayout(this);
        layout->addWidget(lineEdit1);
        layout->addWidget(lineEdit2);
        layout->addWidget(label);

        connect(lineEdit1, &QLineEdit::returnPressed, [=]() { this->on_steps_returnPressed(lineEdit1); });

        QSignalMapper* maper = new QSignalMapper (this) ;
        connect(lineEdit2, SIGNAL(returnPressed()), maper, SLOT(map()));
        maper->setMapping(lineEdit2, lineEdit2);
        connect(maper, SIGNAL(mapped(QWidget*)), this, SLOT(on_steps_returnPressed(QWidget*)));
    }

public slots:
    void on_steps_returnPressed(QLineEdit* edit)
    {
        label->setText(edit->text());
    }
    void on_steps_returnPressed(QWidget* widget)
    {
        QLineEdit* edit = qobject_cast<QLineEdit*>(widget);
        if (!edit)
            return;
        label->setText(edit->text());
    }
private:
    QLineEdit* lineEdit1;
    QLineEdit* lineEdit2;
    QLabel* label;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...