1

我试图将信号连接到插槽并通过向量,但我运气不佳。

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);

它说未定义信号/插槽,但是当我取出矢量时它起作用了,所以它一定有问题。我定义错了吗?

谢谢

4

1 回答 1

9

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

 Q_DECLARE_METATYPE(std::vector<QString>)

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

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

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

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

还要记住,Q_OBJECT如果你的类声明了任何信号或槽,你必须使用宏。

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

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

于 2012-12-29T19:31:28.693 回答