6

スロットのあるクラス 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
}
}
4

3 に答える 3

7

接続はクラス間ではなく、インスタンス間であることに注意してください。シグナルを発行し、接続されたスロットが呼び出されることを期待する場合は、接続が確立されたインスタンスで発行する必要があります。それはあなたの問題だ。

Y がSingletonであると仮定します:

もしあなたがそうするならconnect( Y::getInstance(), ... )

そしてある時点でY::getInstance()行うと、接続が設定される前に Y のコンストラクターが呼び出されます。そのように、信号は発信されますが、スロットはまだそれをリッスンしません。new Y()

それとは別に、次のいずれかを行うのが最善ですが、これらのアプローチでは Y のコンストラクターでシグナルを発行できませんでした。

  • X と Y の両方を知っている 3 番目のクラス Z を使用し、そこで接続を行います
  • 依存性注入。つまり、X はそのコンストラクターで Y のインスタンスを取得します。

依存性注入コンストラクターの例:

X::X( Y* const otherClass )
{
    connect( otherClass, SIGNAL( ... ), this, SLOT( ... )
}
于 2012-06-05T12:09:15.250 に答える
5

それは簡単です。以下の例を参照してください。

独自のクラスにシグナルとスロットを書きたい場合は、2 つの条件を満たす必要があります...

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);

これがお役に立てば幸いです。ありがとう

于 2016-04-28T07:15:58.763 に答える
0

コンストラクターからシグナルを発しています。その時点でY::getInstance()は、このコード断片によると意味がありません。

于 2012-06-05T11:18:29.690 に答える