当我从剪贴板粘贴到外部程序时,为什么Qt程序会处理剪贴板数据?

时间:2015-07-01 12:14:02

标签: c++ windows qt clipboard

我做了以下事情:

1)在Windows上的Qt程序中将数据复制到剪贴板。

QApplication::clipboard()->setText(data);

2)将数据粘贴到外部程序(notepad.exe)。 之后我的程序开始处理剪贴板数据。它调用Windows特定方法:

QWindowsOleDataObject::GetData(...);
... QWindowsMimeText::convertFromMime(...);

这是一个问题,因为当剪贴板中的数据大小很大时,我的程序在这些方法中分配的内存上失败。

我无法理解它,因为调用堆栈非常奇怪:

qwindowsd.dll!QWindowsMimeText::convertFromMime(const tagFORMATETC & formatetc, const QMimeData * mimeData, tagSTGMEDIUM * pmedium) Line 606    C++
qwindowsd.dll!QWindowsOleDataObject::GetData(tagFORMATETC * pformatetc, tagSTGMEDIUM * pmedium) Line 144    C++
[External Code] 
Qt5Cored.dll!QEventDispatcherWin32::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag> flags) Line 740    C++
qwindowsd.dll!QWindowsGuiEventDispatcher::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag> flags) Line 73   C++
Qt5Cored.dll!QEventLoop::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag> flags) Line 129   C++
Qt5Cored.dll!QEventLoop::exec(QFlags<enum QEventLoop::ProcessEventsFlag> flags) Line 204    C++
Qt5Cored.dll!QCoreApplication::exec() Line 1188 C++
Qt5Guid.dll!QGuiApplication::exec() Line 1508   C++
Qt5Widgetsd.dll!QApplication::exec() Line 2957  C++
main(int argc, char * * argv) Line 759  C++

这是一些Qt内部工作,我不知道如何影响它。

1 个答案:

答案 0 :(得分:2)

Qt可能会优化“内部”剪贴板使用情况。所以QApplication::clipboard()->setText(data);并没有真正将data复制到Windows剪贴板 - 您可能希望将其粘贴到同一个Qt应用程序中,因此无需复制到Windows剪贴板中并再次返回。只有在使用外部应用程序时,才会发生真正的复制。

Qt可能将OLE数据提供程序注册为“剪贴板数据源”,而Windows在外部应用程序中需要剪贴板数据时使用它。

所以大数据从一开始就在data

来源:Qt剪贴板实施Windows QWindowsClipboard 使用:OleSetClipboard,它接受​​指向数据源的指针,而不是数据本身