Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 已升级QTextEdit以构造控制台窗口_C++_Qt_C++11_Qt5.5 - Fatal编程技术网

C++ 已升级QTextEdit以构造控制台窗口

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

我尝试为我的Gui构建一个提升的QTextEdit控制台小部件,在其中重定向所有std::cout。对于重定向,我主要遵循:

我的代码如下所示: 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;
}
最后但并非最不重要的一点是,我的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;


}