繁体   English   中英

Qt信号/插槽:从临时对象发出信号是错误的吗?

[英]Qt signals/slots: Is it an error to emit a signal from a temporary object?

在Qt中,如果从临时对象调用信号,这样在调用插槽时可能会删除该对象,这是一个错误吗?

如果它是相关的,代码将从临时对象的构造函数发出信号。

(注意:没有指针或引用作为参数传递,所以这不是关于悬空指针或引用的问题。我只想知道,以最简单的形式,是否可以从临时对象发出信号在Qt。)

这是我的代码的缩短版本:

// My application
class HandyApplication: public QApplication
{
    Q_OBJECT
    public:
        explicit HandyApplication( int argc, char * argv[] );

    signals:

    public slots:
        void handySlot(std::string const msg);

};

// Class that will be instantiated to a temporary object
class Handy: public QObject
{
    Q_OBJECT

    public:

        Handy()
        {
            QObject::connect(this, SIGNAL(handySignal(std::string const)), 
                 QCoreApplication::instance(),
                 SLOT(handySlot(std::string const)));

            emit handySignal("My Message");
        }

    signals:

         void handySignal(std::string const msg);

};

// An unrelated function that may be called in another thread
void myFunction()
{
    Handy temporaryObject; // This constructor call will emit the signal "handySignal" above
}

如您所见,临时对象从其构造函数发出信号,然后立即销毁。 因此,可以在发送信号的对象被破坏之后调用时隙

这是安全的,还是潜在的问题或错误情况?

您指定的是从信号到插槽的直接连接 这意味着,当你发出handySignal ,它应该去执行所有连接的插槽。 一旦所有的槽(即handySlot )都返回,那么发射器将返回并完成构造函数。

如果要指定排队连接 ,如果它是从一个线程中的信号到另一个线程中的插槽的连接,则将该请求放入要执行的事件循环中。

所以我会说:是的,从临时对象发出信号似乎很好,如果你没有传递无效的引用。

这个例子似乎有点武断,因为我没有真正意识到在构造函数中建立一个信号,然后你发出一个信号,就是这样。 你也可以只调用那个插槽,除非你期望在不同的线程中创建对象,你没有提到。

编辑:

根据@Kamil的注释,应该注意的是,如果未指定连接类型,则defailt为AutoConnection,这意味着实际类型将由目标槽是否与发送方位于不同的线程来确定。 没有线程,它将等同于DirectConnection。 使用线程,它最终将成为QueuedConnection。

我会说从一个临时对象发出的是安全的,因为QObject::destroyed “是在对象obj被销毁之前立即发出的” - Qt docs

因此,假设从临时物体发出的信号是安全和正确的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM