我尝试将信号连接到我自己的插槽但是当我这样做时,我的代码会被加下划线并带有文字
如果我放一个,它就会消失;在代码中间,但正如预期的那样,我得到编译器错误。连接预期令牌';'得到了')'
带下划线红色的代码:
connect(name,SIGNAL(textChanged(QString)),this,SLOT(content->sections->fields[count].onActionFieldName(QString)));
没有下划线但编译错误:
connect(name,SIGNAL(textChanged(QString)),this,SLOT(content->sections->fields[count].onActionFieldName(QString);));
我最好的猜测是,导致该错误的其他因素比代码的那部分更多,并且发现编译器并不喜欢我有一个&#39 ;;'在我的功能声明之后。并且它还抱怨它返回无效。
#include <QString>
class Field
{
public:
QString label;
QString content;
Field();
virtual ~Field();
void virtual Save();
public slots:
void onActionFieldName(QString name); //16: error: C2238: unexpected token(s) preceding ';'
};
答案 0 :(得分:4)
为了能够利用信号和槽,你的类必须从QObject继承并定义一个宏&#34; QObject&#34;。
class Field : public QObject
{
Q_OBJECT
public:
QString label;
QString content;
Field();
virtual ~Field();
void virtual Save();
public slots:
void onActionFieldName(QString name); //16: error: C2238: unexpected token(s) preceding ';'
};
您的连接功能调用也是错误的,请查看以下指南如何正确调用:
答案 1 :(得分:1)
要使用信号和插槽,你的类需要继承szulak指出的QObject,但也要:
connect(name,SIGNAL(textChanged(QString)),this,SLOT(content->sections->fields[count].onActionFieldName(QString);));
这是错误的,QObject::connect()
的语法是
QObject::connect(sender, SIGNAL(signalEmitted()), receiver, SLOT(onSignalEmitted());
根据您的情况,接收器应该是&(content->sections->fields[count])
而不是this
答案 2 :(得分:0)
一旦处理编译错误(如@szulak所述) - 您不必明确地将插槽连接到信号。您可以按照此处所述使用自动连接机制:Qt: Connecting signals and slots
因此,要对某个名为textChanged(QString)
的窗口小部件的name
信号作出反应,就足以声明:
public slots:
void on_name_textChanged(QString name)
尽管如此 - 如果您选择手动连接,您的connect语句应如下所示:
connect( name, SIGNAL(textChanged(QString)), this, SLOT(onActionFieldName(QString)) );