C++ 信号和插槽-传递数据

C++ 信号和插槽-传递数据,c++,qt,C++,Qt,我试图将信号连接到插槽并通过向量,但我运气不太好 res = QObject::connect(storePayments, SIGNAL(existingPurchasesResponseSuccess(std::vector<QString>)), this, SLOT(RefreshPurchasesSuccess(std::vector<QString>))); 插槽: 信号: void existingPurchasesResponseSuccess(std:

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

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

信号:

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


vector<QString> previousPurchasesArray;
emit existingPurchasesResponseSuccess(previousPurchasesArray);
它说信号/槽没有定义,但当我取出向量时它起作用,所以它一定是出了问题。我给它下的定义错了吗


谢谢

如果您使用像std::vector这样的自定义结构,您必须声明并注册元类型

 Q_DECLARE_METATYPE(std::vector<QString>)
理想情况下,这个宏应该放在类或结构声明的下面。如果这是不可能的,它可以放在一个私有头文件中,每次在QVariant中使用该类型时都必须包含该头文件。-关于Q_DECLARE_元类型的Qt文档

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

 qRegisterMetaType<std::vector<QString> >();
例如,甚至在QApplication::exec之前,就可以在main中调用qRegisterMetaType

还请记住,如果类声明任何信号或插槽,则必须使用Q_对象宏

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


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

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

 Q_DECLARE_METATYPE(std::vector<QString>)
理想情况下,这个宏应该放在类或结构声明的下面。如果这是不可能的,它可以放在一个私有头文件中,每次在QVariant中使用该类型时都必须包含该头文件。-关于Q_DECLARE_元类型的Qt文档

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

 qRegisterMetaType<std::vector<QString> >();
例如,甚至在QApplication::exec之前,就可以在main中调用qRegisterMetaType

还请记住,如果类声明任何信号或插槽,则必须使用Q_对象宏

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


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

在写入信号和插槽时很容易输入错误。尝试使用typedef。请发布您得到的确切错误消息,以及您在类声明中为信号和插槽使用的确切语法。大多数地方都有std::前缀-除了最后一个地方-看起来很可疑。使用std::vector存储qstring有什么特别的原因吗?如果不是,最好使用QStringList,它是QList的typedef。如果错误是因为您尚未将srd::string注册为元类型,则可能也会解决您的问题。@hyde我得到错误QList不能resolved@hyde+1但有一个例外-它不是typedef,而是带有一些附加方法的派生类。在写出信号和插槽时,很容易出错。尝试使用typedef。请发布您得到的确切错误消息,以及您在类声明中为信号和插槽使用的确切语法。大多数地方都有std::前缀-除了最后一个地方-看起来很可疑。使用std::vector存储qstring有什么特别的原因吗?如果不是,最好使用QStringList,它是QList的typedef。如果错误是因为您尚未将srd::string注册为元类型,则可能也会解决您的问题。@hyde我得到错误QList不能resolved@hyde+1但有一个例外-它不是typedef,而是带有一些附加方法的派生类。