我在Windows10上使用PyQt 5.15和python3.10。在我的应用程序中,我有一个检查QClipboard中是否有图像的循环。阅读后,我喜欢clear剪贴板,并等待下一个图像,它将由用户从任何其他应用程序复制(如屏幕截图等)。
但是在QApplication.clipboard().clear(QClipboard.Clipboard)之后,像素映射没有被删除,并且仍然有其旧的大小。用QApplication.clipboard().pixmap().height()测试
QApplication.clipboard().ownsClipboard()的调用总是返回False,所以我认为我必须获得剪贴板的所有权。我找不到任何参考资料来做那个。
根据文件:
bool QClipboard::ownsClipboard() const
Returns true if this clipboard object owns the clipboard data; otherwise returns false.我认为剪贴板中的数据受到我复制数据的应用程序的保护。那么,我怎样才能获得这种所有权呢?
我在这个网站上找到了一些信息:如何在Win32中跟踪Windows剪贴板的所有权,但是我不知道如何使它适应python。
基本工作循环如下:
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的评论:
while pushButton.isChecked():
mimeData = clipboard.mimeData()
if mimeData.hasImage ():
pixmap = QPixmap(mimeData.imageData ())
# do something with pixmap
QApplication.processEvents()发布于 2022-05-29 20:02:40
来自MS应用程序开发的文档
通常,剪贴板所有者是最后一次将数据放在剪贴板中的窗口。EmptyClipboard函数指定剪贴板所有权。
似乎是最近的答案。
因此,不可能设置它;-)
编辑:
最后,我得到了一个最大的简化样本来演示错误:
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_())https://stackoverflow.com/questions/72406143
复制相似问题