连接预期令牌';'得到了')'

时间:2015-03-22 13:30:09

标签: c++ qt

我尝试将信号连接到我自己的插槽但是当我这样做时,我的代码会被加下划线并带有文字

  

连接预期令牌';'得到了')'

如果我放一个,它就会消失;在代码中间,但正如预期的那样,我得到编译器错误。

带下划线红色的代码:

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

3 个答案:

答案 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 ';'
};

您的连接功能调用也是错误的,请查看以下指南如何正确调用:

Qt Documentation: Signals & Slots

答案 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)) );

请参阅文档:http://doc.qt.io/qt-5/qobject.html#connect