5

如果 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 是本地的,并且当函数 something() 退出时它将被破坏。

或者我错过了什么?

4

3 回答 3

2

由于发射和接收对象都在主线程中,Qt 使用直接连接(当你发射时立即调用插槽)。在这种情况下,您的本地字符串仍在堆栈上。

但是,最好通过值传递它,尤其是在驻留在不同线程中的对象之间建立连接时。QString 使用隐式共享(也称为写时复制),因此按值传递它的成本并不高。

于 2013-01-08T14:17:55.760 回答
1

对于 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 参考的信号吗?

于 2019-09-13T11:06:36.957 回答
0

emit passToMainWindow(s)在主窗口中调用插槽,因为它被发射。所以这没什么大不了的。在处理他们主要使用的 qt 插槽时const QString&,我猜框架会注意字符串在被插槽使用之前不会被删除。

于 2013-01-08T14:18:04.993 回答