QT4中没有这样的信号

Posted

技术标签:

【中文标题】QT4中没有这样的信号【英文标题】:No such signal in QT4 【发布时间】:2010-08-30 22:14:58 【问题描述】:

我有一个信号和一个插槽,应该可以很好地结合在一起。

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: No such signal MemberVisitor::processMember() in OperationsOnMembers.cpp:29”

这是应该连接它们的代码:

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

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

【问题讨论】:

您是否尝试过将 breakLoop 参数更改为指针而不是通过 ref 传递? 【参考方案1】:

connect() 的调用应该是:

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

..前提是visitor和finder是指针。

【讨论】:

【参考方案2】:

您需要在 QObject::connect() 调用中包含参数类型(但不是参数名称)。例如

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*)));

【讨论】:

以上是关于QT4中没有这样的信号的主要内容,如果未能解决你的问题,请参考以下文章

Qt4 插槽和信号:Qt4 无法找到信号

QT4 设计器在信号/槽编辑器中不接受“&”引用和“”空格字符

Qt4 中的信号和槽

Qt4中的信号和插槽 - 不工作

Qt Jambi (Qt4Dotnet):区分插槽中的信号发射器

Qt 信号槽