本文共 3414 字,大约阅读时间需要 11 分钟。
本文将详细介绍如何在 PyQt5 中实现任意组件的拖拽功能,并结合 DICOM 格式的医学图像进行处理。通过本文的步骤,您将能够理解如何在 GUI 应用程序中创建可拖拽的组件,并成功加载并显示 DICOM 图像。
创建拖拽组件类首先,我们创建一个新的拖拽组件类 Image_label,继承自 QLabel。这个组件将允许用户通过拖拽方式将 DICOM 图像拖到其上。
from PyQt5.Qt import *import sysimport pydicomfrom PIL import Imageclass Image_label(QLabel): def __init__(self): super().__init__() self.path_text = r"F:\PycharmWorkPlace\MedicalSystem\testdata\IM62.dcm" self.setAcceptDrops(True) # 允许拖放 def mouseMoveEvent(self, e): mimeData = QMimeData() mimeData.setText(self.path_text) drag = QDrag(self) drag.setMimeData(mimeData) drag.setHotSpot(e.pos() - self.rect().topLeft()) drag.exec_(Qt.MoveAction)
处理拖拽事件在 mouseMoveEvent 方法中,我们定义了拖拽的逻辑。通过创建 QMimeData 对象,我们可以将组件的文本数据(即 DICOM 文件路径)作为拖拽数据传递。
接收拖拽数据我们创建一个 ImageShowPane 组件,允许它接收拖拽过来的数据。
class ImageShowPane(QLabel): content_signal = pyqtSignal(str) content = None def __init__(self): super().__init__() self.setAcceptDrops(True) def dragEnterEvent(self, e): e.accept() def dropEvent(self, e): img_path = e.mimeData().text() self.content = img_path # 加载 DICOM 图像 dcm = pydicom.read_file(img_path) raw_img = dcm.pixel_array # 转换为 PIL 图像并显示 img = Image.fromarray(raw_img) img.save("rgb.jpg") img = ImageQt.toqpixmap(img) self.setPixmap(img) self.setScaledContents(True)在 dropEvent 方法中,我们通过 pydicom 库读取拖拽过来的 DICOM 文件。然后,我们将 DICOM 图像转换为 PIL 图像格式,并最终显示为 PyQt5 的 QPixmap。
以下是完整的代码示例,展示了拖拽组件的实现及其与 DICOM 图像的交互。
import cv2from PyQt5.Qt import *import sysimport pydicomfrom PIL import Imageclass Image_label(QLabel): def __init__(self): super().__init__() self.setAcceptDrops(True) self.path_text = "拖拽此处显示 DICOM 文件" def mouseMoveEvent(self, e): mimeData = QMimeData() mimeData.setText(self.path_text) drag = QDrag(self) drag.setMimeData(mimeData) drag.setHotSpot(e.pos() - self.rect().topLeft()) drag.exec_(Qt.MoveAction)class ImageShowPane(QLabel): content_signal = pyqtSignal(str) content = None def __init__(self): super().__init__() self.setAcceptDrops(True) def dragEnterEvent(self, e): e.accept() def dropEvent(self, e): img_path = e.mimeData().text() self.content = img_path dcm = pydicom.read_file(img_path) raw_img = dcm.pixel_array img = Image.fromarray(raw_img) img.save("rgb.jpg") img = ImageQt.toqpixmap(img) self.setPixmap(img) self.setScaledContents(True) def mousePressEvent(self, QMouseEvent): self.content_signal.emit('rgb.jpg')if __name__ == "__main__": app = QApplication(sys.argv) main_window = QMainWindow() main_window.setWindowTitle("PyQt5 拖拽 DICOM 查看器") main_widget = QtWidgets.QWidget(main_window) main_layout = QtWidgets.QVBoxLayout(main_widget) label1 = Image_label() label2 = ImageShowPane() main_layout.addWidget(label1) main_layout.addWidget(label2) main_window.setCentralWidget(main_widget) main_window.show() app.exec_() path_text 中的文件路径正确,避免出现文件找不到的错误。dropEvent 方法中,确保 DICOM 图像正确加载并显示。如果遇到问题,可以检查 DICOM 文件的格式是否正确。通过以上实现,您可以在 PyQt5 应用程序中轻松实现任意组件的拖拽功能,并成功加载并显示 DICOM 格式的医学图像。
转载地址:http://rdafk.baihongyu.com/