qt 断开信号和槽有两种方式:

  1. 对象释放, 发送信号的对象或者接收信号的对象之一释放之后,它们直接的信号槽连接会自动断开
  2. disconnect 函数,disconnect 函数主动断开信号槽连接。它有许多的重载形式。

disconnect 函数用法

静态方法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
bool  QObject::disconnect(const QObject* sender,
                          const char* signal,
                          const QObject* receiver,
                          const char* method);

bool QObject::disconnect(const QObject* sender,
                         const QMetaMethod& signal,
                         const QObject* receiver,
                         const QMetaMethod& method);

template <typename PointerToMemberFunction>
bool QObject::disconnect(const QObject *sender,
                         PointerToMemberFunction signal,
                         const QObject *receiver,
                         PointerToMemberFunction method)

断开 sendersignal 信号和 receivermethod 方法之间的连接。

nullptr 等价于 QMetaMethod()

它一般有三种用法:

  1. 断开一个发送者所有信号相关的连接

    1
    2
    3
    4
    
    disconnect(myObject, nullptr, nullptr, nullptr, nullptr);
    
    // 等价于非静态重载函数
    myObject->disconnect();
    
  2. 断开一个发送者指定信号的所有槽函数

    1
    2
    3
    4
    
    disconnect(myObject, SIGNAL(mySignal()), nullptr, nullptr);
    
    // 等价于非静态重载函数
    myObject->disconnect(SIGNAL(mySignal()));
    
  3. 断开一个发送者于一个接收者的所有连接

    1
    2
    3
    4
    
    disconnect(myObject, nullptr, myReceiver, nullptr);
    
    // 等价于非静态重载函数
    myObject->disconnect(myReceiver);
    

    nullptr 可以表示任何信号,任何接收者对象,一个接收者对象的任何槽函数。

    sender 永远不能为 nullptr

    如果 signalnullptr ,它会断开所有信号的槽连接,否者只会断开指定信号的槽连接。

    如果 receivernullptr ,它会断开所有的连接到信号的槽函数。否者只有指定的 receiver 的槽函数的连接会被断开。

    如果 methodnullptr ,断开一个 receiver 所有槽函数的连接。如果 receivernullptrmethod 必须为 nullptr

成员方法

1
bool QObject::disconnect(const QObject* receiver, const char* method = nullptr) const

断开 receivermethod 之间的连接,如果 methodnullptr ,断开所有的槽函数的连接。

1
2
3
bool QObject::disconnect(const char *signal = nullptr,
                         const QObject *receiver = nullptr,
                         const char *method = nullptr) const

断开 this 的信号与 receivermethod 之间的连接。测试用