2012-02-09 81 views
4

是否有可能(並且更重要的是如何)將輸出流重定向到QTextBox。所以,如果我在應用程序的任何地方寫std::cout << "test"它會被重定向到我定義的文本框?將std :: cout重定向到QTextEdit

我嘗試了明顯的(這裏ui.textEdit是一個指向文本編輯框):

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

然而,這是行不通的。 (明顯)。 - 也不會將cout重定向到qDebug工作(或者甚至將qDebug指向文本域)。

我使用qt4.8順便說一句...

編輯: 於是,我就張貼在郵件列表中的解決方案。但是現在訪問衝突出現。

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」。 (我應該張貼更詳細的單獨問題嗎?)

編輯:以及「解決方案」是在ui.textEdit完全創建後才聲明qout。

回答

1

您可以將cout重置爲您自己的ostream實現,其中emit信號會掛鉤到append插槽。你的子問題/演練因此是:

  1. 重定向cout
  2. 重定向cout你自己ostream實現或一個你可以擴展
  3. emit信號QTextBox

這些子主題可以在SO上找到,據我所知

0

我爲這個問題編寫了我自己的函數,對於QTextEdit,請注意,如果您在主線程中使用繁重的操作來運行它,您的GUI將會凍結。所以,你必須實例化一個新的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; 

     } 
} 

在你的主窗口,你只需要實例化您的新Stream:

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

而且你很好t哦,去! 希望這有助於。