代码之家  ›  专栏  ›  技术社区  ›  Cobus Kruger

第4季度无此信号

  •  2
  • Cobus Kruger  · 技术社区  · 14 年前

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

    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:29中没有这样的信号memberVisitor::processmember()”

    下面是连接它们的代码:

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

    我还尝试了所有合理的选择,比如调用finder上的函数。但我还是有同样的问题。我错过了什么?

    2 回复  |  直到 14 年前
        1
  •  8
  •   Arnold Spence    14 年前

    呼唤 connect() 应该是:

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

    …前提是访问者和查找器是指针。

        2
  •  4
  •   Fred    14 年前

    您需要在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*)));