26#ifndef ConsoleStream_H
27#define ConsoleStream_H
74class ConsoleStream :
public QObject,
public std::basic_streambuf<char> {
80 previousBuffer(nullptr),
81 logTextEdit(nullptr) {}
93 previousBuffer = stream->rdbuf();
99 logTextEdit = textEdit;
103 void init(std::ostream* stream, QTextEdit* textEdit) {
110 if (previousBuffer !=
nullptr && myStream !=
nullptr) {
111 myStream->rdbuf(previousBuffer);
113 previousBuffer =
nullptr;
129 buffer +=
static_cast<char>(v);
135 std::streamsize
xsputn(
const char* p, std::streamsize n)
override {
136 buffer.append(p, p + n);
138 std::string::size_type pos = 0;
139 while ((pos = buffer.find(
'\n')) != std::string::npos) {
140 std::string line = buffer.substr(0, pos);
141 buffer.erase(0, pos + 1);
142 emitText(QString::fromLocal8Bit(line.c_str()));
149 void emitText(
const QString &text) {
154 QMetaObject::invokeMethod(logTextEdit, [text,
this]() {
155 logTextEdit->moveCursor(QTextCursor::End);
156 logTextEdit->insertPlainText(text +
"\n");
157 logTextEdit->moveCursor(QTextCursor::End);
158 }, Qt::QueuedConnection);
161 void flushPending() {
162 if (!buffer.empty()) {
163 emitText(QString::fromLocal8Bit(buffer.c_str()));
168 std::ostream* myStream;
169 std::streambuf* previousBuffer;
171 QTextEdit* logTextEdit;
Provides a console windows, within the CamiTK application.
Definition ConsoleStream.h:74
void appendText(QString text)
use a signal to print safely even if cout/cerr are written from other thread
std::streamsize xsputn(const char *p, std::streamsize n) override
rewriting of the inherited method xsputn
Definition ConsoleStream.h:135
void free()
reset the state as it was before (stream use the old buffer again)
Definition ConsoleStream.h:109
void setTextEdit(QTextEdit *textEdit)
set the log QTextEdit
Definition ConsoleStream.h:98
ConsoleStream(QObject *parent=nullptr)
default constructor, init(..) have to be called later, before first use
Definition ConsoleStream.h:77
~ConsoleStream() override
destructor: use free() to restore previous stream output buffer
Definition ConsoleStream.h:84
int_type overflow(int_type v) override
rewriting of the inherited method overflow
Definition ConsoleStream.h:124
void init(std::ostream *stream, QTextEdit *textEdit)
initialize ConsoleStream using both input stream and output text edit
Definition ConsoleStream.h:103
void setStream(std::ostream *stream)
set the value for the buffer to be replaced by the ConsoleStream
Definition ConsoleStream.h:90