Нет такого сигнала в QT4 - PullRequest
2 голосов
/ 31 августа 2010

У меня есть сигнал и слот, которые должны прекрасно совмещаться.

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: Нет такого сигнала MemberVisitor :: processMember () в OperationsOnMembers.cpp: 29»

Вот код, который должен их подключить:

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

Я также попробовал все разумные альтернативы, такие как вызов функции в поиске. Но я продолжаю получать ту же проблему. Чего мне не хватает?

Ответы [ 2 ]

8 голосов
/ 31 августа 2010

Вызов connect() должен быть:

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

.. при условии, что посетитель и искатель являются указателями.

4 голосов
/ 31 августа 2010

Вам необходимо включить типы параметров (но не имена параметров) в вызов 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*)));
...