【问题标题】:Drag and drop functionality in pyqt5 with custom widgets, creates widgets with contents not visiblepyqt5 中带有自定义小部件的拖放功能,创建内容不可见的小部件
【发布时间】:2020-07-08 15:28:16
【问题描述】:

我正在尝试构建一个具有自定义小部件的程序,这些小部件可以从一个列表拖放到另一个列表中。自定义小部件是表单(标签/线条编辑)。下面的代码具有大部分功能,但是每当我拖放一个项目时,它都会为其创建空间,但看不到小部件的内容。我尝试过使用 setdropmode() 函数,但没有帮助。

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *

from PyQt5.QtWidgets import QApplication, QWidget, QListWidget, QVBoxLayout, QLabel, QPushButton, QListWidgetItem, \
    QHBoxLayout, QAbstractItemView
import os
import PyQt5
from PyQt5 import QtGui, QtWidgets, QtCore
from PyQt5.QtGui import QImage, QPixmap, QColor, QBrush, QFontDatabase, QStandardItem, QStandardItemModel, QIcon
from PyQt5.QtCore import QRect, QSize, Qt, QThread, QProcess

class CustomQWidget(QWidget):
    def __init__(self, parent=None):
        super(CustomQWidget, self).__init__(parent)

        formLayoutWidget = QtWidgets.QWidget()
        # formLayoutWidget.setGeometry(QtCore.QRect(139, 69, 291, 131))
        formLayoutWidget.setObjectName("formLayoutWidget")
        formLayout = QtWidgets.QFormLayout(formLayoutWidget)
        formLayout.setContentsMargins(0, 0, 0, 0)
        formLayout.setObjectName("formLayout")

        lineEdit = QtWidgets.QLineEdit(formLayoutWidget)
        lineEdit.setObjectName("lineEdit")
        formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, lineEdit)

        lineEdit_2 = QtWidgets.QLineEdit(formLayoutWidget)
        lineEdit_2.setObjectName("lineEdit_2")
        formLayout.setWidget(1, QtWidgets.QFormLayout.FieldRole, lineEdit_2)

        lineEdit_3 = QtWidgets.QLineEdit(formLayoutWidget)
        lineEdit_3.setObjectName("lineEdit_3")
        formLayout.setWidget(2, QtWidgets.QFormLayout.FieldRole, lineEdit_3)

        label = QtWidgets.QLabel(formLayoutWidget)
        label.setObjectName("label")
        label.setText("TextLabel")
        formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, label)

        label_2 = QtWidgets.QLabel(formLayoutWidget)
        label_2.setObjectName("label_2")
        label_2.setText("TextLabel")
        formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, label_2)

        label_3 = QtWidgets.QLabel(formLayoutWidget)
        label_3.setObjectName("label_3")
        label_3.setText("TextLabel")
        formLayout.setWidget(2, QtWidgets.QFormLayout.LabelRole, label_3)

        self.setLayout(formLayout)

class Window(QWidget):
    def __init__(self):
        super().__init__()

        self.myListWidget1 = QListWidget()
        # self.myListWidget1.setViewMode(QListWidget.IconMode)

        self.myListWidget2 = QListWidget()
        self.myListWidget2.setViewMode(QListWidget.IconMode)
        self.myListWidget1.setAcceptDrops(False)
        self.myListWidget1.setDragEnabled(True)
        self.myListWidget2.setAcceptDrops(True)
        self.myListWidget2.setDragEnabled(True)
        self.myListWidget2.setGridSize( QSize( 130, 130 ) )
        self.myListWidget2.setMovement(2)
        self.setGeometry(300, 350, 990, 970)
        self.myLayout = QHBoxLayout()
        self.myLayout.addWidget(self.myListWidget1)
        self.myLayout.addWidget(self.myListWidget2)

        self.setFixedSize(self.size())

        self.item = QListWidgetItem(self.myListWidget1)
        self.item_widget = CustomQWidget()
        self.item.setSizeHint(self.item_widget.sizeHint())
        self.myListWidget1.addItem(self.item)
        self.myListWidget1.setItemWidget(self.item, self.item_widget)

        self.item2 = QListWidgetItem(self.myListWidget1)
        self.item_widget2 = CustomQWidget()
        self.item2.setSizeHint(self.item_widget2.sizeHint())
        self.myListWidget1.addItem(self.item2)
        self.myListWidget1.setItemWidget(self.item2, self.item_widget2)
        self.myListWidget1.setDragDropMode(QAbstractItemView.DragDrop)

        self.setWindowTitle('Drag and Drop Example');
        self.setLayout(self.myLayout)

        self.show()

App = QApplication(sys.argv)
window = Window()
sys.exit(App.exec())

【问题讨论】:

    标签: python user-interface pyqt5


    【解决方案1】:

    您需要在您的小部件上实现 dragEnterEvent 和 dropEvent。

        def dragEnterEvent(self, event: QDragEnterEvent) -> None:
            if event.mimeData().hasUrls():
                event.accept()
            else:
                event.ignore()
    
        def dropEvent(self, event: QDropEvent) -> None:
            if event.mimeData().hasUrls():
                event.accept()
    
    

    【讨论】:

    • 如何在我的代码中实现这些事件?我是 UI 新手,所以我不知道自己在做什么。
    猜你喜欢
    • 1970-01-01
    • 2017-11-06
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 2020-10-04
    • 2022-07-02
    • 1970-01-01
    相关资源
    最近更新 更多