Привет всем. Пишу тут кой-чего на Qt (3) и возник такой вопрос: как можно перенаправить вывод из printf в какой-нить стандартный Qt-шный виджет, например QTextEdit? Решения типа создать строку QString и проинсертить ее в данный виджет не подходят, так как у приложения 2 уровня - нижний ничего не знает о Qt.
вижу два подхода к проблеме. 1. если используется glibc, то можно повтыкать в info glibc, напротив Stream IO, там описано как можно создать объект типа FILE*, который будет писать/читать так, как хочется. 2. создать ещё один поток/процесс, связавшись с ним при помощи пайпов или pseudo-terminal'ов, или ещё чего-нибудь смотря по задаче; при помощи fdopen создать FILE* поверх дескриптора, и пускай printf пишет туда. А доп. процесс/поток пускай уже вывод обрабатывает и перенаправляет.
Тут подумал - может понадобится кому-нить, решил выложить то, что получилось у меня Код (Text): class StdOutRedirector : public QObject { public: StdOutRedirector( QTextEdit *te ) { output = te; if( pipe( fdPipePair ) == -1 ) printf( "error" ); else { fdStdOut = dup( fileno(stdout) ); close( 1 ); dup2( fdPipePair[1], 1 ); buffer = (char *)malloc( 4096 ); } } ~StdOutRedirector() { if ( buffer ) free( buffer ); } void ReadOut() { printf("\n"); fflush( stdout ); int n; ioctl( fdPipePair[0], FIONREAD, &n ); n = read( fdPipePair[0], buffer, n ); if ( n <= 0 ) return; if ( n > 1 ) { buffer[ n ] = 0; QString str( buffer ); output->append( str ); } } private: QTextEdit *output; char *buffer; int fdStdOut; int fdPipePair[ 2 ]; }; ////////////////////////////////////////////////////////////////////////////////////////////////////////// void * thread_func( void *arg ) { //printf("\n"); timespec ts; while ( 1 ) { ((StdOutRedirector *)arg)->ReadOut(); //sleep( 1 ); ts.tv_sec = 0; ts.tv_nsec = 10; nanosleep( &ts, NULL ); } } StdOutRedirector *redirect; void Form1::init() { //.................................... redirect = new StdOutRedirector ( textEdit1 ); pthread_t thread; int result = pthread_create( &thread, 0, thread_func, redirect ); //.................................... }