I’m new to Qt application development, I would appreciate your help. This is a re-post of
redirect std::cout to QTextEdit
I’m trying to redirect std::cout to a QTextEdit and I’ve seen and tried to test the example provided in the following link.
Reference Link 1: http://lists.trolltech.com/qt-interest/2005-06/thread00166-0.html
Using Qt Creator 2.4.1 to test the example from Reference Link 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();
}
I get the following error messages:
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 ambiguousC:\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’
Looking at the documentation,
QTextEdithas two constructors,and
Try changing
to
This won’t fix all the problems, since there are still places that use the old Qt3 API. You’ll need to make changes as necessary.