1. ホーム
  2. c++

[解決済み] QObject::connectとconnectメソッドの違いについて

2022-02-15 09:58:41

質問

私はQtの初心者です。Qtの開発者は、ほとんどの場合、オブジェクトの通信にシグナルとスロットを使用する必要があります。これまで、シグナルとスロットの接続方法を2つ見てきました。

1)QObject::connect(scrollBar, SIGNAL(valueChanged(int)),label,  SLOT(setNum(int)));

2)connect(scrollBar, SIGNAL(valueChanged(int)),label,  SLOT(setNum(int)));

両者の正確な違いは何でしょうか?なぜ、最初のメソッドではQObjectをプレフィックスにしなければならないのでしょうか?

どのように解決するのですか?

前述の両方のケースでスタティック版を呼び出すのですが、そのシグネチャは以下の通りです。

QMetaObject::Connection QObject::connect(const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoConnection) [static].

QObjectのサブクラスの内部で接続していないときは、呼び出すオブジェクトがないため、それぞれscoped variantを使用する必要があります。ここでは、その違いを表すいくつかのコードを見てみましょう。

スコープなし

class MyClass : public QObject
{
    Q_OBJECT
    public:
        MyClass(QObject *parent) : QObject(parent) {
            connect(this, SIGNAL(mySignal()), SLOT(mySlot()));
        }

    public signals:
        void mySignal();

    public slots:
        void mySlot();
};

スコープ

int main(int argc, char **argv)
{
    QCoreApplication a(argc, argv);
    MyClass myObject;
    QObject::connect(&myObject, SIGNAL(mySignal()), &myObject, SLOT(mySlot()));
    return a.exec();
}

もし、Receiverオブジェクトの中でこの接続を行おうとするならば、ドキュメントにあるように、非静的constバージョンは自動的にこの処理を行うので、利便性(すなわち、タイピングの軽減)のために第3引数をスキップすることもできることに留意してください。

QMetaObject::Connection QObject::connect(const QObject * sender, const char * signal, const char * method, Qt::ConnectionType type = Qt::AutoConnection) const

この関数は、connect()をオーバーロードします。

送信者オブジェクトからのシグナルをこのオブジェクトのメソッドに接続します。

connect(sender, signal, this, method, type)と同等です。

接続するたびにシグナルが発生するので、重複して接続すると2つのシグナルが発生します。接続を解除するには、disconnect() を使用します。