首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获得QClipboard的所有权

如何获得QClipboard的所有权
EN

Stack Overflow用户
提问于 2022-05-27 13:21:54
回答 1查看 83关注 0票数 0

我在Windows10上使用PyQt 5.15和python3.10。在我的应用程序中,我有一个检查QClipboard中是否有图像的循环。阅读后,我喜欢clear剪贴板,并等待下一个图像,它将由用户从任何其他应用程序复制(如屏幕截图等)。

但是在QApplication.clipboard().clear(QClipboard.Clipboard)之后,像素映射没有被删除,并且仍然有其旧的大小。用QApplication.clipboard().pixmap().height()测试

QApplication.clipboard().ownsClipboard()的调用总是返回False,所以我认为我必须获得剪贴板的所有权。我找不到任何参考资料来做那个。

根据文件:

代码语言:javascript
复制
bool QClipboard::ownsClipboard() const

Returns true if this clipboard object owns the clipboard data; otherwise returns false.

我认为剪贴板中的数据受到我复制数据的应用程序的保护。那么,我怎样才能获得这种所有权呢?

我在这个网站上找到了一些信息:如何在Win32中跟踪Windows剪贴板的所有权,但是我不知道如何使它适应python。

基本工作循环如下:

代码语言:javascript
复制
def copyloop(self):
    clipboard = QGuiApplication.clipboard()
    mimeData = clipboard.mimeData (QClipboard.Clipboard)
    loop = True
    while loop:
        if mimeData.hasImage ():
            pixmap = QPixmap(mimeData.imageData ())
            # do something with pixmap
            #self.label.setPixmap(pixmap)
            QMessageBox.information(self, "Clip me", "before clear clipboard: " + str(clipboard.pixmap(QClipboard.Clipboard).width()))
            clipboard.clear(QClipboard.Clipboard)
            QMessageBox.warning(self, "Clip me", "After clear clipboard: " + str(clipboard.pixmap(QClipboard.Clipboard).width()))
            loop = False
        else:
            #self.label.setPixmap(QPixmap())
            loop = True

只要我在独立(带有一个QDialog类的简单GUI )中使用它,代码就能工作,但是在我的程序(QMainwindow和mutiple的叠加布局)中,它没有清除剪贴板。

编辑:

工作循环,包括@Musicamente的评论:

代码语言:javascript
复制
        while  pushButton.isChecked():
            mimeData = clipboard.mimeData()
            if mimeData.hasImage ():
                pixmap = QPixmap(mimeData.imageData ())
                # do something with pixmap
            QApplication.processEvents()
EN

回答 1

Stack Overflow用户

发布于 2022-05-29 20:02:40

来自MS应用程序开发的文档

通常,剪贴板所有者是最后一次将数据放在剪贴板中的窗口。EmptyClipboard函数指定剪贴板所有权。

似乎是最近的答案。

因此,不可能设置它;-)

编辑:

最后,我得到了一个最大的简化样本来演示错误:

代码语言:javascript
复制
import sys
from PyQt5.QtWidgets import *

# if the following import is used, QApplication.clipboard() will not work as expected. 
# comment it out, copy any text and run. Enjoy the different output

from pywinauto import application


def clipboard_test():
    print("-> clipboard_test")
    clipboard = QApplication.clipboard()
    print("Owner                    =", clipboard.ownsClipboard())
    print("before clear             =", clipboard.text(mode=clipboard.Clipboard))
    clipboard.clear(clipboard.Clipboard)
    QApplication.processEvents()
    print("after clear              =", clipboard.text(mode=clipboard.Clipboard))
    clipboard.setText(":-)", mode=clipboard.Clipboard)
    print("new content (should ;-)) =", clipboard.text(mode=clipboard.Clipboard))


if __name__ == "__main__":
    app = QApplication(sys.argv)
    clipboard_test()
    sys.exit(app.exec_())
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72406143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档