繁体   English   中英

Qt信号和不同类别的插槽

[英]Qt signals and slots in different classes

我有一个带有插槽的X类,带有信号的Y类。 我正在从类X建立连接,并在类Y中创建一个公共方法来从类X发出信号(我不确定这一步是否必要)。

然后,如果我从类X调用该方法,则发出信号,并执行插槽。 但是如果我从Y类发出信号,那么插槽永远不会执行,我不明白为什么。

我也可以在Y级坚持联系吗?

这个伪代码试图解释我想要的东西:

class X  : public QWidget {
    Q_OBJECT

X(){
    connect(Y::getInstance(), SIGNAL(updateSignal(int)), this, SLOT(updateStatus(int)));
    Y::getInstance().emitSignal(someValue); // Works
}

public slots:
    void updateStatus(int value);

}

class Y : public QObject {

Q_OBJECT

Y(){

}

public:
    Y getInstance();
    void emitSignal(int value) { 
        emit updateSignal(value);
    }


signal:
    void updateSignal(int value);
}

class Z : public Y {
Z(){

}

init(){
 emitSignal(someValue); // Doesn't work
}
}

请记住,连接不是在之间,而是在实例之间。 如果发出信号并期望调用连接的插槽,则必须在进行连接的实例上发出该信号。 那是你的问题。

假设Y是单身人士

如果你connect( Y::getInstance(), ... )

并且Y::getInstance()在某个时刻执行new Y() ,然后在建立连接之前调用Y的构造函数。 像这样,信号将被发射,但插槽将不会收听它。

除此之外,最好做以下事情之一,尽管你不能使用这些方法在Y的构造函数中发出信号:

  • 使用知道X和Y的第三类Z,并在那里进行连接
  • 依赖注入。 这意味着X在其构造函数中获取Y的实例:

依赖注入构造函数的示例:

X::X( Y* const otherClass )
{
    connect( otherClass, SIGNAL( ... ), this, SLOT( ... )
}

这很简单。 请看下面的例子。

如果你想在自己的课堂上写信号和插槽,你需要满足两个条件......

 1. Your class must inherit from QObject class or any class derived from QObject. 

2. The Q_OBJECT macro must appear in a private section in your class.

/* Sender.h */

#ifndef SENDER_H
#define SENDER_H

#include <QObject>

class Sender : public QObject
{
    Q_OBJECT
public:
    explicit Sender(QObject *parent = 0);    
    void fireSignal();

signals:
    void foo(const QString& arg);
};

#endif // SENDER_H


/* Sender.cpp*/


#include "Sender.h"

Sender::Sender(QObject *parent) :
    QObject(parent)
{
}


void Sender::fireSignal()
{
    emit foo("This a message sender is sending to receiver.");
}

现在接收者的代码如下

/* Receiver.h */

#ifndef RECEIVER_H
#define RECEIVER_H

#include <QObject>

class Receiver : public QObject
{
    Q_OBJECT
public:
    explicit Receiver(QObject *parent = 0);

public slots:
    void bar(const QString& arg);

};

#endif // RECEIVER_H

/* Receiver.cpp */

#include "Receiver.h"
#include <iostream>

Receiver::Receiver(QObject *parent) :
    QObject(parent)
{
}


void Receiver::bar(const QString &arg)
{
    std::cout << arg.toStdString();
}

现在main.cpp代码

#include <QtCore/QCoreApplication>
#include "Sender.h"
#include "Receiver.h"

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

    Sender sender;
    Receiver receiver;

    QObject::connect(&sender, SIGNAL(foo(QString)), &receiver, SLOT(bar(QString)));

    sender.fireSignal();

    return a.exec();
}

而已。

最后,如果要为connect方法使用另一种语法。 请使用以下行

QObject::connect(&sender,&Sender::foo,&receiver,&Receiver::bar);

希望这能帮到你。 谢谢

您正在从构造函数发出信号。 那时Y::getInstance()对此代码片段没有任何意义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM