Потоковая передача в QTextEdit через QTextStream - PullRequest
4 голосов
/ 28 февраля 2010

Я часто хотел использовать QTextEdit в качестве быстрого средства отображения того, что пишется в поток. То есть вместо записи в QTextStream out (stdout) я хочу сделать что-то вроде:

 QTextEdit qte; 
 QTextStream out(qte);  

Я мог бы сделать что-то подобное, если бы я отправил сигнал после записи в QTextStream прикреплен к QString.
Проблема в том, что я хочу, чтобы интерфейс был так же, как если бы я транслировал на stdout и т. д.:

out << some data << endl;

Есть идеи, как мне это сделать?

Заранее спасибо.

Ответы [ 2 ]

7 голосов
/ 01 марта 2010

Вы можете создать QIODevice, который выводит в QTextEdit.

class TextEditIoDevice : public QIODevice 
{
    Q_OBJECT

public:
    TextEditIoDevice(QTextEdit *const textEdit, QObject *const parent) 
        : QIODevice(parent)
        , textEdit(textEdit)
    {
        open(QIODevice::WriteOnly|QIODevice::Text);
    }

    //...

protected:
    qint64 readData(char *data, qint64 maxSize) { return 0; }
    qint64 writeData(const char *data, qint64 maxSize)
    {
        if(textEdit)
        {
            textEdit->append(data);
        }
        return maxSize;
    }

private:
    QPointer<QTextEdit> textEdit;
};


// In some dialogs constructor
QTextStream  ss(new TextEditIoDevice(*ui.textEdit, this));
ss <<  "Print formatted text " <<hex << 12 ;
// ...
2 голосов
/ 28 февраля 2010

Вы можете создать подкласс QTextEdit и реализовать оператор <<, чтобы придать ему желаемое поведение; что-то вроде:

class TextEdit : public QTextEdit {
    .../...
    TextEdit & operator<< (QString const &str) {
        append(str);

        return *this;
    }
};
...