2017-08-01 3 views
-1

私はすべてのstd :: coutをリダイレクトする私のGui用の昇格したQTextEdit Consoleウィジェットを構築しようとしています。リダイレクトのために私はほとんどthis tutorialを追っ:QTextEditがコンソールウィンドウを構築するように昇格しました

私のコードは次のようになります。私はこのクラスにのサブクラスを作ってみました

#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 

: 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私が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; 


} 

私はこれを実行すると、私はそこに持っていけない私のメインウィンドウの左upperhand隅に二QTextEditが、そこに表示されます。

最後に少なくともではない、私のメインウィンドウクラスは次のようになります。そして、なぜこれが現れているのか、これがどこに作られたのかを理解することはできません。

Btw私はqt5.5とQtCreatorを使用しています。

答えて

0

あなたはmyConsoleクラスを使用して独自のQTextEditを作成し、また、私はUIデザイナともQTextEditのインスタンスを使用して作成された推測this->ui->Consoleにあなたの出力をリダイレクトするように見えます。 myConsoleは、レイアウト情報と親ウィジェットを提供していないため、ウィンドウの左上に表示されます。 clarifiyする

、あなたmyConsoleStream用語にQTextEdit由来するmyConsoleに由来するので、あなたmyConsoleStreamもタイプQTextEdit自体の目的です。だっ

あなたがあなたのリンクに提供される例に従えば、あなたはまた、あなたのUIなどでそれを置くために持っていることを行いたい場合は、別のQTextEditを作成する必要はありません。..

+0

あなたは正しいです、問題。私はデザイナでQTextEditを作成しなければならないと仮定しました。しかし、QTextEditをmyConsoleクラスから取り出し、レイアウトの情報とプロモーションを割り当てることは、そのトリックを行います。どうもありがとうございました。 – Astraeus

関連する問題