Название: цветоной вывод в консоль + маркеры ошибок, ворнингов, информации как в X11
Отправлено: break от Января 17, 2010, 06:43
обработчик вывода устанавливается через qInstallMsgHandler - в документации все есть C++ (Qt) #ifndef __DEBUGLOG_H__ #define __DEBUGLOG_H__ #include <QDebug> void rtLogMessageOutput( QtMsgType type, const char * msg ); #endif // __DEBUGLOG_H__
C++ (Qt) #include "DebugLog.h" void rtLogMessageOutput( QtMsgType type, const char * msg ) { // Для раскраски вывода в консоль использованы ESC последовательности, как это будет работать в Windows не изветсно // если ESC последовательности не будут корректно обрабатываться прийдется их сделать через #ifdef Q_OS_LINUX // PS1 - переменная окружения определяющая строку запроса, вся информация по используемым ESC последовательностям // может быть найдена в хелпе по ней // PS1='\e[0m' ------ сброс // PS1='\e[31m' ------ установка красного цвета текста switch (type) { case QtDebugMsg: fprintf(stdout, "(II): %s\n", msg); break; case QtWarningMsg: fprintf(stdout, "\e[32m(WW): %s\e[0m\n", msg); break; case QtCriticalMsg: fprintf(stdout, "\e[31m(EE): %s\e[0m\n", msg); break; case QtFatalMsg: fprintf(stdout, "\e[41m(FATAL): %s\e[0m\n", msg ); abort(); } } /* Set Display Attributes Set Attribute Mode <ESC>[{attr1};...;{attrn}m Sets multiple display attribute settings. The following lists standard attributes: 0 Reset all attributes 1 Bright 2 Dim 4 Underscore 5 Blink 7 Reverse 8 Hidden Foreground Colours 30 Black 31 Red 32 Green 33 Yellow 34 Blue 35 Magenta 36 Cyan 37 White Background Colours 40 Black 41 Red 42 Green 43 Yellow 44 Blue 45 Magenta 46 Cyan 47 White */
Если кто-нибудь проверит что в виндовой консоли не работает раскраска (скорее всего так и будет) - то переделаю с учетом этого через дефайны проверки системы - чтобы не валился мусор в винде в виде невыполняющихся ESC последовательностей... Маркеры EE, II, WW - удобно использовать если вывод перенаправляется в файл - для поиска ошибки в огромном логе - собственно как в логах xorg.
Название: Re: цветоной вывод в консоль + маркеры ошибок, ворнингов, информации как в X11
Отправлено: crackedmind от Января 23, 2010, 00:29
Не будет работать, ага. Но мысль интересная, надо будет доработать под винду :)
Название: Re: цветоной вывод в консоль + маркеры ошибок, ворнингов, информации как в X11
Отправлено: lit-uriy от Января 23, 2010, 13:35
к стати, когда использовал впервые CMake, обнаружил, что в виндовой консоли его make-файл вывод делает цветным.
Название: Re: цветоной вывод в консоль + маркеры ошибок, ворнингов, информации как в X11
Отправлено: lit-uriy от Января 23, 2010, 13:57
Нашёл фрагмент кода который реально раскрашивает текст в консоли виндовоза: C++ (Qt) // color your text in Windows console mode // colors are 0=black 1=blue 2=green and so on to 15=white // colorattribute = foreground + background * 16 // to get red text on yellow use 4 + 14*16 = 228 // light red on yellow would be 12 + 14*16 = 236 // a Dev-C++ tested console application by vegaseat 07nov2004 #include <iostream> #include <windows.h> // WinApi header using namespace std; // std::cout, std::cin int main() { HANDLE hConsole; int k; hConsole = GetStdHandle(STD_OUTPUT_HANDLE); // you can loop k higher to see more color choices for(k = 1; k < 255; k++) { // pick the colorattribute k you want SetConsoleTextAttribute(hConsole, k); cout << k << " I want to be nice today!" << endl; } cin.get(); // wait return 0; }
нашёл здесь (http://www.daniweb.com/code/snippet216345.html#)
Название: Re: цветоной вывод в консоль + маркеры ошибок, ворнингов, информации как в X11
Отправлено: SABROG от Января 23, 2010, 14:26
На самом деле далеко даже ходить не надо: $QTDIR/src/testlib/qplaintestlogger.cpp Вот ещё у французов стыбрил макросы полезные: C++ (Qt) #ifndef __COLOURS_HPP__ #define __COLOURS_HPP__ #if defined(linux) || defined(__linux) || defined(__linux__) #define C_LIGHTBLACK 30 #define C_LIGHTRED 31 #define C_LIGHTGREEN 32 #define C_LIGHTYELLOW 33 #define C_LIGHTBLUE 34 #define C_LIGHTPURPLE 35 #define C_LIGHTCYAN 36 #define C_LIGHTWHITE 37 #define C_BACKBLACK 40 #define C_BACKRED 41 #define C_BACKGREEN 42 #define C_BACKYELLOW 43 #define C_BACKBLUE 44 #define C_BACKPURPLE 45 #define C_BACKCYAN 46 #define C_BACKWHITE 47 #define C_DEFAULT 0 #define C_BRIGHT 1 #define C_BLINK 5 #endif #if defined(__WIN32__) || defined(WIN) || defined(WIN32) #define C_LIGHTBLACK 0 #define C_LIGHTRED 4 #define C_LIGHTGREEN 2 #define C_LIGHTYELLOW 14 #define C_LIGHTBLUE 1 #define C_LIGHTPURPLE 5 #define C_LIGHTCYAN 11 #define C_LIGHTWHITE 15 #define C_BACKBLACK 0 #define C_BACKRED 4 #define C_BACKGREEN 2 #define C_BACKYELLOW 14 #define C_BACKBLUE 1 #define C_BACKPURPLE 5 #define C_BACKCYAN 11 #define C_BACKWHITE 15 #define C_DEFAULT 0 #define C_BRIGHT +8 #define C_BLINK 6 #endif #ifdef __cplusplus #if defined(linux) || defined(__linux) || defined(__linux__) #define COLOURF(cletter) "\033[" << cletter << "m" #define COLOURFB(cletter,background) "\033[" << cletter << "," << background << "m" #define CRESET() "\033[0m" #endif #if defined(__WIN32__) || defined(WIN) || defined(WIN32) #define COLOURF(cletter) ""; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),cletter); std::cout #define COLOURFB(cletter,background) ""; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),background*16+cletter); std::cout #define CRESET() ""; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),15); std::cout #endif #else #if defined(linux) || defined(__linux) || defined(__linux__) #define COLOURF(cletter) printf("\033[%dm",cletter); #define COLOURFB(cletter,background) printf("\033[%d,%dm",cletter,background); #define CRESET() printf("\033[0m"); #endif #if defined(__WIN32__) || defined(WIN) || defined(WIN32) #define COLOURF(cletter) ""; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),cletter); std::cout #define COLOURFB(cletter,background) ""; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),background*16+cletter); std::cout #define CRESET() ""; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),15); std::cout #endif #endif #endif
Судя по коду должно работать и в винде и в линуксовой консоли.
Название: Re: цветоной вывод в консоль + маркеры ошибок, ворнингов, информации как в X11
Отправлено: lit-uriy от Января 23, 2010, 14:48
я вот пока не могу добится, чтобы назад раскраску возвращать, т.е. чтобы она была не фиксированная, а просто исходная
Название: Re: цветоной вывод в консоль + маркеры ошибок, ворнингов, информации как в X11
Отправлено: SABROG от Января 23, 2010, 14:54
Надо запоминать текущие цвета и потом выставлять обратно: C++ (Qt) OriginalColors = ConsoleInfo.wAttributes; SetConsoleTextAttribute(hConsoleHandle, color);
C++ (Qt) SetConsoleTextAttribute(hConsoleHandle, OriginalColors);
Название: Re: цветоной вывод в консоль + маркеры ошибок, ворнингов, информации как в X11
Отправлено: lit-uriy от Января 23, 2010, 14:59
Я делал так: C++ (Qt) HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_SCREEN_BUFFER_INFO *info; int atr; if (GetConsoleScreenBufferInfo(console, info)){ atr = info->wAttributes; fprintf(stdout, "getConsoleAtr = %d\n", atr); }else{ int err = GetLastError(); fprintf(stdout, "getConsoleAtr ERROR = %d\n", err); }
всё время печатает код ошибки 12.
Название: Re: цветоной вывод в консоль + маркеры ошибок, ворнингов, информации как в X11
Отправлено: SABROG от Января 23, 2010, 16:44
Ну и не удивительно. 12 код это ERROR_INVALID_ACCESS, в простонародье AV (Access Violation), только вот ядру системы падать нельзя ;) Здесь у тебя объявляется пустой указатель на структуру: C++ (Qt) CONSOLE_SCREEN_BUFFER_INFO *info;
А должно быть так: C++ (Qt) CONSOLE_SCREEN_BUFFER_INFO info; ... GetConsoleScreenBufferInfo(console, &info)
Название: Re: цветоной вывод в консоль + маркеры ошибок, ворнингов, информации как в X11
Отправлено: lit-uriy от Января 23, 2010, 19:40
>>А должно быть так: это почему? в MSDN'е написано, что нужно указатель передавать, а не адрес (ссылку на) структуру
Название: Re: цветоной вывод в консоль + маркеры ошибок, ворнингов, информации как в X11
Отправлено: niXman от Января 23, 2010, 20:57
ай-ай-ай... это оператор извлечения адреса. т.е. == указатель.
|