J'utilise Qt4 et C ++ pour créer des programmes en infographie. J'ai besoin de pouvoir imprimer certaines variables dans ma console au moment de l'exécution, pas de débogage, mais cout
ne semble pas fonctionner même si j'ajoute les bibliothèques. Y a-t-il un moyen de faire cela?
159
error: ‘cout’ was not declared in this scope
; avec iostream, je reçoiserror: no match for ‘operator<<’ in ‘std::operator<< [with _Traits = std::char_traits<char>](((std::basic_ostream<char>&)(& std::cout)), ...
; l'utilisation des commandes dans la réponse fonctionne plutôt bien.QString
).Réponses:
S'il est suffisamment bon pour imprimer
stderr
, vous pouvez utiliser les flux suivants initialement destinés au débogage:Bien que comme indiqué dans les commentaires, gardez à l'esprit que les messages qDebug sont supprimés si
QT_NO_DEBUG_OUTPUT
est définiSi vous avez besoin de stdout, vous pouvez essayer quelque chose comme ceci (comme Kyle Strand l'a souligné):
Vous pouvez alors appeler comme suit:
la source
J'ai trouvé cela très utile:
la source
qDebug()
etc. font réellement, ce sera de loin la meilleure réponse. (OMI, c'est déjà supérieur puisque OP demande quelque chose à remplacerstd::cout
, mais les électeurs de 40ish semblent ne pas être d'accord).QTextStream qStdout() { return {stdout}; }
pourrait être un moyen utile pour envelopper cela, compatible avecqWarning()
etc. Et peut - être un certainstatic
état pour éviter streamage temporaire?Ecrire à
stdout
Si vous voulez quelque chose qui, comme
std::cout
, écrit sur la sortie standard de votre application, vous pouvez simplement faire ce qui suit ( crédit à CapelliC ):Si vous voulez éviter de créer un
QTextStream
objet temporaire , suivez la suggestion de Yakk dans les commentaires ci-dessous de créer une fonction pour renvoyer unstatic
handle pourstdout
:N'oubliez pas de
flush
consulter régulièrement le flux pour vous assurer que la sortie est réellement imprimée.Ecrire à
stderr
Notez que la technique ci-dessus peut également être utilisée pour d'autres sorties. Cependant, il existe des moyens plus lisibles d'écrire
stderr
( crédit à Goz et aux commentaires sous sa réponse):qDebug()
est fermé siQT_NO_DEBUG_OUTPUT
est activé au moment de la compilation.(Goz note dans un commentaire que pour les applications non console, celles-ci peuvent s'imprimer dans un flux différent de celui
stderr
.)REMARQUE: toutes les méthodes d'impression Qt supposent que les
const char*
arguments sont des chaînes codées ISO-8859-1 avec des\0
caractères de fin .la source
QTextStream qStdout() { static QTextStream r{stdout}; return r; }
?template <typename C> constexpr typename std::remove_const<typename std::remove_reference<C>::type>::type& no_const(C* c) { return const_cast<typename std::remove_const<typename std::remove_reference<C>::type>::type&>(*c); }
Utilisation:no_const(this).method()
. Vous pouvez injecter cette fonction comme méthode dans la classe, et vous n'aurez même pas besoin de passerthis
:Foo& no_const() const { return ::no_const(this); }
pas de fautes de frappe, je le promets.QTextStream
objets temporaires . Édité.Ajoutez ceci à votre fichier de projet:
la source
qmake
.Quelles variables souhaitez-vous imprimer? Si vous voulez dire des QStrings, ceux-ci doivent être convertis en c-Strings. Essayer:
la source
#include <iostream>
myString.toUtf8().data()
est mieux car il imprime les caractères en dehors de la plage ascii. Caractères chinois par exempleIl a également une syntaxe similaire à prinft, par exemple:
Très pratique aussi
la source
Accédez au projet
Properties -> Linker-> System -> SubSystem
, puis réglez-le surConsole(/S)
.la source
Qu'en est-il d'inclure la bibliothèque iostream et de préciser que cout est un objet de std comme ceci:
la source
Si vous imprimez sur stderr à l'aide de la bibliothèque stdio, un appel à
fflush(stderr)
devrait vider la mémoire tampon et obtenir une journalisation en temps réel.la source
la source
Eh bien, après avoir étudié plusieurs exemples sur Internet décrivant comment sortir des messages d'une interface graphique dans Qt vers stdout, j'ai affiné un exemple autonome de travail sur la redirection de messages vers une console, via qDebug () et l'installation de qInstallMessageHandler (). La console sera affichée en même temps que l'interface graphique et peut être masquée si nécessaire. Le code est facile à intégrer au code existant dans votre projet. Voici l'exemple complet et n'hésitez pas à l'utiliser comme vous le souhaitez, tant que vous adhérez à la licence GNU GPL v2. Vous devez utiliser une forme quelconque et une MainWindow je pense - sinon, l'exemple fonctionnera, mais se plantera probablement lorsqu'il est forcé de quitter. Remarque: il n'y a aucun moyen de quitter via un bouton de fermeture ou un menu de fermeture car j'ai testé ces alternatives et l'application finira par planter de temps en temps. Sans le bouton de fermeture, l'application sera stable et vous pourrez la fermer à partir de la fenêtre principale. Prendre plaisir!
la source
"build & run"> Par défaut pour "Exécuter dans le terminal" -> Activer
pour vider le tampon, utilisez cette commande -> fflush (stdout); vous pouvez également utiliser "\ n" dans
printf
oucout
.la source