信号和插槽 - 传递数据

时间:2012-12-29 16:23:36

标签: c++ qt

我试图将信号连接到一个插槽并通过一个矢量,但我没有太多运气。

res = QObject::connect(storePayments, SIGNAL(existingPurchasesResponseSuccess(std::vector<QString>)), this, SLOT(RefreshPurchasesSuccess(std::vector<QString>)));

插槽:

void RefreshPurchasesSuccess(std::vector<QString>);

void Store::RefreshPurchasesSuccess(std::vector<QString> previousPurchasesArray)
{
 //do something
}

信号:

void existingPurchasesResponseSuccess(std::vector<QString>);


vector<QString> previousPurchasesArray;
emit existingPurchasesResponseSuccess(previousPurchasesArray);

它表示信号/插槽没有定义,但是当我取出矢量时它起作用,所以它一定是错的。我定义错了吗?

由于

1 个答案:

答案 0 :(得分:6)

如果使用std::vector<QString>之类的自定义结构,则必须声明并注册元类型

 Q_DECLARE_METATYPE(std::vector<QString>)

“理想情况下,此宏应放在类或结构的声明下面。如果不可能,则可以将其放入私有头文件中,每次在QVariant中使用该类型时都必须包含该文件。 “ - 关于Q_DECLARE_METATYPE的Qt文档

对于排队连接,您可能需要qRegisterMetatype

 qRegisterMetaType<std::vector<QString> >();

qRegisterMetaType可以在main()中调用,甚至可以在QApplication::exec()之前调用。

另外请记住,如果您的类声明了任何信号或插​​槽,则必须使用Q_OBJECT宏。

“Q_OBJECT宏必须出现在类定义的私有部分中,该部分定义声明自己的信号和插槽,或使用Qt的元对象系统提供的其他服务。”

如果您没有理由使用std::vector<QString>,那么使用QStringList会更加简单,这是Qt的元对象系统已知的,它提供了许多方便的方法来操纵其内容,并且标准的Qt类型适合非你的插槽定义。