我们在使用connect
来自/不存在的信号/插槽时会浪费很多时间,因为Qt仅在控制台日志记录的某处警告我们在运行时。
除了使用类型系统报告这些问题的Qt5以及系统中所有connect
调用的changing code之外,还有另一种方法可以使用 Qt运行时,例如当连接错误时,抛出,或者只是崩溃,或者大声提醒?
答案 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?)