我可以运行程序,但按钮无法访问发送功能。我得到了这个提示:
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){
...
}
答案 0 :(得分:2)
事实上,您的代码中有2个错误:
SLOT(send(std::string, std::string))
。为了避免所有这些问题,您可以使用新的信号/插槽语法(如果您使用的是Qt5):
QObject::connect(acc, &QLineEdit::clicked, this, &Mail::onClicked);
我还邀请您在使用Qt时使用QString类而不是std :: string,这样会容易得多。
答案 1 :(得分:0)
这取决于你想做什么:
如果emailInput
和pwdInput
来自小部件,则必须编写一个中间插槽来获取值并调用send。
如果它们是局部变量,最简单的可能是使用lambda。
答案 2 :(得分:0)
应该是
QObject::connect(acc, SIGNAL(clicked()),this, SLOT(send(std::string, std::string)));
宏SIGNAL
和SLOT
期望方法的签名为参数。
此外,您可以将信号连接到较小的插槽,而不是反之亦然;在这里,QObject不会简单地知道什么应该替换插槽的参数。您可以使用connect
的重载接受任意Functor
(最有可能是匿名闭包)作为插槽:
QObject::connect(acc, SIGNAL(clicked()), [=](){ send(std::string(), std::string()); });
第三,如果您使用QString
而不是std::string
,那么在传递值时,您不会有那么重的副本开销。