QObject :: connect:没有这样的插槽(Qt,C ++)

时间:2016-06-09 14:34:18

标签: c++ qt connect slot

我可以运行程序,但按钮无法访问发送功能。我得到了这个提示:

  

QObject :: connect:没有这样的插槽Mail :: send(emailInput,pwdInput)

有人知道我的错误是什么?

mail.h:

#ifndef MAIL_H
#define MAIL_H

#include <QWidget>

namespace Ui {
class Mail;
}

class Mail : public QWidget
{
    Q_OBJECT

public:
    explicit Mail(QWidget *parent = 0);
    ~Mail();

public slots:
    void send(std::string email, std::string pwd);

private:
    Ui::Mail *ui;
};

#endif // MAIL_H

mail.cpp:

Mail::Mail(QWidget *parent) :
    QWidget(parent)
{

    QLineEdit *edt1 = new QLineEdit(this);
    grid->addWidget(edt1, 0, 1, 1, 1);
    std::string emailInput = edt1->text().toStdString();
    ...

    QObject::connect(acc, SIGNAL(clicked()),this, SLOT(send(emailInput, pwdInput)));
}


void Mail::send(std::string email, std::string pwd){
    ...
}

3 个答案:

答案 0 :(得分:2)

事实上,您的代码中有2个错误:

  1. SLOT宏将参数类型作为参数而不是其名称,然后代码应为:SLOT(send(std::string, std::string))
  2. 您尝试连接一个参数少于SLOT的SIGNAL,这是不可能的。
  3. 为了避免所有这些问题,您可以使用新的信号/插槽语法(如果您使用的是Qt5):

    QObject::connect(acc, &QLineEdit::clicked, this, &Mail::onClicked);
    

    我还邀请您在使用Qt时使用QString类而不是std :: string,这样会容易得多。

答案 1 :(得分:0)

这取决于你想做什么:

如果emailInputpwdInput来自小部件,则必须编写一个中间插槽来获取值并调用send。

如果它们是局部变量,最简单的可能是使用lambda。

答案 2 :(得分:0)

应该是

QObject::connect(acc, SIGNAL(clicked()),this, SLOT(send(std::string, std::string)));

SIGNALSLOT期望方法的签名为参数。

此外,您可以将信号连接到较小的插槽,而不是反之亦然;在这里,QObject不会简单地知道什么应该替换插槽的参数。您可以使用connect的重载接受任意Functor(最有可能是匿名闭包)作为插槽:

QObject::connect(acc, SIGNAL(clicked()), [=](){ send(std::string(), std::string()); });

第三,如果您使用QString而不是std::string,那么在传递值时,您不会有那么重的副本开销。