首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QlineEdit信号映射问题

QlineEdit信号映射问题
EN

Stack Overflow用户
提问于 2019-05-30 19:14:47
回答 1查看 192关注 0票数 0

我想把参数传递给slot。所以我使用信号映射。我使用setmapping将QlinEedit变量作为参数传递给插槽。但是我的槽函数没有调用。

代码语言:javascript
复制
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*))) ;
EN

回答 1

Stack Overflow用户

发布于 2019-05-31 21:18:58

QSignalMapper类已被弃用,您应该将新的信号/槽语法与lambda函数一起使用:

代码语言:javascript
复制
connect(ui->step2, &QLineEdit::returnPressed, [=]() { this->on_steps_returnPressed(ui->step2); });

您还可以仅传递QLineEdit中的文本,而不是其上的指针:

代码语言:javascript
复制
connect(ui->step2, &QLineEdit::returnPressed, [=]() { this->on_steps_returnPressed(ui->step2->text()); });

如果无论如何都要使用QSignalMapper,那么就必须使用信号QSignalMapper::mapped(QWidget*)。由于插槽必须与连接的信号具有相同的签名,因此on_steps_returnPressed变为on_steps_returnPressed(QWidget*) (将参数转换为QLineEdit):

代码语言:javascript
复制
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*)));

你的槽应该是这样的:

代码语言:javascript
复制
void on_steps_returnPressed(QWidget* widget)
{
    QLineEdit* edit = qobject_cast<QLineEdit*>(widget);
    if (!edit)
        return;
    label->setText(edit->text());
}

比较这两种解决方案的完整示例:

代码语言:javascript
复制
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;
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56377203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档