Как вы обнаруживаете внутренний сигнал перемещения QListWidet, когда для параметра setAcceptDrops установлено значение True - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь обнаружить внутренний сигнал перемещения из QListWidget, пока у меня есть инструмент перетаскивания. Но в настоящее время с моим кодом, поскольку я сам выполняю функции dragEnterEvent, dragMoveEvent и moveEvent, внутренний сигнал перемещения игнорируется. Как я могу обойти эту проблему? Ниже приведен простой код, дублирующий проблему.

Вы можете перетаскивать внешние элементы в виджет списка, но теперь вы не можете перемещать элементы вокруг.

import sys, os
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QLineEdit, QListWidget, \
                            QVBoxLayout, QHBoxLayout, QAbstractItemView
from PyQt5.QtCore import Qt

class ListWidget(QListWidget):
    def __init__(self, parent=None):
        super().__init__(parent=None)
        self.setAcceptDrops(True)
        self.setStyleSheet('''font-size:25px''')

    def dragEnterEvent(self, event):
        # print(event.mimeData().urls())
        # print(dir(event.mimeData()))
        if event.mimeData().hasUrls():
            event.accept()
        else:

            event.ignore()

    def dragMoveEvent(self, event):

        if event.mimeData().hasUrls():
            event.setDropAction(Qt.CopyAction)
            event.accept()
        else:
            print('y')
            event.ignore()

    def dropEvent(self, event):
        if event.mimeData().hasUrls():
            event.setDropAction(Qt.CopyAction)
            event.accept()

            pdfFiles = []

            for url in event.mimeData().urls():
                if url.isLocalFile():                   
                    pdfFiles.append(str(url.toLocalFile()))
            self.addItems(pdfFiles)
        else:
            event.ignore()

class AppDemo(QWidget):
    def __init__(self):
        super().__init__()
        self.resize(1200, 800)

        data = ['Microsoft', 'Facebook', 'Google']
        mainLayout = QHBoxLayout()


        self.lst = ListWidget()
        self.lst.addItems(data)
        self.lst.setStyleSheet('''
            font-size:30px
        ''')
        self.lst.setDragDropMode(QAbstractItemView.InternalMove)



        mainLayout.addWidget(self.lst)

        self.setLayout(mainLayout)

if __name__ == '__main__':
    app = QApplication(sys.argv)

    demo = AppDemo()
    demo.show()

    sys.exit(app.exec_())

1 Ответ

1 голос
/ 10 апреля 2020

Вместо того, чтобы вызывать event.ignore(), когда у mimedata нет URL-адресов, вызовите метод родителя, чтобы перетаскивание было обработано как QListWidget по умолчанию. Кроме того, другой способ определить источник операции перетаскивания - с помощью event.source().

def dragEnterEvent(self, event):
    if event.mimeData().hasUrls():
        event.accept()
    else:
        <b>super().dragEnterEvent(event)</b>

def dragMoveEvent(self, event):
    if event.mimeData().hasUrls():
        event.setDropAction(Qt.CopyAction)
        event.accept()
    else:
        <b>super().dragMoveEvent(event)</b>

def dropEvent(self, event):
    if event.mimeData().hasUrls():
        event.setDropAction(Qt.CopyAction)
        event.accept()
        pdfFiles = []
        for url in event.mimeData().urls():
            if url.isLocalFile():                   
                pdfFiles.append(str(url.toLocalFile()))
        self.addItems(pdfFiles)
    else:
        <b>super().dropEvent(event)</b>
...