Ich benutze Qt4 und C ++, um einige Programme in Computergrafik zu erstellen. Ich muss in der Lage sein, einige Variablen zur Laufzeit in meiner Konsole zu drucken, nicht zu debuggen, aber es cout
scheint nicht zu funktionieren, selbst wenn ich die Bibliotheken hinzufüge. Gibt es eine Möglichkeit, dies zu tun?
159
error: ‘cout’ was not declared in this scope
; mit iostream bekomme icherror: no match for ‘operator<<’ in ‘std::operator<< [with _Traits = std::char_traits<char>](((std::basic_ostream<char>&)(& std::cout)), ...
; Die Verwendung der Befehle in der Antwort funktioniert stattdessen einwandfrei.QString
).Antworten:
Wenn es zum Drucken gut genug ist
stderr
, können Sie die folgenden Streams verwenden, die ursprünglich zum Debuggen vorgesehen waren:Beachten Sie jedoch, dass qDebug-Nachrichten entfernt werden, wenn dies
QT_NO_DEBUG_OUTPUT
definiert istWenn Sie Standard benötigen, können Sie so etwas ausprobieren (wie Kyle Strand betont hat):
Sie können dann wie folgt anrufen:
quelle
Ich fand das am nützlichsten:
quelle
qDebug()
einbeziehen, was usw. tatsächlich tun, ist dies bei weitem die überlegene Antwort (IMO ist es bereits überlegen, da OP um Ersatz bittetstd::cout
, aber 40-jährige Wähler scheinen nicht zuzustimmen).QTextStream qStdout() { return {stdout}; }
könnte ein nützlicher Weg sein, dies zu verpacken, im Einklang mitqWarning()
usw. Und vielleicht einstatic
Zustand, um vorübergehendes Streaming zu vermeiden?Schreiben an
stdout
Wenn Sie etwas möchten, das beispielsweise
std::cout
in die Standardausgabe Ihrer Anwendung schreibt, können Sie einfach Folgendes tun ( Gutschrift an CapelliC ):Wenn Sie ein temporäres Erstellung vermeiden wollen
QTextStream
Objekt, folgt einen zurückzukehren Yakk Vorschlag in den Kommentaren unten von einer Funktion zu schaffenstatic
für Griffstdout
:Denken Sie
flush
regelmäßig an den Stream, um sicherzustellen, dass die Ausgabe tatsächlich gedruckt wird.Schreiben an
stderr
Beachten Sie, dass die obige Technik auch für andere Ausgänge verwendet werden kann. Es gibt jedoch besser lesbare Möglichkeiten zum Schreiben
stderr
( Dank an Goz und die Kommentare unter seiner Antwort):qDebug()
wird geschlossen, wennQT_NO_DEBUG_OUTPUT
es zur Kompilierungszeit aktiviert ist.(Goz stellt in einem Kommentar fest, dass Apps ohne Konsole in einem anderen Stream als gedruckt werden können
stderr
.)HINWEIS: allen Qt-Druckmethoden wird davon ausgegangen, dass es sich bei den
const char*
Argumenten um ISO-8859-1-codierte Zeichenfolgen mit Abschlusszeichen handelt\0
.quelle
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); }
Verwenden Sie :no_const(this).method()
. Sie könnten diese Funktion als Methode in die Klasse einfügen, und dann müssten Sie nicht einmal übergebenthis
:Foo& no_const() const { return ::no_const(this); }
Keine Tippfehler, das verspreche ich.QTextStream
Objekte verursacht wird . Bearbeitet.Fügen Sie dies Ihrer Projektdatei hinzu:
quelle
qmake
.Welche Variablen möchten Sie drucken? Wenn Sie QStrings meinen, müssen diese in c-Strings konvertiert werden. Versuchen:
quelle
#include <iostream>
myString.toUtf8().data()
ist besser, weil Zeichen außerhalb des ASCII-Bereichs gedruckt werden. Chinesische Schriftzeichen zum BeispielEs hat auch eine Syntax ähnlich wie prinft, zB:
Sehr praktisch
quelle
Gehen Sie zu den Projekten und
Properties -> Linker-> System -> SubSystem
setzen Sie sie aufConsole(/S)
.quelle
Was ist mit der Aufnahme der iostream-Bibliothek und der genauen Feststellung, dass cout ein Objekt von std wie diesem ist:
quelle
Wenn Sie mit der stdio-Bibliothek auf stderr drucken, sollte ein Aufruf von
fflush(stderr)
den Puffer leeren und Sie in Echtzeit protokollieren.quelle
quelle
Nachdem ich einige Beispiele im Internet studiert habe, die beschreiben, wie Nachrichten von einer GUI in Qt an stdout ausgegeben werden, habe ich ein eigenständiges Beispiel für die Umleitung von Nachrichten an eine Konsole über qDebug () und die Installation von qInstallMessageHandler () verfeinert. Die Konsole wird gleichzeitig mit der GUI angezeigt und kann bei Bedarf ausgeblendet werden. Der Code lässt sich leicht in vorhandenen Code in Ihr Projekt integrieren. Hier ist das vollständige Beispiel und Sie können es beliebig verwenden, solange Sie die Lizenz GNU GPL v2 einhalten. Sie müssen eine Form und ein MainWindow verwenden, denke ich - sonst wird das Beispiel ausgeführt, stürzt aber wahrscheinlich ab, wenn es zum Beenden gezwungen wird. Hinweis: Es gibt keine Möglichkeit, über eine Schaltfläche zum Schließen oder ein Schließen des Menüs zu beenden, da ich diese Alternativen getestet habe und die Anwendung von Zeit zu Zeit abstürzt. Ohne die Schaltfläche zum Schließen ist die Anwendung stabil und Sie können sie über das Hauptfenster schließen. Genießen!
quelle
"build & run"> Standard für "Run in terminal" -> Enable
Um den Puffer zu leeren, verwenden Sie diesen Befehl -> fflush (stdout); Sie können auch "\ n" in
printf
oder verwendencout
.quelle