gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 14:17:55 44 4
gpt4 key购买 nike

我做了以下事情:

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 内部工作,我不知道如何影响它。

最佳答案

Qt 可能会优化“内部”剪贴板的使用。所以 QApplication::clipboard()->setText(data); 并没有真正将 data 复制到 Windows 剪贴板 - 你可能想将它粘贴到同一个 Qt 应用程序中,所以复制进入 Windows 剪贴板并再次返回是没有必要的。只有使用外部应用程序时,才会发生真正的复制。

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

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

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

关于c++ - 当我从剪贴板粘贴到外部程序时,为什么 Qt 程序会处理剪贴板数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31161003/

44 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com