c++ - 将 std::cout 重定向到 QTextEdit

标签 c++ qt iostream

是否有可能(更重要的是-如何-)将输出流重定向到 QTextBox。这样如果我写 std::cout << "test"在应用程序的任何地方它都被重定向到我定义的文本框?

我尝试了显而易见的(其中 ui.textEdit 是指向文本编辑框的指针):

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

但是这不起作用。 (明显地)。 - 将 cout 重定向到 qDebug 也不起作用(甚至将 qDebug 重定向到文本字段)。

顺便说一句,我正在使用 qt4.8...

编辑: 所以我尝试了邮件列表中发布的解决方案。但是现在出现了访问冲突。

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;

       }
}

在您的主窗口中,您只需实例化您的新流:

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

你也去吧! 希望这会有所帮助。

关于c++ - 将 std::cout 重定向到 QTextEdit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9211298/

相关文章:

c++ - 使用 std::transform 从特定目标偏移量插入到目标中

java - 在 Linux 上运行 Java 调用 native .so 时持续存在 UnsatisfiedLinkError

qt - QT 更新值信号/槽的最佳实践

c++ - 如何通过 qt 设计器创建 QSplitter ui 类?

c++ - C++ iomanip 库的有效使用

c++ - 每次我想在基本类型之间进行转换时,我真的应该使用 static_cast 吗?

c++ - 没有父指针的AVL树如何实现插入?

python - qwidget.setGeometry() 在 Linux 上的位置不正确

java - JOGL 的纹理加载

c++ - 如何从内存中读取,就像使用 iostream 从文件中读取一样?