2012-02-09 3 views
4

Возможно ли (и что более важно -how-) перенаправить выходной поток на QTextBox. Так что, если я напишу std::cout << "test" в любом месте приложения, он будет перенаправлен на текстовое поле, которое я определил?redirect std :: cout to QTextEdit

Я попробовал очевидное (где ui.textEdit является указателем на поле ввода текста):

std::cout.rdbuf(ui.textEdit); 
std::cout << "test"; 

Однако это не работает. (Очевидно). - Не перенаправляет cout на qDebug (или даже направляет qDebug в текстовое поле).

Я использую qt4.8 кстати ...

EDIT: Так что я попытался решение отправил в список рассылки .. Однако в настоящее время нарушение прав доступа показывает вверх.

class MainInterface : public QMainWindow 
{ 
    Q_OBJECT 
.... 
private: 
    QDebugStream qout 

С конструктором:

MainInterface::MainInterface(QWidget *parent, Qt::WFlags flags) 
    : QMainWindow(parent, flags), 
    qout(std::cout, ui.textEdit) 
{ 

И в функции члена следующая строка размещена: std::cout << "Project Loaded" << std::endl;

Эта линия в настоящее время вызывает нарушение прав доступа от "qscoped_pointer". (Должен ли я опубликовать это более подробно по отдельному вопросу?)

EDIT: ну, «решение» должно было объявить qout только после того, как ui.textEdit был полностью создан.

ответ

1

Вы можете сбросить cout на свою собственную реализацию ostream, которая будет emit сигналов, которые вы подключаете к разъему append. Вы подзадачи/упражнения поэтому:

  1. перенаправлять cout
  2. перенаправлять cout на свой ostream реализации или тот, который вы можете расширить сигналы
  3. emit к QTextBox

Эти подтемы доступны на SO, насколько я знаю

0

Я написал свою собственную функцию для этой проблемы, для QTextEdit, просто имейте в виду, что если вы запустите ее с тяжелыми операциями вдоль основного потока, ваш графический интерфейс замерзнет. Таким образом, вы должны создать экземпляр нового QThread, например, то GUI соответственно QTextEdit будет обновляться соответственно:

Заголовочный файл:

class myConsoleStream : public std::basic_streambuf<char> 
{ 

public: 
    myConsoleStream(std::ostream &stream, QTextEdit* text_edit); 

    virtual ~myConsoleStream(); 
    static void registerMyConsoleMessageHandler(); 

private: 

    static void myConsoleMessageHandler(QtMsgType type, const QMessageLogContext &, const QString &msg); 

protected: 


    // Diese Funktion wird aufgerufen wenn std::endl im Stream erscheint 
    virtual int_type overflow(int_type v) 
     { 
      if (v == '\n') 
      { 
       log_window->append(""); 
      } 
      return v; 
     } 

    virtual std::streamsize xsputn(const char *p, std::streamsize n); 

private: 

    std::ostream &m_stream; 
    std::streambuf *m_old_buf; 
    QTextEdit* log_window; 

}; 
#endif // Q_DEBUGSTREAM_H 

.cpp файла:

myConsoleStream::myConsoleStream(std::ostream &stream, QTextEdit* text_edit) 
    :std::basic_streambuf<char>() 
    ,m_stream(stream) 


{ 
    this->log_window = text_edit; 
    this->m_old_buf = stream.rdbuf(); 

    stream.rdbuf(this); 

} 

myConsoleStream::~myConsoleStream() 
{ 
    this->m_stream.rdbuf(this->m_old_buf); 
} 

void myConsoleStream::registerMyConsoleMessageHandler() 
{ 
    qInstallMessageHandler(myConsoleMessageHandler); 
} 


void myConsoleStream::myConsoleMessageHandler(QtMsgType type, const QMessageLogContext &, const QString &msg) 
{ 

    QByteArray localMsg = msg.toLocal8Bit(); 
     switch (type) { 
     case QtDebugMsg: 
      // fprintf(stderr, "Debug: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); 
      break; 
     case QtInfoMsg: 
      // fprintf(stderr, "Info: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); 
      break; 
     case QtWarningMsg: 
      // fprintf(stderr, "Warning: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); 
      break; 
     case QtCriticalMsg: 
      //fprintf(stderr, "Critical: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); 
      break; 
     case QtFatalMsg: 
      // fprintf(stderr, "Fatal: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); 
      break; 
     default: 
      std::cout << msg.toStdString().c_str(); 
      break; 

     } 
} 

В вашей MainWindow вы просто необходимо создать экземпляр нового потока:

new myConsoleStream(std::cout, this->ui->Console); 
    myConsoleStream::registerMyConsoleMessageHandler(); 

, и вы хороши t oo go! Надеюсь, это поможет.

Смежные вопросы