Russian Qt Forum
Май 02, 2024, 19:50 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: цветоной вывод в консоль + маркеры ошибок, ворнингов, информации как в X11  (Прочитано 14146 раз)
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« : Январь 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.
Записан
crackedmind
Гость
« Ответ #1 : Январь 23, 2010, 00:29 »

Не будет работать, ага. Но мысль интересная, надо будет доработать под винду Улыбающийся
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #2 : Январь 23, 2010, 13:35 »

к стати, когда использовал впервые CMake, обнаружил, что в виндовой консоли его make-файл вывод делает цветным.
Записан

Юра.
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Январь 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;
}
нашёл здесь
Записан

Юра.
SABROG
Гость
« Ответ #4 : Январь 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
 
 

Судя по коду должно работать и в винде и в линуксовой консоли.
« Последнее редактирование: Январь 23, 2010, 14:39 от SABROG » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #5 : Январь 23, 2010, 14:48 »

я вот пока не могу добится, чтобы назад раскраску возвращать, т.е. чтобы она была не фиксированная, а просто исходная
Записан

Юра.
SABROG
Гость
« Ответ #6 : Январь 23, 2010, 14:54 »

Надо запоминать текущие цвета и потом выставлять обратно:

Код
C++ (Qt)
   OriginalColors = ConsoleInfo.wAttributes;
   SetConsoleTextAttribute(hConsoleHandle, color);
 

Код
C++ (Qt)
   SetConsoleTextAttribute(hConsoleHandle, OriginalColors);
 
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #7 : Январь 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.
Записан

Юра.
SABROG
Гость
« Ответ #8 : Январь 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)
 
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #9 : Январь 23, 2010, 19:40 »

>>А должно быть так:
это почему?
в MSDN'е написано, что нужно указатель передавать, а не адрес (ссылку на) структуру
Записан

Юра.
niXman
Гость
« Ответ #10 : Январь 23, 2010, 20:57 »

ай-ай-ай... это оператор извлечения адреса. т.е. == указатель.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.312 секунд. Запросов: 23.