QlineEdit的信号映射问题

时间:2019-05-30 11:14:47

标签: c++ qt

我想将参数传递给插槽。所以我正在使用信号映射。我正在使用setmapping将QlinEedit变量作为参数传递给插槽。但是我的广告位功能没有调用。

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 :(得分:0)

不推荐使用QSignalMapper类,您应该将新的signal / slots语法与lambda函数一起使用:

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;
};