Russian Qt Forum

Qt => Дополнительные компоненты => Тема начата: break от Января 17, 2010, 06:43



Название: цветоной вывод в консоль + маркеры ошибок, ворнингов, информации как в 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
ай-ай-ай... это оператор извлечения адреса. т.е. == указатель.