是否可以(更重要的是如何)将输出流重定向到QTextBox。因此,如果我在应用程序中的任何地方编写std::cout << "test"
,它会被重定向到我定义的文本框中吗?
我尝试了显而易见的方法(其中ui.textEdit是指向文本编辑框的指针):
std::cout.rdbuf(ui.textEdit);
std::cout << "test";
然而,这并不起作用。(显然)。+将cout重定向到qDebug也不起作用(甚至将qDebug重定向到文本字段)。
我用的是qt4.8btw...
编辑:所以我尝试了邮件列表中发布的解决方案。但是,现在出现了访问冲突。
class MainInterface : public QMainWindow
{
Q_OBJECT
....
private:
QDebugStream qout
使用构造函数:
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。
发布于 2012-02-09 21:06:09
您可以将cout
重置为您自己的ostream
实现,这将emit
您挂接到append
插槽上的信号。因此,您的子问题/练习是:
cout
cout
重定向到您自己的ostream
实现或您可以通过extendemit
信号发送到QTextBox
的ostream
实现
据我所知,这些子主题可以在SO上找到。
发布于 2017-08-04 20:46:42
我为这个问题写了我自己的函数,对于一个QTextEdit,只要知道如果你在主线程上运行它,你的图形用户界面将会冻结。因此,你必须实例化一个新的图形用户界面,例如,相应的图形用户界面,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();
你太棒了,走吧!希望这能有所帮助。
https://stackoverflow.com/questions/9211298
复制相似问题