【问题标题】:How to save the image in clipboard in variable and restore it to clipboard later?如何将剪贴板中的图像保存在变量中并稍后将其恢复到剪贴板?
【发布时间】:2020-05-05 15:01:14
【问题描述】:

我将一个插槽连接到 QClipboard 的 dataChanged 信号,以将剪贴板中的图像存储到变量 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的bug还是代码有缺陷?

【问题讨论】:

    标签: qt clipboard mime-types mime qclipboard


    【解决方案1】:

    我认为你最好保存整个剪贴板内容,这样你就可以在需要时安全地恢复它,即

    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);
            }
        }
    }
    

    【讨论】:

    • 我的代码保存了整个剪贴板内容。请忘记在我的代码中修改格式的代码。如果按 Print-Screen 键将图像捕获到剪贴板,则唯一的格式是“application/x-qt-image”。修改格式的代码没有任何效果。问题是当您稍后将保存的 mimedata 恢复到剪贴板时,您无法将其粘贴到其他应用程序。
    • @William 我明白了……你可以试试替代方案吗?
    • 我尝试了替代方案,但结果是一样的。剪贴板中的数据无法粘贴到 Paint。另一种方法是使用clipboard()->image()将图像保存到QImage对象中,并使用clipboard()->setImage()恢复它,但是它不能处理多个组件(例如图像和文本)在剪贴板。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2011-01-03
    • 1970-01-01
    • 2013-12-06
    • 1970-01-01
    • 2021-10-20
    相关资源
    最近更新 更多