Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Storing and displaying "large" amoung of data in QTextEdit



  • Hey guys!

    I have data stored in vectors that I would like to show in a QTextEdit. What I do now is I create a QTextDocument and a QTextCursor and I append all data as QStrings into that Document like this (altered some things so you can try to compile if needed):

    @
    QTextDocument* parseDoc(std::vector<double>& time, std::vector<std::array<double,3>>& pos, std::vector<std::array<double,3>>& pos){
    parsedDocument = new QTextDocument();
    myDocumentCursor = new QTextCursor(parsedDocument);

    QTextCharFormat textFormat = myDocumentCursor->charFormat();
    textFormat.setFontFamily("Courier");
    myDocumentCursor->setCharFormat(textFormat);

        QString formattedString;
    

    formattedString = QString("This is th Data of Some object. It was retrieved on %2\r\n").arg(QDateTime::currentDateTime().toString());
    myDocumentCursor->insertText(formattedString);

    myDocumentCursor->insertBlock();

    formattedString = QString("Epoch").leftJustified(21, ' ');
    formattedString.append(QString("Position x-Axis").leftJustified(21, ' '));
    formattedString.append(QString("Position y-Axis").leftJustified(21, ' '));
    formattedString.append(QString("Position z-Axis").leftJustified(21, ' '));
    formattedString.append(QString("Velocity x-Axis").leftJustified(21, ' '));
    formattedString.append(QString("Velocity y-Axis").leftJustified(21, ' '));
    formattedString.append(QString("Velocity z-Axis").leftJustified(16, ' '));
    myDocumentCursor->insertText(formattedString);

    myDocumentCursor->insertBlock();

        formattedString.clear();
    

    for(int i = 0; i < time.size(); i++){

    formattedString = QString("%1 %2 %3 %4 %5 %6 %7").arg(time[i], -16, 'f', -1)
    .arg(pos[i][0], -16, 'f', -1).arg(pos[i][1], -16, 'f', -1).arg(pos[i][2], -16, 'f', -1)
    .arg(vel[i][0], -16, 'f', -1).arg(vel[i][1], -16, 'f', -1).arg(vel[i][2], -16, 'f', -1);

    myDocumentCursor->insertText(formattedString);
    myDocumentCursor->insertBlock();
    }

        return parsedDocument;
    

    }

    @

    Basically this works out quite smoothly, just takes a few minutes as I have roughly 500K lines of data. But there are 2 major problems that I ran into: 1. The memory usage after putting all data into the Document is around 1.2GB, 2. It takes a HUGE amount of time(~15min) to display the document in a QTextEdit (via QTextEdit::setDocument(QTextDocument*)).

    So obviously I am doing something wrong. So do you guys have an idea what I should be doing differently?



  • You will probably get better performance if you add some line endings "\n".


Log in to reply