首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >std::cout到QTextBrowser

std::cout到QTextBrowser
EN

Stack Overflow用户
提问于 2018-01-30 22:42:34
回答 1查看 289关注 0票数 0

我有一个C++项目,其中我将一个小的日志文件写到std::cout。在这个项目中,我有一个自己创建的主对象和一个运行代码的函数。简化后的版本如下所示:

代码语言:javascript
复制
int main(int argc, char *argv[])
{
   std::string pathToSettingsFile(argv[1]);
   MainObject m(pathToSettingsFile);
   m.run();
}

现在我已经为这个应用程序开发了一个Qt GUI。其中一个条件是,我不能在我的项目中使用任何QT库。(QT只允许在图形用户界面中使用,而图形用户界面目前完全独立于项目--基本上图形用户界面只创建一个可以由项目加载的settingsFile )

有没有可能我将std::cout重定向到一个QTextBrowser?我想简单地添加第二个输入参数,默认情况下是std::cout,但如果需要,它会指向QTextBrowser。如下所示:

代码语言:javascript
复制
int main(int argc, char *argv[])
{
   std::string pathToSettingsFile(argv[1]);
   std::ostream &output = std::cout;
   MainObject m(pathToSettingsFile, output);
   m.run();
}

如果我想从QT开始,我只需添加另一个ostream。

代码语言:javascript
复制
// GUI CODE:
QTextBrowser *tb = new QTextBrowser();
std::ostream myOstream = somehow connect myOstream to tb; 
MainObject m(pathToSettingsFile, output);
m.run();

但我不知道我该怎么做,如果这是可能的话...对于这个问题,可能还有另一个非常简单的解决方案。

感谢您的反馈

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-31 03:29:31

std::ostream的构造函数以std::streambuf作为其参数。要重定向写入std::cout的字符,请实现自定义std::streambuf,例如

代码语言:javascript
复制
class TBBuf : public std::streambuf
{
private:
    QTextBrowser *tbOut;

protected:
    virtual int_type overflow(int_type c) {
        if (c != traits_type::eof() && tbOut) {
            tbOut->moveCursor(QTextCursor::End);
            tbOut->insertPlainText((QChar(c)));
            return c;
        }
        return traits_type::eof();
    }

    // By default, superclass::xsputn call overflow method,
    // but for performance reason, here we override xsputn
    virtual std::streamsize xsputn(const char * str, std::streamsize n) {
        if (tbOut && n > 0) {
            tbOut->moveCursor(QTextCursor::End);
            tbOut->insertPlainText(QString::fromLatin1(str, n));
        }

        return n;
    }

public:
    TBBuf(QTextBrowser *tb) : tbOut(tb) {}
};

然后,只需通过以下方式将std::cout重定向到QTextBrowser

代码语言:javascript
复制
QTextBrowser *tb = new QTextBrowser();
TBBuf *buf = new TBBuf(tb);

std::streambuf *oldBuf = std::cout.rdbuf();
std::cout.rdbuf(buf);

std::string pathToSettingsFile(argv[1]);
MainObject m(pathToSettingsFile);
m.run();

std::cout.rdbuf(oldBuf);
//cleanup
//...

或者通过构建std::ostream,例如

代码语言:javascript
复制
QTextBrowser *tb = new QTextBrowser();
TBBuf *buf = new TBBuf(tb);

std::ostream output(buf);
MainObject m(pathToSettingsFile, output);
m.run();

请注意,在实现std::streambuf的子类时,简单地覆盖virtual int_type overflow(int_type c)将会起作用,但可能效率不高(缓慢)。

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

https://stackoverflow.com/questions/48524062

复制
相关文章

相似问题

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