我有一个C++项目,其中我将一个小的日志文件写到std::cout。在这个项目中,我有一个自己创建的主对象和一个运行代码的函数。简化后的版本如下所示:
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。如下所示:
int main(int argc, char *argv[])
{
std::string pathToSettingsFile(argv[1]);
std::ostream &output = std::cout;
MainObject m(pathToSettingsFile, output);
m.run();
}如果我想从QT开始,我只需添加另一个ostream。
// GUI CODE:
QTextBrowser *tb = new QTextBrowser();
std::ostream myOstream = somehow connect myOstream to tb;
MainObject m(pathToSettingsFile, output);
m.run();但我不知道我该怎么做,如果这是可能的话...对于这个问题,可能还有另一个非常简单的解决方案。
感谢您的反馈
发布于 2018-01-31 03:29:31
std::ostream的构造函数以std::streambuf作为其参数。要重定向写入std::cout的字符,请实现自定义std::streambuf,例如
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:
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,例如
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)将会起作用,但可能效率不高(缓慢)。
https://stackoverflow.com/questions/48524062
复制相似问题