Как сохранить Mimedata в файл - PullRequest
       12

Как сохранить Mimedata в файл

0 голосов
/ 24 сентября 2019

Я пытался сериализовать свою древовидную структуру и восстановить ее без особого успеха.

Функция Mimedata может сохранять древовидную структуру в правильной иерархии.

Как можносохранить данные MIME в файл и загрузить его обратно в QDataStream?

QMimeData *TreeModel::mimeData(const QModelIndexList  &indexes) const
{
    QMimeData *mimeData = new QMimeData;
    QByteArray data; 
    QDataStream stream(&data, QIODevice::WriteOnly);
    QList<TreeItem *> nodes;
    foreach(const QModelIndex &index, indexes) {
        TreeItem *node = getItem(index);
        if (!nodes.contains(node))
            nodes << node;
    }
    stream << QCoreApplication::applicationPid();
    stream << nodes.count();
    foreach(TreeItem *node, nodes) {
        buildTree(node, stream);
    }
    mimeData->setData(s_treeNodeMimeType, data);
    return mimeData;
}

1 Ответ

2 голосов
/ 24 сентября 2019

Вы должны реализовать потоковые операторы между QDataStream и QMimeData, сохраняя форматы и данные, связанные с каждым форматом, и количество форматов.

#include <QtWidgets>

QDataStream &operator<<(QDataStream &stream, const QMimeData &data)
{
    const QStringList formats = data.formats();
    stream << static_cast<qint32>(formats.size());
    for(const QString& format : formats)
        stream << format << data.data(format);
    return stream;
}

QDataStream &operator>>(QDataStream &stream, QMimeData &data)
{
    data.clear();
    qint32 size;
    QString format;
    QByteArray formatData;
    stream >> size;
    while(size-->0){
        stream >> format >> formatData;
        data.setData(format,formatData);
    }
    return stream;
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    const QString text = "Text";
    const QString html = R"(<!DOCTYPE html>
<html>
<body>

<h1>My First Heading</h1>

<p>My first paragraph.</p>

</body>
</html>
)";
    const QList<QUrl> urls = {
        {"/12808962/kak-sohranit-mimedata-v-fail"},
        {"https://doc.qt.io/qt-5/"}
    };

        const QString mimeType = "custom/custom-app";
    const QByteArray data("stackoverflow");

    const QString path = "datastream.dat";

    {

        QMimeData mimedata;
        mimedata.setText(text);
        mimedata.setHtml(html);
        mimedata.setUrls(urls);
        mimedata.setData(mimeType, data);

        QFile file(path);
        file.open(QIODevice::WriteOnly);
        QDataStream out(&file);
        out << mimedata;
    }

    {

        QMimeData mimedata;
        QFile file(path);
        file.open(QIODevice::ReadOnly);
        QDataStream out(&file);
        out >> mimedata;

        Q_ASSERT(mimedata.text() == text);
        Q_ASSERT(mimedata.html() == html);
        Q_ASSERT(mimedata.urls() == urls);
        Q_ASSERT(mimedata.data(mimeType) == data);
    }

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...