QTextEdit 晋升为构建控制台 Window
QTextEdit promoted to Construct a Console Window
我尝试为我的 Gui 构建一个提升的 QTextEdit 控制台小部件,我在其中重定向所有 std::cout。对于重定向,我主要遵循 this tutorial:
我的代码如下所示:
myConsoleStream.cpp:
#include "myconsolestream.h"
myConsoleStream::myConsoleStream(std::ostream &stream, QTextEdit* text_edit,QWidget *parent)
:std::basic_streambuf<char>()
,m_stream(stream)
,myConsole(parent)
{
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, const QMessageLogContext &, const QString &msg)
{
std::cout << msg.toStdString().c_str();
}
std::streamsize myConsoleStream::xsputn(const char *p, std::streamsize n)
{
QString str(p);
if(str.contains("\n"))
{
QStringList strSplitted = str.split("\n");
this->log_window->moveCursor (QTextCursor::End);
this->log_window->insertPlainText (strSplitted.at(0)); //Index 0 immer noch auf der alten Zeile
for(int i = 1; i < strSplitted.size(); i++)
{
this->log_window->append(strSplitted.at(i));
}
}
else
{
log_window->moveCursor (QTextCursor::End);
log_window->insertPlainText (str);
}
return n;
}
myConsoleStream.h:
#ifndef Q_DEBUGSTREAM_H
#define Q_DEBUGSTREAM_H
#include <iostream>
#include <streambuf>
#include <string>
#include <QObject>
#include <QWidget>
#include "QTextEdit"
#include <QApplication>
#include "myconsole.h"
class myConsoleStream : public std::basic_streambuf<char>, myConsole
{
public:
myConsoleStream(std::ostream &stream, QTextEdit* text_edit, QWidget *parent);
virtual ~myConsoleStream();
static void registerMyConsoleMessageHandler();
private:
static void myConsoleMessageHandler(QtMsgType, 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
我试图使这个 class 成为我提升 QTextEdit to.Which 的附加 class 的子class 看起来像这样:
#include "myconsole.h"
myConsole::myConsole(QWidget *parent)
:QTextEdit(parent)
{
}
myConsole::~myConsole()
{
}
最后但同样重要的是我的主窗口 Class 看起来像这样:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QBoxLayout>
#include <QTimer>
#include "myconsolestream.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
new myConsoleStream(std::cout, this->ui->Console,this);//Redirect Console output to QTextEdit
myConsoleStream::registerMyConsoleMessageHandler(); //Redirect qDebug() output to QTextEdit
std::cout << "Hallo" << std::endl;
}
MainWindow::~MainWindow()
{
delete ui;
}
如果我执行此操作,我的主窗口的左上角会出现第二个 QTextEdit,我不希望它出现在那里。而且我无法弄清楚为什么会出现这种情况或在何处创建这种情况?
顺便说一句,我正在使用 qt5.5 和 QtCreator。
您似乎使用 myConsole
class 创建了自己的 QTextEdit
,并且您还将输出重定向到 this->ui->Console
,我猜这是使用 [= 创建的29=] 设计师,也是 QTextEdit
的一个实例。 myConsole
然后显示在 window 的左上角,因为您没有为它提供任何布局信息,而只提供一个父窗口小部件。
澄清一下,您的 myConsoleStream
派生自 myConsole
术语派生自 QTextEdit
,因此您的 myConsoleStream
也是类型 [=10] 的对象=] 本身。
如果您按照 link 中提供的示例进行操作,则不必创建另一个 QTextEdit
,如果您想要创建另一个 QTextEdit
,则还必须将其放入 UI等..
我尝试为我的 Gui 构建一个提升的 QTextEdit 控制台小部件,我在其中重定向所有 std::cout。对于重定向,我主要遵循 this tutorial:
我的代码如下所示: myConsoleStream.cpp:
#include "myconsolestream.h"
myConsoleStream::myConsoleStream(std::ostream &stream, QTextEdit* text_edit,QWidget *parent)
:std::basic_streambuf<char>()
,m_stream(stream)
,myConsole(parent)
{
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, const QMessageLogContext &, const QString &msg)
{
std::cout << msg.toStdString().c_str();
}
std::streamsize myConsoleStream::xsputn(const char *p, std::streamsize n)
{
QString str(p);
if(str.contains("\n"))
{
QStringList strSplitted = str.split("\n");
this->log_window->moveCursor (QTextCursor::End);
this->log_window->insertPlainText (strSplitted.at(0)); //Index 0 immer noch auf der alten Zeile
for(int i = 1; i < strSplitted.size(); i++)
{
this->log_window->append(strSplitted.at(i));
}
}
else
{
log_window->moveCursor (QTextCursor::End);
log_window->insertPlainText (str);
}
return n;
}
myConsoleStream.h:
#ifndef Q_DEBUGSTREAM_H
#define Q_DEBUGSTREAM_H
#include <iostream>
#include <streambuf>
#include <string>
#include <QObject>
#include <QWidget>
#include "QTextEdit"
#include <QApplication>
#include "myconsole.h"
class myConsoleStream : public std::basic_streambuf<char>, myConsole
{
public:
myConsoleStream(std::ostream &stream, QTextEdit* text_edit, QWidget *parent);
virtual ~myConsoleStream();
static void registerMyConsoleMessageHandler();
private:
static void myConsoleMessageHandler(QtMsgType, 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
我试图使这个 class 成为我提升 QTextEdit to.Which 的附加 class 的子class 看起来像这样:
#include "myconsole.h"
myConsole::myConsole(QWidget *parent)
:QTextEdit(parent)
{
}
myConsole::~myConsole()
{
}
最后但同样重要的是我的主窗口 Class 看起来像这样:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QBoxLayout>
#include <QTimer>
#include "myconsolestream.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
new myConsoleStream(std::cout, this->ui->Console,this);//Redirect Console output to QTextEdit
myConsoleStream::registerMyConsoleMessageHandler(); //Redirect qDebug() output to QTextEdit
std::cout << "Hallo" << std::endl;
}
MainWindow::~MainWindow()
{
delete ui;
}
如果我执行此操作,我的主窗口的左上角会出现第二个 QTextEdit,我不希望它出现在那里。而且我无法弄清楚为什么会出现这种情况或在何处创建这种情况?
顺便说一句,我正在使用 qt5.5 和 QtCreator。
您似乎使用 myConsole
class 创建了自己的 QTextEdit
,并且您还将输出重定向到 this->ui->Console
,我猜这是使用 [= 创建的29=] 设计师,也是 QTextEdit
的一个实例。 myConsole
然后显示在 window 的左上角,因为您没有为它提供任何布局信息,而只提供一个父窗口小部件。
澄清一下,您的 myConsoleStream
派生自 myConsole
术语派生自 QTextEdit
,因此您的 myConsoleStream
也是类型 [=10] 的对象=] 本身。
如果您按照 link 中提供的示例进行操作,则不必创建另一个 QTextEdit
,如果您想要创建另一个 QTextEdit
,则还必须将其放入 UI等..