2012-12-29 4 views
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); 

는 신호/슬롯이 정의되지 않은 말한다, 그러나 나는 그것이 작동하는 벡터를 꺼내, 그래서 때 뭔가해야합니다 그걸로 잘못 됐어. 나는 그것을 잘못 정의하고 있는가? 당신이 std::vector<QString> 같은 사용자 정의 구조를 사용하는 경우 메타 타입을

Q_DECLARE_METATYPE(std::vector<QString>) 

"이상적으로,이 매크로는 클래스 또는 구조체의 선언 아래에 배치해야합니다. 즉,없는 경우를 선언하고 등록해야합니다

감사

+0

신호 및 슬롯을 쓸 때 오타를 만들기 쉽습니다. typedef를 시도하십시오. – user1095108

+2

정확한 오류 메시지와 신호 및 슬롯에 대한 클래스 선언에있는 _exact_ 구문을 게시하십시오. (대부분의 장소에'std ::'접두사가 있습니다 - 좋은 점 - 마지막 장소를 제외하고 - 의심 스러워요.) – Mat

+1

'std :: vector'를 사용하여'QString'을 저장하는 특별한 이유는 무엇입니까? 그렇지 않다면'QList '에 typedef 인'QStringList'를 사용하십시오. 'srd :: string'을 메타 타입으로 등록하지 않았기 때문에 오류가 발생해도 문제를 해결할 수 있습니다 (필요한 경우 확실하지 않음). – hyde

답변

6

가능하다면, 그것은 QVariant에서 그 타입이 사용될 때마다 포함 되어야만하는 개인 헤더 파일에 둘 수 있습니다. " - 대기 연결의 Q_DECLARE_METATYPE

에 Qt는 문서는 당신이 qRegisterMetatype

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

qRegisterMetaType 심지어 QApplication::exec() 전에 main() 예를 들면 호출 할 수 있습니다해야 할 수도 있습니다.

클래스가 신호 또는 슬롯을 선언하는 경우 Q_OBJECT 매크로를 사용해야합니다.

"Q_OBJECT 매크로는 자체 신호와 슬롯을 선언하거나 Qt의 메타 오브젝트 시스템에서 제공하는 다른 서비스를 사용하는 클래스 정의의 개인 섹션에 나타나야합니다."

std::vector<QString>을 사용할 이유가 없다면 Qt의 메타 오브젝트 시스템에 이미 알려진 QStringList을 사용하는 것이 훨씬 간단 할 것이며, 콘텐츠를 조작하는 데 편리한 방법을 많이 제공하며 표준 Qt 유형이 귀하의 슬롯 정의가 아닙니다.