在QT中,为什么父母可以使用子信号?

时间:2019-01-29 03:03:57

标签: qt parent-child signals-slots

我有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 :(得分:1)

要使用Qt信号槽连接,必须从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;
};

P.S。进行了一些更改以使信号可用。

答案 1 :(得分:0)

如果没有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
}