2014-10-14 9 views
6

Czy mogę użyć typu szablonu w jakikolwiek sposób jako argumentu gniazda lub sygnału? Jako przykład, próbuję zdefiniować następujące:Jak używać typów szablonów jako parametrów szczeliny i sygnału w wielu wątkach?

void exampleSignal(std::map<non_template_type_1,non_template_type_2> arg); 
void exampleSlot(std::map<non_template_type_1,non_template_type_2> arg); 

Powoduje to następujące podczas wykonywania:

QObject::connect: Cannot queue arguments of type 
    'std::map<non_template_type_1,non_template_type_2>' 
(Make sure 'std::map<non_template_type_1,non_template_type_2>' 
    is registered using qRegisterMetaType().) 

Starając się zarejestrować std::map<non_template_type_1,non_template_type_2> z Q_DECLARE_METATYPE() powoduje niepowodzenie kompilacji i najwyraźniej nie jest obsługiwany .

Jako obejście używam QVariantMap zamiast std::map. Ale naprawdę chciałbym poznać prawidłowy sposób rozwiązania tego problemu; tam, gdzie nie można modyfikować klas szablonów.

Edytuj: Zapomniałem wspomnieć, że sygnał i gniazdo są emitowane i odbierane w różnych wątkach. Najwyraźniej błąd środowiska wykonawczego nie występuje w scenariuszach z jednym wątkiem.

Odpowiedz

2

Jak wyjaśniono w this thread można spróbować użyć typedef, w tym nagłówek QMetaType a następnie przy użyciu zarówno Q_DECLARE_METATYPE makro oraz funkcję qRegisterMetaType (jak sugeruje this thread o podobnym problemie).

+0

Faktycznie, potwierdziłem, że działa on bez 'Q_DECLARE_METATYPE' więc' qRegisterMetaType' wydaje się wystarczający wraz z 'typedef'. Nie wiem, jak bezpiecznie jest ominąć 'Q_DECLARE_METATYPE' chociaż. –

2

Działa to dla mnie:

qRegisterMetaType< std::vector<float> >("std::vector<float>"); 
qRegisterMetaType< std::vector<int> >("std::vector<int>" ); 
qRegisterMetaType< std::map<std::string,int64_t> >("std::map<std::string,int64_t>"); 
1

Nie ma problemu, jeśli stworzył klasę takiego i używane MOC kompilatora Qt do tworzenia tych QMetaObject „s automatycznie:

class MyClass : public QObject 
{ 
    Q_OBJECT 
public: 
    explicit MyClass(QObject *parent = 0) 
     : QObject(parent) 
    { 
    } 
public slots: 
    void exampleSlot(std::map<non_template_type_1,non_template_type_2> arg); 
signals: 
    void exampleSignal(std::map<non_template_type_1,non_template_type_2> arg); 
}; 

Oczywiście musisz dołączyć QObject i gdziekolwiek znajduje się std::map.

+0

Dziękuję, w rzeczywistości wydaje się to możliwe w ustawieniu z jedną nicią, ale zapomniałem wspomnieć, że tak nie jest ze mną. –

+0

@ AyberkÖzgür Więc w czym problem? Sygnał będzie zawsze odbierany w wątku obsługi zdarzeń Qt. – msrd0

+0

To nie jest. Zobacz QueuedConnection w http://qt-project.org/doc/qt-4.8/threads-qobject.html#signals-and-slots-across-threads. –

Powiązane problemy