在QT中,为什么父级可以使用子级信号?
我有一个类A:public QMainwindow,我在类A中添加了一个信号,只命名为signal_one(),我有另一个类B,只包含成员QMainwindow*mw,mw可以连接signal_one() 这是主要的在QT中,为什么父级可以使用子级信号?,qt,parent-child,signals-slots,Qt,Parent Child,Signals Slots,我有一个类A:public QMainwindow,我在类A中添加了一个信号,只命名为signal_one(),我有另一个类B,只包含成员QMainwindow*mw,mw可以连接signal_one() 这是主要的 #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
#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();
}
所以,有人可以解释这一点?要使用Qt信号插槽连接,两个连接的类都必须从
QObject
继承。在代码类中,A
隐式继承自QObject
。但是classB
不是。
此代码适用于:
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.进行了一些更改以使信号可用。没有
QObject
内部和Q\u对象
宏,它不工作:
// 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
}
//文件A.h
类A:公共QMainWindow//隐式继承QObject
{
Q_OBJECT//别忘了调用此宏
信号:
void signal_one();//对象中的某些事件必须发出此信号
}
//文件B.h
B类:public QObject//如果没有此继承,则无法获取插槽/信号
{
Q_OBJECT//别忘了这个
公众:
B(){}
公众时段:
空槽_one()
{
//获取信号
}
}
//将A的对象与B的对象连接到某处,例如main.cpp中
#包括
#包括
int main(int argc,int*argv[]
{
质量保证申请a(argc、argv);
A A;
B B;
QObject::连接(&a,信号(&U one()),&b,插槽(&U one());
//或
//QObject::connect(&a,&a::signal_one,&b,&b::slot_one);
返回a.exec();//我们需要运行事件循环
}
但是,如果使用信号(signal\u one())
语法,mw没有signal\u one(),它将使用元对象在运行时创建连接。如果该信号不可用,则可能导致运行时错误。要进行编译时检查,您应该选择新语法:connect(mw,&A::signal\u one,this,&B::slot\u one)代码>(如果我没记错的话。我已经有一段时间没有使用Qt了)@derM,你完全正确。我只是从问题中选取这一部分。也许,作者有一些原因。我不确定我是否理解这个问题,但阅读这篇文章可能会有所帮助:它就是这样设计的。例如,文档中写到“您可以对小部件进行子类化以向其添加我们自己的信号”。
// 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
}