【发布时间】:2015-11-12 21:14:58
【问题描述】:
Qt Documentation 声明:
从 Qt 的信号槽连接机制调用的槽中抛出异常被认为是未定义的行为,除非它在槽内处理
我希望在其中一个 UI 对象中设置错误文本。一个优雅的方法是信号/槽机制。由于我可以在插槽中有异常(如果我也在插槽中处理它们),问题仍然存在:
从异常处理程序中发出信号是否安全?
一个相关的问题是连接机制:
使用排队连接更好(或更差),还是直接连接可以?
我想做这样的事情:
class myclass : public QObject
{
Q_OBJECT
public:
myclass() {}
signals:
void error_message(const std::string &);
public slots:
void do_mogrify()
{
try {
// complex function that may throw
} catch (std::exception & e) {
emit error_message(std::string(e.what()));
}
}
}
更新:
Craig Scott 在他的回答中指出,在执行 slot 函数时,提供给信号的参数可能不再存在。因此,我已将示例更改为使用 std::string,如果需要(排队连接)将被复制。我想它也适用于引用。
我想强调一下,这个问题不是关于线程的。从线程发出信号在Qt Documentation 和here 和here 中进行了介绍。
【问题讨论】: