簡體   English   中英

將std :: cout重定向到QTextEdit

[英]redirect std::cout to QTextEdit

是否可以(更重要的是-how-)將輸出流重定向到QTextBox。 這樣一來,如果我在應用程序中的任何位置編寫std::cout << "test" ,它將被重定向到我定義的文本框?

我嘗試了顯而易見的方法(其中ui.textEdit是指向文本編輯框的指針):

std::cout.rdbuf(ui.textEdit);
std::cout << "test";

但是,這不起作用。 (明顯)。 -將cout重定向到qDebug也不起作用(甚至無法將qDebug定向到文本字段)。

我正在使用qt4.8 btw ...

編輯:所以我嘗試了在郵件列表中發布的解決方案。但是現在出現訪問沖突。

class MainInterface : public QMainWindow
{
    Q_OBJECT
....
private: 
    QDebugStream qout

使用構造函數:

MainInterface::MainInterface(QWidget *parent, Qt::WFlags flags)
    : QMainWindow(parent, flags),
    qout(std::cout, ui.textEdit)
{

並在成員函數中發布以下行: std::cout << "Project Loaded" << std::endl;

該行現在導致來自“ qscoped_pointer”的訪問沖突。 (我是否應該將其作為單獨的問題更詳細地發布?)

編輯:好吧,“解決方案”是在完全創建ui.textEdit之后才聲明qout。

對於這個問題,我為QTextEdit編寫了自己的函數,只是要注意,如果在主線程上執行繁重的操作來運行它,GUI將會凍結。 因此,例如,您必須實例化一個新的QThread,然后分別相應更新GUI和QTextEdit:

頭文件:

class myConsoleStream :  public std::basic_streambuf<char>
{

public:
    myConsoleStream(std::ostream &stream, QTextEdit* text_edit);

    virtual ~myConsoleStream();
    static void registerMyConsoleMessageHandler();

private:

    static void myConsoleMessageHandler(QtMsgType type, 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

.cpp文件:

myConsoleStream::myConsoleStream(std::ostream &stream, QTextEdit* text_edit)
    :std::basic_streambuf<char>()
    ,m_stream(stream)


{
    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 type, const QMessageLogContext &, const QString &msg)
{

    QByteArray localMsg = msg.toLocal8Bit();
       switch (type) {
       case QtDebugMsg:
          // fprintf(stderr, "Debug: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
           break;
       case QtInfoMsg:
          // fprintf(stderr, "Info: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
           break;
       case QtWarningMsg:
          // fprintf(stderr, "Warning: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
           break;
       case QtCriticalMsg:
           //fprintf(stderr, "Critical: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
           break;
       case QtFatalMsg:
          // fprintf(stderr, "Fatal: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
           break;
       default:
            std::cout << msg.toStdString().c_str();
           break;

       }
}

在主窗口中,您只需實例化新的Stream:

new myConsoleStream(std::cout, this->ui->Console);
  myConsoleStream::registerMyConsoleMessageHandler(); 

而且你也很好! 希望這可以幫助。

您可以將cout重置為自己的ostream實現,該實現將emit掛在append插槽上的信號。 因此,您的子問題/練習是:

  1. 重定向cout
  2. cout重定向到您自己的ostream實現或您可以擴展的實現
  3. QTextBox emit信號

據我所知,這些子主題可在SO上找到

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM