Как сохранить изображение в буфер обмена в переменной и восстановить его в буфер позже? - PullRequest
0 голосов
/ 19 января 2020

Я подключаю слот к сигналу dataChanged QClipboard, чтобы сохранить изображение в буфере обмена для переменной mimedata ( reference ):

void MyWin::clipboardDataChanged()
{
    const QMimeData * m=QApplication::clipboard()->mimeData();
    mimedata = new QMimeData();

    foreach(QString format, m->formats())
    {
        QByteArray data = m->data(format);
        if(format.startsWith("application/x-qt"))
        {
            int index1 = format.indexOf('"') + 1;
            int index2 = format.indexOf('"', index1);
            format = format.mid(index1, index2 - index1);
        }
        mimedata->setData(format, data);
    }
}

И восстановить mimedata в буфер обмена следующим образом :

void MyWin::onrestore()
{
     QApplication::clipboard()->setMimeData(mimedata);
}

Однако набор данных в буфер обмена поврежден. Если я вставляю из буфера обмена в Paint, он говорит: «Информация из буфера обмена не может быть вставлена ​​в Paint». Я распечатал формат данных в буфере обмена, т. Е. «Application / x-qt-image». Поэтому я думаю, что это не тот формат, который поддерживается другими приложениями. Это ошибка Qt или код неисправен?

1 Ответ

1 голос
/ 20 января 2020

Я думаю, вам лучше сохранить весь контент буфера обмена, чтобы вы могли безопасно восстановить его при необходимости, например,

void MyWin::clipboardDataChanged()
{
    const QMimeData * m = QApplication::clipboard()->mimeData();
    mimedata = new QMimeData();

    for(auto format : m->formats())
    {
        mimedata->setData(format, m->data(format));
    }
}

В качестве альтернативы, преобразовать данные application/x-qt-image в QImage, затем используйте QMimeData::setImageData для хранения:

void MyWin::clipboardDataChanged()
{
    const QMimeData * m = QApplication::clipboard()->mimeData();
    mimedata = new QMimeData();

    for(auto format : m->formats())
    {
        if(format == "application/x-qt-image")
        {
            QImage image;

            QByteArray data = m->data(format);
            QBuffer buffer(&data);
            image.load(&buffer, nullptr);
            mimedata->setImageData(image);
        }
    }
}
...