В QT, почему родитель может использовать дочерний сигнал? - PullRequest
0 голосов
/ 29 января 2019

У меня есть класс A: общедоступное QMainwindow, и я добавляю сигнал в класс A, просто назову signal_one (), у меня есть другой класс B, просто есть член QMainwindow * mw, и mw может подключить signal_one ().

    class A : public QMainWindow
    {
      Q_OBJECT
    Q_signal:
       void signal_one();
    };
    class B
    {
       Q_OBJECT

       B(QMainWindow* mainwindow)
       {
        mw = mainwindow;
        connect(mw,SIGNAL(signal_one()),this,SLOT(slot_one()));
       }
    public slots:
        void slot_one();
    public: 
        QMainWindow* mw;
    };

вот главное

#include "A.h"
#include "B.h"

int main(int argc, char **argv)
{
   QApplication app(argc, argv);
   A* a = new A;
   a->show();
   B* b(a);
   emit a->signal_one();
   return app.exec();
}

Итак, кто-то может это объяснить?

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Без QObject макросов и Q_OBJECT макросов это не работает:

// file A.h
class A : public QMainWindow // implicitly inherits QObject
{
    Q_OBJECT // don't forget call this MACROS
signals:
    void signal_one(); // some event in the object must emit this signal
}

// file B.h
class B : public QObject // without this inheritance you cannot get slots/signals behaviour
{
    Q_OBJECT // don't forget this one
public:
    B() {}
public slots:
    void slot_one()
    {
        // get signal
    }
}

// connect an A's object with a B's object somewhere, for example in main.cpp

#include <A.h>
#include <B.h>

int main(int argc, int* argv[])
{
    QApplication a(argc, argv);

    A a;
    B b;
    QObject::connect( &a, SIGNAL(signal_one()), &b, SLOT(slot_one()) );
    // or 
    // QObject::connect(&a, &A::signal_one, &b, &B::slot_one);

    return a.exec(); // we need to run event loop
}
0 голосов
/ 29 января 2019

Чтобы использовать соединение Qt signal-slot, оба подключенных класса должны быть унаследованы от QObject.В вашем коде класс A неявно наследуется от QObject.Но класса B нет.Этот код работает:

class A : public QMainWindow
{
signals:
    void signal_one();
};
class B : public QObject
{
    Q_OBJECT
    B(A* mainwindow)
    {
        mw = mainwindow;
        connect(mainwindow, SIGNAL(signal_one()), this, SLOT(slot_one()));
    }
public slots:
    void slot_one();

public:
    QMainWindow* mw;
};

PS Внесены некоторые изменения, чтобы сделать сигнал доступным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...