我试图将信号连接到一个插槽并通过一个矢量,但我没有太多运气。
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);
它表示信号/插槽没有定义,但是当我取出矢量时它起作用,所以它一定是错的。我定义错了吗?
由于
答案 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类型适合非你的插槽定义。