如何使用 pixmap 和 Qlabel 使图像可选择?

How to make an image selectable using pixmap and Qlabel?

我正在尝试使用 Pyqt5 显示多张图片。如果能在 GUI 中使图像 select 可用,这样用户就可以 select 并立即轻松复制该图像。

通过“selectable”,我的意思是用户可以右键单击图像然后复制它,然后可能将它粘贴到 GUI 之外的其他地方。就像保存在 Word 中的普通图像一样。用户可以 select/copy Word 中的图像,然后将其粘贴到其他地方。

我知道 Qlabel 中的文本可以使用 self.my_label.setTextInteractionFlags(QtCore.Qt.TextSelectableByMouse) 轻松实现。但是,对于图像似乎没有这样的方法来处理它。有什么方法可以解决图像问题吗?

import sys
import PyQt5
from PyQt5.QtWidgets import (
    QLabel,
    QVBoxLayout,
    QWidget
)
from PyQt5 import QtCore
from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import QSize


class Display_Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setMinimumSize(QSize(980,700))
        self.layout = QVBoxLayout(self)
        self.label1 = QLabel(self)
        self.pixmap = QPixmap(path_to_my_image)
        self.pixmap = self.pixmap.scaled(900, 900, QtCore.Qt.KeepAspectRatio)
        self.label1.setPixmap(self.pixmap)
        self.label1.resize(self.pixmap.width(), self.pixmap.height())



# Run if Script
if __name__ == "__main__":
    app = PyQt5.QtWidgets.QApplication(sys.argv)
    MainWindow = Display_Window()                                                   # Initialize GUI
    MainWindow.show()                                                                       # Show Window
    app.exec_()      

只要有有效的像素图,您就可以将标签子类化并创建菜单,然后使用系统剪贴板复制它。

class CopiableLabel(QLabel):
    def contextMenuEvent(self, event):
        pixmap = self.pixmap()
        if not pixmap.isNull():
            menu = QMenu()
            copyAction = menu.addAction('Copy image to clipboard')
            if menu.exec_(event.globalPos()) == copyAction:
                QApplication.clipboard().setPixmap(pixmap)
            return
        super().contextMenuEvent(event)


class Display_Window(QWidget):
    def __init__(self):
        super().__init__()
        self.layout = QVBoxLayout(self)
        self.label1 = CopiableLabel(self)
        self.layout.addWidget(self.label1)
        self.pixmap = QPixmap(path_to_my_image)
        self.pixmap = self.pixmap.scaled(900, 900, Qt.KeepAspectRatio)
        self.label1.setPixmap(self.pixmap)

请注意,在 QLabel 上设置像素图会自动调整其大小(除非它的 scaledContents 属性 设置为 True
您还应该将标签添加到布局中,就像我在上述修改中所做的那样。