Używam Qt4 i C ++ do tworzenia programów w grafice komputerowej. Muszę mieć możliwość drukowania niektórych zmiennych w konsoli w czasie wykonywania, a nie debugowania, ale cout
wydaje się , że nie działają, nawet jeśli dodam biblioteki. Czy jest na to sposób?
159
error: ‘cout’ was not declared in this scope
; z iostream, otrzymujęerror: no match for ‘operator<<’ in ‘std::operator<< [with _Traits = std::char_traits<char>](((std::basic_ostream<char>&)(& std::cout)), ...
; używanie poleceń w odpowiedzi działa dobrze.QString
).Odpowiedzi:
Jeśli jest wystarczająco dobry do drukowania
stderr
, możesz użyć następujących strumieni pierwotnie przeznaczonych do debugowania:Chociaż, jak wskazano w komentarzach, pamiętaj, że komunikaty qDebug są usuwane, jeśli
QT_NO_DEBUG_OUTPUT
są zdefiniowaneJeśli potrzebujesz stdout, możesz spróbować czegoś takiego (jak wskazał Kyle Strand):
Możesz wtedy zadzwonić w następujący sposób:
źródło
Uważam, że to najbardziej przydatne:
źródło
qDebug()
faktycznie robią itp., Będzie to zdecydowanie lepsza odpowiedź (IMO jest już lepszy, ponieważ OP prosi o coś do zastąpieniastd::cout
, ale 40-letni wyborcy nie zgadzają się).QTextStream qStdout() { return {stdout}; }
może być przydatnym sposobem na zawinięcie tego, spójny zqWarning()
itp. A może jakiśstatic
stan, aby uniknąć tymczasowego streamingu?Piszę do
stdout
Jeśli potrzebujesz czegoś, co
std::cout
zapisuje na standardowe wyjście aplikacji, możesz po prostu wykonać następujące czynności ( uznanie dla CapelliC ):Jeśli chcesz uniknąć tworzenia tymczasowego
QTextStream
obiektu, postępuj zgodnie z sugestią Yakka w komentarzach poniżej, aby utworzyć funkcję zwracającąstatic
uchwyt dlastdout
:Pamiętaj o
flush
okresowym sprawdzaniu strumienia, aby upewnić się, że dane wyjściowe są faktycznie drukowane.Piszę do
stderr
Zauważ, że powyższa technika może być również używana do innych wyników. Istnieją jednak bardziej czytelne sposoby pisania
stderr
( uznanie dla Goza i komentarze pod jego odpowiedzią):qDebug()
jest zamknięty, jeśliQT_NO_DEBUG_OUTPUT
jest włączony w czasie kompilacji.(Goz zauważa w komentarzu, że w przypadku aplikacji innych niż konsole mogą one drukować w innym strumieniu niż
stderr
).UWAGA: Wszystkie metody drukowania Qt zakładają, że
const char*
argumenty są łańcuchami zakodowanymi w standardzie ISO-8859-1 ze\0
znakami końcowymi .źródło
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); }
Zastosowanie:no_const(this).method()
. Mógłbyś wstrzyknąć tę funkcję jako metodę do klasy, a wtedy nawet nie musiałbyś zdawaćthis
:Foo& no_const() const { return ::no_const(this); }
żadnych literówek, obiecuję.QTextStream
obiekty tymczasowe . Edytowano.Dodaj to do pliku projektu:
źródło
qmake
.Jakie zmienne chcesz wydrukować? Jeśli masz na myśli QStrings, należy je przekonwertować na c-Strings. Próbować:
źródło
#include <iostream>
myString.toUtf8().data()
jest lepsze, ponieważ drukuje znaki poza zakresem ascii. Na przykład chińskie znakiMa również składnię podobną do prinft, np .:
Bardzo poręczny
źródło
Przejdź do projektu
Properties -> Linker-> System -> SubSystem
, a następnie ustaw go naConsole(/S)
.źródło
A co z włączeniem biblioteki iostream i sprecyzowaniem, że cout jest obiektem standardowym :
źródło
Jeśli drukujesz na stderr przy użyciu biblioteki stdio, wywołanie
fflush(stderr)
powinno opróżnić bufor i zapewnić rejestrowanie w czasie rzeczywistym.źródło
źródło
Cóż, po przestudiowaniu kilku przykładów w Internecie opisujących, jak wyprowadzać komunikaty z GUI w Qt na stdout, udoskonaliłem działający samodzielny przykład przekierowywania wiadomości do konsoli za pomocą qDebug () i instalowania qInstallMessageHandler (). Konsola zostanie wyświetlona w tym samym czasie co GUI i można ją ukryć, jeśli uzna to za konieczne. Kod można łatwo zintegrować z istniejącym kodem w projekcie. Oto pełna próbka i możesz z niej korzystać w dowolny sposób, pod warunkiem przestrzegania Licencji GNU GPL v2. Musisz użyć jakiejś formy i myślę, że MainWindow - w przeciwnym razie próbka będzie działać, ale prawdopodobnie ulegnie awarii, gdy zostanie zmuszony do zakończenia. Uwaga: nie ma sposobu, aby wyjść za pomocą przycisku zamykania lub zamykania menu, ponieważ przetestowałem te alternatywy i aplikacja w końcu ulegnie awarii od czasu do czasu. Bez przycisku zamykania aplikacja będzie stabilna i można ją zamknąć z poziomu głównego okna. Cieszyć się!
źródło
„build & run”> Domyślnie dla „Run in terminal” -> Enable
aby opróżnić bufor użyj tego polecenia -> fflush (stdout); możesz także użyć "\ n" w
printf
lubcout
.źródło