Qt и перенаправление вывода

Тема в разделе "WASM.UNIX", создана пользователем bers, 18 фев 2008.

  1. bers

    bers New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2005
    Сообщения:
    139
    Адрес:
    Russia
    Привет всем.
    Пишу тут кой-чего на Qt (3) и возник такой вопрос: как можно перенаправить вывод из printf в какой-нить стандартный Qt-шный виджет, например QTextEdit? Решения типа создать строку QString и проинсертить ее в данный виджет не подходят, так как у приложения 2 уровня - нижний ничего не знает о Qt.
     
  2. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    вижу два подхода к проблеме.
    1. если используется glibc, то можно повтыкать в info glibc, напротив Stream IO, там описано как можно создать объект типа FILE*, который будет писать/читать так, как хочется.
    2. создать ещё один поток/процесс, связавшись с ним при помощи пайпов или pseudo-terminal'ов, или ещё чего-нибудь смотря по задаче; при помощи fdopen создать FILE* поверх дескриптора, и пускай printf пишет туда. А доп. процесс/поток пускай уже вывод обрабатывает и перенаправляет.
     
  3. bers

    bers New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2005
    Сообщения:
    139
    Адрес:
    Russia
    Да, спасибо - я уже нашел нечто похожее, буду разбираться.
     
  4. bers

    bers New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2005
    Сообщения:
    139
    Адрес:
    Russia
    Тут подумал - может понадобится кому-нить, решил выложить то, что получилось у меня
    Код (Text):
    1. class StdOutRedirector : public QObject
    2. {
    3. public:
    4.     StdOutRedirector( QTextEdit *te )
    5.     {
    6.     output = te;
    7.     if( pipe( fdPipePair ) == -1 )
    8.         printf( "error" );
    9.     else
    10.     {
    11.         fdStdOut = dup( fileno(stdout) );
    12.         close( 1 );
    13.         dup2( fdPipePair[1], 1 );
    14.        
    15.         buffer = (char *)malloc( 4096 );
    16.     }
    17.     }
    18.    
    19.     ~StdOutRedirector()
    20.     {
    21.     if ( buffer )
    22.         free( buffer );
    23.     }
    24.    
    25.     void ReadOut()
    26.     {
    27.     printf("\n");
    28.     fflush( stdout );
    29.    
    30.     int n;
    31.     ioctl( fdPipePair[0], FIONREAD, &n );
    32.    
    33.     n = read( fdPipePair[0], buffer, n );
    34.    
    35.     if ( n <= 0 )
    36.         return;
    37.    
    38.     if ( n > 1 )
    39.     {
    40.         buffer[ n ] = 0;
    41.         QString str( buffer );
    42.        
    43.         output->append( str );
    44.     }
    45.     }
    46.    
    47.    
    48. private:
    49.     QTextEdit   *output;
    50.     char      *buffer;
    51.     int         fdStdOut;
    52.     int         fdPipePair[ 2 ];
    53. };
    54.  
    55. //////////////////////////////////////////////////////////////////////////////////////////////////////////
    56. void * thread_func( void *arg )
    57. {
    58.     //printf("\n");
    59.     timespec ts;
    60.     while ( 1 )
    61.     {      
    62.     ((StdOutRedirector *)arg)->ReadOut();
    63.    
    64.     //sleep( 1 );
    65.     ts.tv_sec = 0;
    66.     ts.tv_nsec = 10;
    67.     nanosleep( &ts, NULL );
    68.     }
    69. }
    70.  
    71. StdOutRedirector *redirect;
    72.  
    73. void Form1::init()
    74. {
    75.    //....................................
    76.    redirect = new StdOutRedirector ( textEdit1 );
    77.    
    78.    pthread_t thread;
    79.    int result = pthread_create( &thread, 0, thread_func, redirect );
    80.    //....................................
    81. }