当Qt信号/插槽连接失败时,如何收到警报?

时间:2014-04-25 07:17:00

标签: c++ qt debugging qt5 signals-slots

我们在使用connect来自/不存在的信号/插槽时会浪费很多时间,因为Qt仅在控制台日志记录的某处警告我们在运行时

除了使用类型系统报告这些问题的Qt5以及系统中所有connect调用的changing code之外,还有另一种方法可以使用 Qt运行时,例如当连接错误时,抛出,或者只是崩溃,或者大声提醒

5 个答案:

答案 0 :(得分:3)

您可以在connect上使用包装器,当某些连接失败时暂停程序:

inline void CHECKED_CONNECT( const QObject * sender, const char * signal,
             const QObject * receiver,  const char * method,
             Qt::ConnectionType type = Qt::AutoConnection )
{
  if(!QObject::connect(sender, signal, receiver, method, type))
   qt_assert_x(Q_FUNC_INFO, "CHECKED_CONNECT failed", __FILE__, __LINE__);
}

答案 1 :(得分:2)

我的紧凑型变体如下:

// BoolVerifier.h
#include <cassert>    

class BoolVerifier
{
public:
    BoolVerifier() = default;
    inline BoolVerifier(bool b) { assert(b); (void)(b); }
    inline BoolVerifier& operator=(bool b) { assert(b); (void)(b); return *this; }
};

和用法:

BoolVerifier b;
b = connect(objectFrom, SIGNAL(mySignal1(int)), objectTo, SLOT(mySlot1(int)));
b = connect(objectFrom, SIGNAL(mySignal2(int)), objectTo, SLOT(mySlot2(int)));
...

答案 2 :(得分:1)

最简单的解决方案是:

bool ok = QObject::connect(sender, SIGNAL(mySignal()), receiver, SLOT(mySlot());
Q_ASSERT_X(ok, Q_FUNC_INFO, "connect mySignal to mySlot");

下面的变体是一个错误,在发布模式下变为无操作:

Q_ASSERT_X(QObject::connect(sender, SIGNAL(mySignal()),
                            receiver, SLOT(mySlot()),
                            Q_FUNC_INFO, "connect mySignal to mySlot");

如果没有定义相应的调试宏,则在发布模式下将完全删除此表单。

如果你想投掷,那么你可以从这里开始:

try {
    if (!QObject::connect(sender, SIGNAL(mySignal()), receiver, SLOT(mySlot()))
        throw ...;
} catch ( .. )
    qDebug() << "Could not connect ...";
    qApp->exit(1);
}

你真的应该考虑使用Qt 5和C ++ 11支持的新信号/插槽语法,它会产生编译时警告。

这会导致类似:

connect(sender, &Sender::mySignal, mySlot);

由于相关代码的位置,您甚至可以使用lambda来简化并更容易理解:

connect(sender, &Sender::valueChanged, [=](const QString &newValue) {
    receiver->updateValue("senderValue", newValue);
} );

答案 3 :(得分:1)

QObject::connect返回QMetaObject::Connection,可通过其bool运算符进行测试:

  

如果连接有效,则返回true。

另一个选择可能是&#34;重新路由&#34;并解析自动生成的调试消息以查找连接错误。

答案 4 :(得分:1)

当连接失败时,Qt发送QWarning消息。

您可以使用一个使用qInstallMessageHandler的帮助程序类来捕获此消息,并在开发模式下使您的应用程序崩溃,或解析警告并仅在连接错误时崩溃。
(见How to redirect qDebug, qWarning, qCritical etc output?