如何使用 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
。
您还应该将标签添加到布局中,就像我在上述修改中所做的那样。
我正在尝试使用 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
。
您还应该将标签添加到布局中,就像我在上述修改中所做的那样。