2012-02-09 194 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哦,去! 希望这有助于。