常量-REF Qt中发送信号时(const-ref when sending signals in

2019-06-24 02:42发布

这是我从来没有完全与常量-REF有一件事,我真的希望有人能向我解释。

当调用另一个函数的内部函数,我得到的常量,裁判是最好的方式传递,我不打算乱动栈对象时。 例如:

void someInnerFunction(const QString& text) {
    qDebug() << text;
}

void someFunction() {
    QString test = "lala";
    ....
    someInnerFunction(test);
}

到目前为止好,我猜。 但怎么样的信号? 是不是有自带的传递引用任何风险? 虽然它的const 。 这感觉就像我一直在阅读所有关于常量-REF的文档,但我仍然觉得有点冒险,因为我把它理解为“发送到一个对象的引用,并保持其const ”。 如果它是指对象超出范围是什么?

例如:

void someFunction() {
    connect(this, SIGNAL(someSignal(const QString&)), this, SLOT(someSlot(const QString&)));

    QString test = "lala";
    emit someSignal(test);

    // doesnt test go out of scope here? and since im not using queued connection the QString object doesnt get copied. 
}

void someSlot(const QString& test) {
    qDebug() << test; // will this work?
}

究竟发生什么事吗? 我经常使用const的,裁判的函数调用,我只是想访问对象,但不能改变它。 但怎么样的信号? 大多数的信号似乎都在Qt的文档常量-REF PARM,但它是如何工作的?

Answer 1:

根据这个答案 ,Qt的只是替换副本常量引用。

编辑:显然并不总是这样......我只是做了一个基本的测试程序和一个线程,并引用已被正确地传递。 它的常量性仍然完好无损,以及。 不管怎么说,是的,你需要警惕的变量走出去的范围,再加上你不能发送跨线程引用这种方式。 如果你这样做,复印件将被传递。

要回答你的榜样的意见的问题,是的,它会不管它是直接或排队的连接工作。 如果是直接连接,它会工作,因为someSlot()将前执行someFunction()完成; 如果它是一个排队的连接,它会奏效,因为test将被复制,而不是按引用传递。



Answer 2:

这里是展示如何Qt的信号/插槽管理复制了很好的示范: http://www.embeddeduse.com/2013/06/29/copied-or-not-copied-arguments-signals-slots/



Answer 3:

在Qt中,发光被连接到一个或多个时隙的信号时,它等同于一个同步函数调用...除非你已配置了信号和槽使用排队的连接,然后它是一个异步调用,你应该通过堆栈数据又仿佛将数据传递到另一个线程应该通过副本的时候小心。



文章来源: const-ref when sending signals in Qt