перенаправить std :: cout в QTextEdit - PullRequest
4 голосов
/ 09 февраля 2012

Возможно ли (и что более важно -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".(Должен ли я публиковать это с более подробной информацией в качестве отдельного вопроса?)

РЕДАКТИРОВАТЬ: хорошо "решение" было объявить qout только после того, как ui.textEdit был полностью создан.

Ответы [ 2 ]

1 голос
/ 04 августа 2017

Я написал свою собственную функцию для этой проблемы, для QTextEdit, просто имейте в виду, что если вы запустите его с тяжелыми операциями вдоль основного потока, ваш графический интерфейс будет зависать.Так что вам нужно создать новый QThread, например, тогда графический интерфейс соответственно 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;

       }
}

В вашем главном окне вы просто должны создать свой новый поток:

new myConsoleStream(std::cout, this->ui->Console);
  myConsoleStream::registerMyConsoleMessageHandler(); 

и вы тоже хороши!Надеюсь, это поможет.

1 голос
/ 09 февраля 2012

Вы можете сбросить cout на свою собственную реализацию ostream, которая будет emit сигнализировать о том, что вы подключаете слот append. Вы подзадачи / упражнения, следовательно:

  1. перенаправление cout
  2. перенаправить cout на собственную реализацию ostream или на реализацию, которую вы можете расширить
  3. emit сигналы на QTextBox

Эти подтемы доступны на SO, насколько я знаю

...