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

qRegisterMetaType は、たとえばmain()前でも呼び出すことができますQApplication::exec()

Q_OBJECTまた、クラスでシグナルまたはスロットを宣言する場合は、マクロを使用する必要があることに注意してください。

「Q_OBJECT マクロは、独自のシグナルとスロットを宣言するか、Qt のメタオブジェクト システムによって提供される他のサービスを使用するクラス定義のプライベート セクションに表示する必要があります。」

使用する理由がない場合は、Qt のメタオブジェクト システムで既に知られているstd::vector<QString>を使用する方がはるかに簡単でQStringList、コンテンツを操作するための便利なメソッドが多数用意されており、標準の Qt 型として非独自のスロット定義に適合します。

于 2012-12-29T19:31:28.693 に答える