2012-04-25 36 views
3

我是Qt应用程序开发新手,非常感谢您的帮助。这是 redirect std::cout to QTextEdit将std :: cout重定向到QTextEdit

我试图重定向std::coutQTextEdit再后,我已经看到,并试图测试在下面的链接提供的例子。

参考链接1:http://lists.trolltech.com/qt-interest/2005-06/thread00166-0.html

使用Qt创建者2.4.1测试从参考链接1.

untiled1.pro的例子

SOURCES += \ 
main.cpp 
HEADERS += \ 
qdebugstream.h 

qdebugstream.h

#ifndef QDEBUGSTREAM_H 
#define QDEBUGSTREAM_H 

#include <iostream> 
#include <streambuf> 
#include <string> 

#include "qtextedit.h" 

class QDebugStream : public std::basic_streambuf<char> 
{ 
public: 
QDebugStream(std::ostream &stream, QTextEdit* text_edit) : m_stream(stream) 
{ 
    log_window = text_edit; 
    m_old_buf = stream.rdbuf(); 
    stream.rdbuf(this); 
} 
~QDebugStream() 
{ 
    // output anything that is left 
    if (!m_string.empty()) 
    log_window->append(m_string.c_str()); 

    m_stream.rdbuf(m_old_buf); 
} 

protected: 
virtual int_type overflow(int_type v) 
{ 
    if (v == '\n') 
    { 
    log_window->append(m_string.c_str()); 
    m_string.erase(m_string.begin(), m_string.end()); 
    } 
    else 
    m_string += v; 

    return v; 
} 

virtual std::streamsize xsputn(const char *p, std::streamsize n) 
{ 
    m_string.append(p, p + n); 

    int pos = 0; 
    while (pos != std::string::npos) 
    { 
    pos = m_string.find('\n'); 
    if (pos != std::string::npos) 
    { 
    std::string tmp(m_string.begin(), m_string.begin() + pos); 
    log_window->append(tmp.c_str()); 
    m_string.erase(m_string.begin(), m_string.begin() + pos + 1); 
    } 
    } 

    return n; 
} 

private: 
std::ostream &m_stream; 
std::streambuf *m_old_buf; 
std::string m_string; 


    QTextEdit* log_window; 
    }; 

#endif 

main.cpp

#include "qdebugstream.h" 
#include "qtextedit.h" 
#include <QtGui> 

int main(int argc, char **argv) 
{ 
    QApplication application(argc, argv); 
     application.connect(&application, SIGNAL(lastWindowClosed()), 
    &application, SLOT(quit())); 

     QMainWindow* mainWindow = new QMainWindow(); 

     QTextEdit* myTextEdit = new QTextEdit(mainWindow, "myTextEdit"); 
     myTextEdit->setTextFormat(Qt::LogText); 
     QDebugStream qout(std::cout, myTextEdit); 

     mainWindow->show(); 
     std::cout << "Send this to the Text Edit!" << std::endl; 

     return application.exec(); 
} 

我收到以下错误信息:

C:\Documents and Settings\Administrator\untitled1-build-desktop-Qt_4_8_1_for_Desktop_-_MSVC2010__Qt_SDK__Debug..\untitled1\main.cpp:13: error: C2664: 'QTextEdit::QTextEdit(const QString &,QWidget *)' : cannot convert parameter 1 from 'QMainWindow *' to 'const QString &' Reason: cannot convert from 'QMainWindow *' to 'const QString' No constructor could take the source type, or constructor overload resolution was ambiguous

C:\Documents and Settings\Administrator\untitled1-build-desktop-Qt_4_8_1_for_Desktop_-_MSVC2010__Qt_SDK__Debug..\untitled1\main.cpp:14: error: C2039: 'setTextFormat' : is not a member of 'QTextEdit'

c:\qtsdk\desktop\qt\4.8.1\msvc2010\include\qtgui\qtextedit.h:70: see declaration of 'QTextEdit'

回答

1

望着documentationQTextEdit有两个构造,

QTextEdit::QTextEdit (QWidget * parent = 0) 

QTextEdit::QTextEdit (const QString & text, QWidget * parent = 0) 

尝试改变

QTextEdit* myTextEdit = new QTextEdit(mainWindow, "myTextEdit"); 

QTextEdit* myTextEdit = new QTextEdit(mainWindow); 

这不会解决所有的问题,因为仍有使用旧的API QT3地方。您需要根据需要进行更改。

+0

谢谢。我能够测试它,它的工作原理。 – 2012-04-26 14:27:22

+0

@NinjaJoey没问题。由于您是新手,下面简要介绍如何接受答案:http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – 2012-04-26 14:41:18