在QT4中没有这样的信号

时间:2010-08-30 22:14:58

标签: c++ qt qt4 signals-slots

我有一个信号和插槽应该非常合适。

class MemberVisitor: public QObject
{
    Q_OBJECT
signals:
    void processMember(Member* member, bool &breakLoop);
public:
    void processList(QList<Member*>* list);
};

以及:

class MemberFinder: public QObject
{
    Q_OBJECT
public slots:
    void processMember(Member* member, bool &breakLoop);
public:
    Member* member();
    MemberFinder(QString memID): m_member(0), m_memID(memID) {};
private:
    Member* m_member;
    QString m_memID;
};

不完全复杂,对吗?但我肯定错过了一些东西,因为QT一直给我错误:“Object :: connect:在OperationsOnMembers.cpp中没有这样的信号MemberVisitor :: processMember():29”

这是应该挂起它们的代码:

QObject::connect(visitor, SIGNAL(processMember()), finder, SLOT(processMember()));

我也尝试了所有合理的选择,比如在finder上调用函数。但我一直遇到同样的问题。我错过了什么?

2 个答案:

答案 0 :(得分:8)

connect()的调用应为:

QObject::connect(visitor, SIGNAL(processMember(Member*, bool&)), 
    finder, SLOT(processMember(Member*, bool&)));

..前提是访客和发现者是指针。

答案 1 :(得分:4)

您需要在QObject :: connect()调用中包含参数类型(但不包括参数名称)。 e.g。

QObject::connect(visitor, SIGNAL(processMember(Member*, bool&)), finder, SLOT(processMember(Member*, bool&)));

这也可以让你重载信号和插槽,这样你就可以发出同名但不同参数的信号(与函数重载相同,基本上就是一个插槽)。

这也可以让您将信号连接到参数较少的插槽。如果您的会员发现者有第二个插槽:

class MemberFinder: public QObject
{
    Q_OBJECT
public slots:
    void processMember(Member* member, bool &breakLoop);
    void processMember(Member* member);
public:
    Member* member();
    MemberFinder(QString memID): m_member(0), m_memID(memID) {};
private:
    Member* m_member;
    QString m_memID;
};

您可以将相同的信号连接到第二个插槽:

QObject::connect(visitor, SIGNAL(processMember(Member*, bool&)), finder, SLOT(processMember(Member*)));