Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在QT中,为什么父级可以使用子级信号?_Qt_Parent Child_Signals Slots - Fatal编程技术网

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

在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

我有一个类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);
   emit a->signal_one();
   return app.exec();
}

所以,有人可以解释这一点?

要使用Qt信号插槽连接,两个连接的类都必须从
QObject
继承。在代码类中,
A
隐式继承自
QObject
。但是class
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.进行了一些更改以使信号可用。

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