QTextEdit被提升为构建控制台窗口

时间:2017-08-01 11:46:49

标签: c++ qt c++11 qt5.5

我尝试为我的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

我试图让这个类成为我将QTextEdit提升到的另一个类的子类。看起来像这样:

#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左上角会出现第二个QTextEdit,我不想在那里。而我无法弄清楚为什么会出现这种情况或者创建它的原因?

顺便说一下,我正在使用qt5.5和QtCreator。

1 个答案:

答案 0 :(得分:0)

看起来您使用QTextEdit类创建了自己的myConsole,并且还将输出重定向到this->ui->Console,我猜这是使用UI设计器创建的,也是QTextEdit的实例{1}}。 myConsole然后显示在窗口的左上角,因为您没有为其提供任何布局信息,只提供父窗口小部件。

为了澄清,您的myConsoleStream源自myConsole,其中术语来自QTextEdit,因此您的myConsoleStream也是QTextEdit类型的对象本身。

如果您按照链接中提供的示例进行操作,则不必创建另一个QTextEdit,如果您想这样做,则还必须将其放在您的UI等中。