C ++ Qt: перенаправить cout из потока, чтобы испустить сигнал

В одном потоке у меня есть этот прекрасный класс, который перенаправляет весь вывод cout в QTextEdit

#include <iostream>
#include <streambuf>
#include <string>
#include <QScrollBar>

#include "QTextEdit"
#include "QDateTime"

class ThreadLogStream : public std::basic_streambuf<char>, QObject
{
    Q_OBJECT
public:
    ThreadLogStream(std::ostream &stream) : m_stream(stream)
    {
        m_old_buf = stream.rdbuf();
        stream.rdbuf(this);
    }
    ~ThreadLogStream()
    {
        // output anything that is left
        if (!m_string.empty())
        {
            log_window->append(m_string.c_str());
        }

        m_stream.rdbuf(m_old_buf);
    }

protected:
    virtual int_type overflow(int_type v)
    {
        if (v == '\n')
        {
            log_window->append(m_string.c_str());
            m_string.erase(m_string.begin(), m_string.end());
        }
        else
            m_string += v;

        return v;
    }


    virtual std::streamsize xsputn(const char *p, std::streamsize n)
    {
        m_string.append(p, p + n);

        long pos = 0;
        while (pos != static_cast<long>(std::string::npos))
        {
            pos = m_string.find('\n');
            if (pos != static_cast<long>(std::string::npos))
            {
                std::string tmp(m_string.begin(), m_string.begin() + pos);
                log_window->append(tmp.c_str());
                m_string.erase(m_string.begin(), m_string.begin() + pos + 1);
            }
        }

        return n;
    }

private:
    std::ostream &m_stream;
    std::streambuf *m_old_buf;
    std::string m_string;


    QTextEdit* log_window;
};

Однако это не работает, если ЛЮБОЙ поток (QThread) инициируется cout. Это связано с тем, что все указатели перепутаны, и нужно использовать сигналы и слоты для обеспечения возможности передачи данных между подпотоком и основным потоком.

Я хотел бы изменить этот класс, чтобы излучать сигнал, а не записывать в текстовый файл. Это требует, чтобы этот класс стал Q_OBJECT и был унаследован от одного. Я пытался унаследовать отQObject в дополнение кstd::basic_streambuf<char> и добавил макрос Q_OBJECT в тело, но не скомпилировал.

Не могли бы вы помочь мне достичь этого? Что я должен сделать, чтобы этот класс излучал сигналы, к которым я могу подключиться и которые безопасны для потоков?

Ответы на вопрос(2)

Ваш ответ на вопрос