连接const QString&或const QString

时间:2013-01-08 14:02:17

标签: qt

如果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&)));

两种方式都有效,但我认为第二种方法是因为QString是本地的,所以会崩溃应用程序,当函数something()退出时它将被销毁。

或者我错过了什么?

3 个答案:

答案 0 :(得分:1)

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

然而,通过值传递它总是更好,特别是如果在驻留在不同线程中的对象之间建立连接。 QString使用隐式共享(也称为写时复制),因此按值传递它不会花费太多。

答案 1 :(得分: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引用的信号吗?

答案 2 :(得分:0)

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