2

スロット内でチェックしQObject::sender()ますが、このスロットを関数のように直接呼び出したいと思います。

このスロットがスロット内でどのように呼び出されたかを知ることができますか? シグナルスロットメカニズムまたは単にスロットを関数のように呼び出すことによってですか?

4

3 に答える 3

3
  1. スロットにデフォルト パラメータを追加します。

    public slots:
        void slot(bool calledBySignal = true);
    
  2. スロットを直接呼び出す場合は、パラメーターを false に設定します。

    void MyClass::method()
    {
        [...]
        slot(false);
        [...]
    }
    
  3. connect()通話はそのままにしておきます。信号に bool パラメーターを追加したり、に変更SLOT(slot())したりしないでくださいSLOT(slot(bool))

短所: パラメータの設定を忘れがちです。

スロットへの ing はクラス内からのみ処理されるため、スロットをパブリックにする必要がない場合は、スロットをconnect()プライベートにして、代わりに呼び出されるラッパー メソッドを追加する必要がありますが、それでも呼び出すときにある程度の規律が必要になります。クラスの中から。ヨハネスの提案は、これらの問題を解決するでしょう。

于 2016-09-04T20:40:49.337 に答える
2

sender()どちらの場合も確認できます。スロットがシグナル/スロット メカニズムを介して呼び出された場合、送信者はポインターを返しますが、メソッドとして呼び出された場合は null ポインターを返します。

簡単な例:

class Test : public QObject
{
    Q_OBJECT
signals:
    void signal();

public slots:
    void slot() { qDebug() << sender(); }
};

そして使用:

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

    Test test;
    Test test2;

    QObject::connect(&test, &Test::signal, &test2, &Test::slot);

    test.signal(); //slot is caled by signal
    test2.slot(); //slot is called as method directly

    return a.exec();
}

そして出力:

テスト(0xa8e8aff5b0)

QObject(0x0)

于 2016-09-04T07:40:15.913 に答える