C++ 已升级QTextEdit以构造控制台窗口
我尝试为我的Gui构建一个提升的QTextEdit控制台小部件,在其中重定向所有std::cout。对于重定向,我主要遵循: 我的代码如下所示: myConsoleStream.cpp:C++ 已升级QTextEdit以构造控制台窗口,c++,qt,c++11,qt5.5,C++,Qt,C++11,Qt5.5,我尝试为我的Gui构建一个提升的QTextEdit控制台小部件,在其中重定向所有std::cout。对于重定向,我主要遵循: 我的代码如下所示: myConsoleStream.cpp: #include "myconsolestream.h" myConsoleStream::myConsoleStream(std::ostream &stream, QTextEdit* text_edit,QWidget *parent) :std::basic_streambuf
#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;
}
最后但并非最不重要的一点是,我的Mainwindow类如下所示:
#include "myconsole.h"
myConsole::myConsole(QWidget *parent)
:QTextEdit(parent)
{
}
myConsole::~myConsole()
{
}
#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;
}
#包括“mainwindow.h”
#包括“ui_main window.h”
#包括
#包括
#包括“myconsolestream.h”
主窗口::主窗口(QWidget*父窗口):
QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
用户界面->设置用户界面(此);
新建myConsoleStream(std::cout,this->ui->Console,this);//将控制台输出重定向到QTextEdit
myConsolleStream::registerMyConsoleMessageHandler();//将qDebug()输出重定向到QTextEdit
std::cout它看起来像是您使用myConsole
类创建了自己的QTextEdit
,您还将输出重定向到this->ui->Console
,我猜它是使用ui设计器创建的,也是中的QTextEdit
myConsole
的一个实例,然后显示在窗口的左上角,因为您不提供任何布局信息,只提供一个父窗口小部件
要澄清的是,您的myConsoleStream
是从myConsole
派生而来的,它从QTextEdit
派生而来,因此您的myConsoleStream
也是类型QTextEdit
本身的对象
如果您遵循链接中提供的示例,则不必创建另一个QTextEdit
,如果您想这样做,还必须将其放置在UI等中。您是对的,这就是问题所在。我假设我必须在设计器中创建QTextEdit。但是从myConsole类中获取QTextEdit并分配布局感谢您的支持,感谢您的推广。
#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;
}