首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将std::cout重定向到QTextEdit

将std::cout重定向到QTextEdit
EN

Stack Overflow用户
提问于 2012-02-09 21:00:01
回答 2查看 4.7K关注 0票数 5

是否可以(更重要的是如何)将输出流重定向到QTextBox。因此,如果我在应用程序中的任何地方编写std::cout << "test",它会被重定向到我定义的文本框中吗?

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

代码语言:javascript
运行
复制
std::cout.rdbuf(ui.textEdit);
std::cout << "test";

然而,这并不起作用。(显然)。+将cout重定向到qDebug也不起作用(甚至将qDebug重定向到文本字段)。

我用的是qt4.8btw...

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

代码语言:javascript
运行
复制
class MainInterface : public QMainWindow
{
    Q_OBJECT
....
private: 
    QDebugStream qout

使用构造函数:

代码语言:javascript
运行
复制
MainInterface::MainInterface(QWidget *parent, Qt::WFlags flags)
    : QMainWindow(parent, flags),
    qout(std::cout, ui.textEdit)
{

在成员函数中,以下行被posted:std::cout << "Project Loaded" << std::endl;

该行现在会导致来自"qscoped_pointer“的访问冲突。(我是否应该将此作为单独的问题来发布更详细的内容?)

编辑:好的,“解决方案”是只在ui.textEdit完全创建之后声明qout。

EN

回答 2

Stack Overflow用户

发布于 2012-02-09 21:06:09

您可以将cout重置为您自己的ostream实现,这将emit您挂接到append插槽上的信号。因此,您的子问题/练习是:

  1. cout
  2. redirect cout重定向到您自己的ostream实现或您可以通过extend
  3. emit信号发送到QTextBox

ostream实现

据我所知,这些子主题可以在SO上找到。

票数 1
EN

Stack Overflow用户

发布于 2017-08-04 20:46:42

我为这个问题写了我自己的函数,对于一个QTextEdit,只要知道如果你在主线程上运行它,你的图形用户界面将会冻结。因此,你必须实例化一个新的图形用户界面,例如,相应的图形用户界面,QTextEdit将相应地更新:

头文件:

代码语言:javascript
运行
复制
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文件:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
new myConsoleStream(std::cout, this->ui->Console);
  myConsoleStream::registerMyConsoleMessageHandler(); 

你太棒了,走吧!希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9211298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档