如果QString是本地的,那么使用QString发出信号的正确方式是什么。我的意思是,我在wigdetA中有这样的函数
void wigdetA::something()
{
//
//e.g
//
QTreeWidgetItem *it = this->treeWidget->currentItem();
if (it == 0)
return;
QString s = it->text(1);
emit passToMainWindow(s);
}我应该像这样创建连接(只需const QString):
connect(wigdetA, SIGNAL(passToMainWindow(const QString)), this, SLOT(passToMainWindow(const QString)));或者我可以使用const引用吗?
connect(wigdetA, SIGNAL(passToMainWindow(const QString&)), this, SLOT(passToMainWindow(const QString&)));这两种方法都可以工作,但我认为第二个const&将使应用程序崩溃,因为QString s是本地的,当函数QString()退出时,它将被销毁。
还是我漏掉了什么?
发布于 2013-01-08 22:17:56
由于发送和接收对象都在主线程中,因此Qt使用直接连接(当您发出对象时,将立即调用插槽)。在这种情况下,您的本地字符串仍然在堆栈上。
但是,通过值传递总是更好,特别是在驻留在不同线程中的对象之间建立连接的情况下。QString使用隐式共享(也称为写入时复制),因此通过值传递它的成本并不高。
发布于 2019-09-13 19:06:37
对于Qt5,新的连接系统要求两个插槽具有相同的参数类型,并且将带有QString参数的信号连接到带有const QString &的插槽将不起作用。
ObjType1 : QObject {
Q_OBJECT
...
signals :
sendInfo(QString)
}
ObjType2 : QObject {
Q_OBJECT
...
public slots:
slotObjType1::receiveInfo(const QString&)
...
}
void ObjTyp3::someFunction{}(
...
connect(mpObj1, &ObjType1::sendInfo, mpObj2, &ObjType2::receiveInfo); // shows an error because arguments does not match
...
}如果我们考虑多线程问题,那么通过值传递将是更安全和更可维护的操作方式。然而,许多文档显示了带有"const QString&“参数的槽,尽管它不允许连接带有QString参数的信号。在不使用直接连接时,复制(const QString &)值的“连接”机制有什么神奇之处吗?有没有理由让每个人都使用带有QString引用的信号?
发布于 2013-01-08 22:18:05
emit passToMainWindow(s)将在发出时调用主窗口中的插槽。所以这没什么大不了的。在处理qt槽时,它们主要使用const QString&,所以我猜框架会注意字符串在被槽使用之前不会被删除。
https://stackoverflow.com/questions/14216600
复制相似问题