【问题标题】:Why does a Qt program process clipboard data when I paste from clipboard to an external program?当我从剪贴板粘贴到外部程序时,为什么 Qt 程序会处理剪贴板数据?
【发布时间】:2015-07-01 21:22:54
【问题描述】:

我做以下事情:

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

【问题讨论】:

    标签: c++ windows qt clipboard


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢!听起来逻辑上很好。是你的假设还是像你描述的那样工作?如果有的话,能否分享一些文档的链接?
    • @Deutsche 这是基于前段时间工作方式的假设,查看代码 - 似乎仍然足够(编辑响应中的链接)
    • 太棒了!谢谢你的回答,它解释了问题。如果你对这个话题非常有经验,也许你知道如何捕捉这种情况(这个Qt代码中关于事件处理的bad_alloc)并正确地继续软件的工作?
    • 恕我直言:如果 bad_alloc 被扔到 Qt 内部的某个地方,应用程序很有可能无法恢复 - Qt 本身大量使用分配,而使用 bad_alloc 你真的不知道出了什么问题和后果将会。也许尝试编写自己的 QMimeData 并重新实现 doc.qt.io/qt-5/qmimedata.html#retrieveData 以更好地控制内存分配。另外:检查doc.qt.io/qt-5/qwinmime.html 我不知道它到底能做什么,但它是特定于 Windows 的,因此可能会提供更多控制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-30
    • 2017-12-23
    • 2015-07-29
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多