[英]redirect std::cout to QTextEdit
是否可以(更重要的是-how-)將輸出流重定向到QTextBox。 這樣一來,如果我在應用程序中的任何位置編寫std::cout << "test"
,它將被重定向到我定義的文本框?
我嘗試了顯而易見的方法(其中ui.textEdit是指向文本編輯框的指針):
std::cout.rdbuf(ui.textEdit);
std::cout << "test";
但是,這不起作用。 (明顯)。 -將cout重定向到qDebug也不起作用(甚至無法將qDebug定向到文本字段)。
我正在使用qt4.8 btw ...
編輯:所以我嘗試了在郵件列表中發布的解決方案。但是現在出現訪問沖突。
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;
}
}
在主窗口中,您只需實例化新的Stream:
new myConsoleStream(std::cout, this->ui->Console);
myConsoleStream::registerMyConsoleMessageHandler();
而且你也很好! 希望這可以幫助。
您可以將cout
重置為自己的ostream
實現,該實現將emit
掛在append
插槽上的信號。 因此,您的子問題/練習是:
cout
cout
重定向到您自己的ostream
實現或您可以擴展的實現 QTextBox
emit
信號 據我所知,這些子主題可在SO上找到
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.