信号和槽-传递数据

Signals and Slots - Passing Data

本文关键字:数据 信号      更新时间:2023-10-16

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

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

它说信号/槽没有定义,但是当我取出向量时,它工作,所以它一定是有问题的。我定义错了吗?

谢谢

如果你使用像std::vector<QString>这样的自定义结构,你必须声明和注册元类型

 Q_DECLARE_METATYPE(std::vector<QString>)

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

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

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

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

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

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

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