Saya menggunakan Qt4 dan C ++ untuk membuat beberapa program dalam grafik komputer. Saya harus dapat mencetak beberapa variabel di konsol saya saat run-time, tidak men-debug, tetapi cout
tampaknya tidak berfungsi bahkan jika saya menambahkan perpustakaan. Apakah ada cara untuk melakukan ini?
159
error: ‘cout’ was not declared in this scope
; dengan iostream, saya dapaterror: no match for ‘operator<<’ in ‘std::operator<< [with _Traits = std::char_traits<char>](((std::basic_ostream<char>&)(& std::cout)), ...
; menggunakan perintah dalam jawaban malah berfungsi dengan baik.QString
).Jawaban:
Jika cukup baik untuk dicetak
stderr
, Anda dapat menggunakan stream berikut yang awalnya dimaksudkan untuk debugging:Meskipun seperti yang ditunjukkan dalam komentar, ingatlah bahwa pesan qDebug dihapus jika
QT_NO_DEBUG_OUTPUT
didefinisikanJika Anda perlu stdout, Anda dapat mencoba sesuatu seperti ini (seperti yang ditunjukkan Kyle Strand):
Anda dapat menelepon sebagai berikut:
sumber
Saya menemukan ini yang paling berguna:
sumber
qDebug()
sebenarnya dilakukan dll, ini akan menjadi jawaban yang unggul (IMO sudah unggul karena OP meminta sesuatu untuk digantistd::cout
, tetapi 40ish pemilih tampaknya tidak setuju).QTextStream qStdout() { return {stdout}; }
mungkin cara yang berguna untuk membungkus ini, konsisten denganqWarning()
dll. Dan mungkin beberapastatic
negara untuk menghindari streaming sementara?Menulis untuk
stdout
Jika Anda menginginkan sesuatu yang, seperti
std::cout
, menulis ke output standar aplikasi Anda, Anda dapat melakukan hal berikut ( kredit ke CapelliC ):Jika Anda ingin menghindari membuat
QTextStream
objek sementara , ikuti saran Yakk di komentar di bawah ini untuk membuat fungsi untuk mengembalikanstatic
pegangan untukstdout
:Ingat untuk
flush
streaming secara berkala untuk memastikan output benar-benar dicetak.Menulis untuk
stderr
Perhatikan bahwa teknik di atas juga dapat digunakan untuk output lain. Namun, ada lebih banyak cara yang dapat dibaca untuk menulis
stderr
( kredit ke Goz dan komentar di bawah jawabannya):qDebug()
ditutup jikaQT_NO_DEBUG_OUTPUT
dihidupkan pada waktu kompilasi.(Goz mencatat dalam komentar bahwa untuk aplikasi non-konsol, ini dapat dicetak ke aliran yang berbeda dari
stderr
.)CATATAN: Semua metode cetak Qt mengasumsikan bahwa
const char*
argumen adalah string bersandi ISO-8859-1 dengan\0
karakter terminating .sumber
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); }
Gunakan:no_const(this).method()
. Anda bisa menyuntikkan fungsi itu sebagai metode ke dalam kelas, dan kemudian Anda bahkan tidak perlu lulusthis
:Foo& no_const() const { return ::no_const(this); }
Tidak ada kesalahan ketik, saya janji.QTextStream
objek sementara . Diedit.Tambahkan ini ke file proyek Anda:
sumber
qmake
.Variabel apa yang ingin Anda cetak? Jika maksud Anda QStrings, itu perlu dikonversi ke c-Strings. Mencoba:
sumber
#include <iostream>
myString.toUtf8().data()
lebih baik karena mencetak Karakter di luar rentang ascii. Karakter Cina misalnyaIa juga memiliki sintaksis yang mirip dengan prinft, misalnya:
Sangat berguna juga
sumber
Buka Proyek
Properties -> Linker-> System -> SubSystem
, lalu setel keConsole(/S)
.sumber
Bagaimana dengan menyertakan pustaka iostream dan tepatnya cout adalah objek std seperti ini:
sumber
Jika Anda mencetak ke stderr menggunakan perpustakaan stdio, panggilan ke
fflush(stderr)
harus menyiram buffer dan membuat Anda masuk secara real-time.sumber
sumber
Nah, setelah mempelajari beberapa contoh di Internet yang menggambarkan cara membuat pesan dari GUI di Qt ke stdout, saya telah memperbaiki contoh yang berdiri sendiri tentang pengalihan pesan ke konsol, melalui qDebug () dan menginstal qInstallMessageHandler (). Konsol akan ditampilkan bersamaan dengan GUI dan dapat disembunyikan jika dianggap perlu. Kode mudah diintegrasikan dengan kode yang ada di proyek Anda. Berikut ini adalah contoh lengkap dan jangan ragu untuk menggunakannya dengan cara apa pun yang Anda suka, selama Anda mematuhi Lisensi GNU GPL v2. Anda harus menggunakan semacam bentuk dan MainWindow saya pikir - jika sampel akan berjalan, tetapi mungkin macet ketika dipaksa untuk berhenti. Catatan: tidak ada cara untuk keluar melalui tombol tutup atau menu tutup karena saya telah menguji alternatif itu dan aplikasi akan macet akhirnya setiap sekarang dan kemudian. Tanpa tombol tutup aplikasi akan stabil dan Anda dapat menutupnya dari jendela utama. Nikmati!
sumber
"build & run"> Default untuk "Run in terminal" -> Enable
untuk membersihkan buffer, gunakan perintah ini -> fflush (stdout); Anda juga dapat menggunakan "\ n" di
printf
ataucout
.sumber