2015-10-15 1 views
1

J'ai un problème avec QLoggingCategory (const char * category).Qt 5 Logging - catégorie definig avec QLoggingCategory

Quand je l'utilise comme:

QString rt = "3"; 
QString sv = "P"; 
QLoggingCategory dailyLogger(QString(rt+sv+"Logger").toStdString().c_str()); 

il ne fonctionne pas (mon gestionnaire de message personnalisé ne reconnaît pas cette catégorie).

Mais quand je l'utilise:

gestionnaire de messages
QLoggingCategory dailyLogger("3PLogger"); 

voit la catégorie.

Voici la fonction de gestionnaire:

void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg) 
{ 
    if (QString(context.category).contains("3")) 
    { 
     //some code 
    } 
} 

Pourquoi mon nom de la catégorie calculée fonctionne pas?

+2

Possible, car 'QString (rt + sv +" Logger "). ToStdString(). C_str()' - est un rvalue et il sera invalide à la prochaine ligne de code. –

Répondre

1

QLoggingCategory conserve une copie du pointeur char* avec lequel il est construit. Les caractères pointés doivent rester valides et constants pour la durée de vie de l'instance QLoggingCategory.

Dans votre exemple qui a échoué, c_str() renvoie une valeur temporaire qui n'est plus valide après que le std::string est hors de portée. Donc le QLoggingCategory pointe maintenant sur une mémoire invalide (vous donnant un comportement indéterminé). Dans votre deuxième exemple, vous transmettez un littéral de chaîne, qui est valide pour la durée de vie du programme, donc aucun problème de durée de vie ne se pose.

Vous devez copier les données de chaîne dans un tableau char avec une durée de vie qui survit à la catégorie de journalisation.