Qt - wyświetlanie danych w konsoli

Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 3655 razy

W Qt Creator-ze można korzystać z starego strumienia wyświetlania danych cin lub funkcji printf w celu wyświetlenia danych w oknie konsoli, jednakże Qt dysponuje własnymi rozwiązaniami w tym zakresie. Takiego rozwiązania dostarczają makra:

Makra te są dostępne po załączeniu pliku nagłówkowego QDebug, a użycie ich wygląda następująco:

#include <QCoreApplication> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); for(int i = 0; i < argc; i++){ qDebug() << argv[i]; } return a.exec(); }

Powyższy kod wyświetli ścieżkę do programu oraz nazwę programu, które domyślnie są zapisane w drugim argumencie funkcji main.

Warto też przetestować następujący kod:

QString hello = "Hello"; Qstring world = "World"; qDebug() << hello << world; // z cudzysłowem i spacjami pomiędzy wyrazami qDebug().noquotes() << hello << world; // bez cudzysłowia ale z spacjami qDebug().noquotes().nospaces() << hello << world; // bez cudzysłowia i spacji qDebug("%s %s", hello.toStdString().c_str(), world.toStdString().c_str()); // bez cudzysłowia i spacji

Powyższy kod powinien wyświetlić coś w tym stylu:

"Hello" "World"
Hello World
HelloWorld
Hello World

Tak samo rzecz się ma dla makra qInfo. Co ciekawe można utworzyć swój własny zestaw sposobu wyświetlania danych np. w następujący sposób:

#include <QCoreApplication> #include <QDebug> #include <stdio.h> #include <stdlib.h> // kolory w konsoli (działa tylko dla Linux-a i ponoć Mac iOS-a ale tego nie sprawdzałem więc nie potwierdzę) namespace linuxConsoleColors{ const char dark_blue[] = "u001B[30m"; const char dark_red[] = "u001B[31m"; const char dark_green[] = "u001B[32m"; const char dark_orange[] = "u001B[33m"; const char blue[] = "u001B[34m"; const char purple[] = "u001B[35m"; const char light_blue[] = "u001B[36m"; const char light_gray[] = "u001B[37m"; const char white[] = "u001B[39m"; } // poniższa funkcja definiuje jak dane są wyświetlane dla poszczególnych makr void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg) { QByteArray localMsg = msg.toLocal8Bit(); switch (type) { case QtDebugMsg: // dla makra qDebug() fprintf(stderr, "%sDebug:%s %s %s (%s:%u, %s)n", linuxConsoleColors::dark_red, linuxConsoleColors::dark_orange, localMsg.constData(), linuxConsoleColors::white, context.file, context.line, context.function); break; case QtInfoMsg: // dla makra qInfo() fprintf(stderr, "%sInfo:%s %s %s (%s:%u, %s)n", linuxConsoleColors::dark_red, linuxConsoleColors::dark_orange, localMsg.constData(), linuxConsoleColors::white, context.file, context.line, context.function); break; case QtWarningMsg: // dla makra qWarning fprintf(stderr, "%sWarning:%s %s %s (%s:%u, %s)n", linuxConsoleColors::dark_red, linuxConsoleColors::dark_orange, localMsg.constData(), linuxConsoleColors::white, context.file, context.line, context.function); break; case QtCriticalMsg: // dla makra qCritical fprintf(stderr, "%sCritical:%s %s %s (%s:%u, %s)n", linuxConsoleColors::dark_red, linuxConsoleColors::dark_orange, localMsg.constData(), linuxConsoleColors::white, context.file, context.line, context.function); break; case QtFatalMsg: // dla makra qFatal fprintf(stderr, "%sFatal:%s %s %s (%s:%u, %s)n", linuxConsoleColors::dark_red, linuxConsoleColors::dark_orange, localMsg.constData(), linuxConsoleColors::white, context.file, context.line, context.function); abort(); } } int main(int argc, char **argv) { qInstallMessageHandler(myMessageOutput); // ustawianie własnego sposobu wyświetlania danych QCoreApplication app(argc, argv); QString data("Hello world"); qDebug() << data << "znaczy się: Witaj świecie"; qInfo() << data << "znaczu się: witaj świecie"; return app.exec(); }

Powyższy kod powinien (przynajmniej pod Linux-em wyświetlić coś w tym stylu:

Debug: "Hello World" znaczy się: Witaj świecie (../hello_world/main.cpp:48, int main(int, char**))
Info: "Hello World" znaczy się: Witaj świecie (../hello_world/main.cpp:48, int main(int, char**))

Uwaga! Powyższy kod skompiluje się jedynie gdy do zestawu narzędzi (podczas tworzenia projektu) doda się Desktop Qt 5.9.2 GCC 64bit.

Warto pamiętać, że makra te mogą być wykorzystywane do wysyłania informacji również w projektach okienkowych. Różnica jest taka, że w takim przypadku domyślnie komunikaty są wyświetlane w konsoli Qt Creatora. Makro qFatal wyświetla komunikat i kończy program.

Propozycje książek