Posso usare un tipo di modello in qualsiasi modo come argomento slot o segnale? Per fare un esempio, sto cercando di definire quanto segue:Come utilizzare i tipi di modello come parametri di slot e segnale in più thread?
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);
Il risultato è il seguente durante il runtime:
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().)
Cercando di registrare std::map<non_template_type_1,non_template_type_2>
con Q_DECLARE_METATYPE()
risultati in fallimento la compilazione e apparentemente non è supportato .
Per ovviare al problema, sto utilizzando QVariantMap
anziché std::map
. Ma mi piacerebbe davvero conoscere il modo corretto per risolvere questo problema; uno in cui non è possibile modificare le classi template.
Modifica: Ho dimenticato di menzionare che il segnale e lo slot sono emessi e ricevuti in thread diversi. Apparentemente l'errore di runtime non si verifica in scenari a thread singolo.
In realtà, ho confermato che funziona senza 'Q_DECLARE_METATYPE' quindi' qRegisterMetaType' sembra sufficiente insieme a 'typedef'. Non so quanto sia sicuro omettere 'Q_DECLARE_METATYPE'. –