我有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();
}
那么,有人可以解释吗?
答案 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
}