Qt - wyświetlanie danych w konsoli

Stronę tą wyświetlono już: 31 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:

  • qDebug;
  • qInfo

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

Listing 1
  1. #include <QCoreApplication>
  2. #include <QDebug>
  3. int main(int argc, char *argv[])
  4. {
  5. QCoreApplication a(argc, argv);
  6. for(int i = 0; i < argc; i++){
  7. qDebug() << argv[i];
  8. }
  9. return a.exec();
  10. }

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:

Listing 2
  1. QString hello = "Hello";
  2. Qstring world = "World";
  3. qDebug() << hello << world; // z cudzysłowem i spacjami pomiędzy wyrazami
  4. qDebug().noquotes() << hello << world; // bez cudzysłowia ale z spacjami
  5. qDebug().noquotes().nospaces() << hello << world; // bez cudzysłowia i spacji
  6. 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:

Listing 3
  1. #include <QCoreApplication>
  2. #include <QDebug>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. // kolory w konsoli (działa tylko dla Linux-a i ponoć Mac iOS-a ale tego nie sprawdzałem więc nie potwierdzę)
  6. namespace linuxConsoleColors{
  7. const char dark_blue[] = "u001B[30m";
  8. const char dark_red[] = "u001B[31m";
  9. const char dark_green[] = "u001B[32m";
  10. const char dark_orange[] = "u001B[33m";
  11. const char blue[] = "u001B[34m";
  12. const char purple[] = "u001B[35m";
  13. const char light_blue[] = "u001B[36m";
  14. const char light_gray[] = "u001B[37m";
  15. const char white[] = "u001B[39m";
  16. }
  17. // poniższa funkcja definiuje jak dane są wyświetlane dla poszczególnych makr
  18. void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
  19. {
  20. QByteArray localMsg = msg.toLocal8Bit();
  21. switch (type) {
  22. case QtDebugMsg: // dla makra qDebug()
  23. 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);
  24. break;
  25. case QtInfoMsg: // dla makra qInfo()
  26. 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);
  27. break;
  28. case QtWarningMsg: // dla makra qWarning
  29. 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);
  30. break;
  31. case QtCriticalMsg: // dla makra qCritical
  32. 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);
  33. break;
  34. case QtFatalMsg: // dla makra qFatal
  35. 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);
  36. abort();
  37. }
  38. }
  39. int main(int argc, char **argv)
  40. {
  41. qInstallMessageHandler(myMessageOutput); // ustawianie własnego sposobu wyświetlania danych
  42. QCoreApplication app(argc, argv);
  43. QString data("Hello world");
  44. qDebug() << data << "znaczy się: Witaj świecie";
  45. qInfo() << data << "znaczu się: witaj świecie";
  46. return app.exec();
  47. }

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.

Komentarze