Почему когда я перетаскаю QRadioButton, то у меня перетаскивается и QPushButton?

У меня все работало норм, но как только я начинаю перетаскивать QRadioButton, то у меня вмести с ним перетаскивается QPushButton.

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *


class DemoWidget(QtWidgets.QFrame):
    def __init__(self, widgets, parent):
        super().__init__(parent)

        self.widgets = widgets
        self.setAcceptDrops(True)
        self.setStyleSheet('DemoWidget {background-color: #D98C00;}')

        self.movingButton = None
    def dragEnterEvent(self, event):
        event.accept()

    def dropEvent(self, event):
        for name in self.widgets:
            mimeData = event.mimeData().data('application/x-qabstractitemmodeldatalist')
            _mimeData = mimeData.split('\n')[-1]
            mimeData = str(_mimeData, 'utf-8', errors='ignore').replace('\x00', '')
            if name in mimeData:
                if name == 'Button':
                    widget = QPushButton()
                elif name == 'label':
                    widget = QLabel()
                    widget.setStyleSheet('QLabel {background-color: #B5FE83;}')
                elif name == 'lineEdit':
                    widget = QLineEdit()
                elif name == 'RadioButton':
                    widget = QRadioButton()
                widget.setParent(self)
                widget.setText(name)
                widget.move(event.pos())
                widget.show()
                widget.installEventFilter(self)

    def eventFilter(self, source, event):
        if event.type() == QtCore.QEvent.MouseButtonPress and \
                event.button() == QtCore.Qt.LeftButton:
            self.movingButton = source
            self.startPos = event.pos()
        elif event.type() == QtCore.QEvent.MouseMove and self.movingButton:
            self.movingButton.move(source.pos() + event.pos() - self.startPos)
        elif event.type() == QtCore.QEvent.MouseButtonRelease and self.movingButton:
            self.movingButton.move(source.pos() + event.pos() - self.startPos)
            self.movingButton = None
        return super().eventFilter(source, event)


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.centralWidget = QtWidgets.QWidget()
        self.setCentralWidget(self.centralWidget)

        self.l_view = QtWidgets.QListView(self)
        self.m_model = QtGui.QStandardItemModel(self)
        self.l_view.setModel(self.m_model)
        self.l_view.setAcceptDrops(False)
        self.l_view.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
        self.l_view.setResizeMode(QtWidgets.QListView.Adjust)
        self.l_view.setDragDropMode(QtWidgets.QAbstractItemView.DragOnly)

        self.btn = QPushButton("sasasa", self)
        self.btn.clicked.connect(self.button)



        self.widgets = [
            'Button',
            'lineEdit',
            'label',
            'RadioButton',
            'asasasa',
            'dfdfdfdf',
            'dfdfxcxc',
        ]

        self.demoWidget = DemoWidget(self.widgets, self)

        vlay = QtWidgets.QVBoxLayout()
        vlay.addWidget(self.demoWidget)

        lay = QtWidgets.QHBoxLayout(self.centralWidget)
        lay.addWidget(self.l_view, 1)
        lay.addWidget(self.btn, 2)
        lay.addLayout(vlay, 5)


        for name in range(0, 3):
            item = QListWidgetItem()
            self.it = QtGui.QStandardItem(QIcon('uuuu.ico'), self.widgets[name])
            self.l_view.model().appendRow(self.it)
    def button(self):
        self.m_model.clear()
        for name in range(3, 7):
            item = QListWidgetItem()
            self.it = QtGui.QStandardItem(QIcon('uuuu.ico'), self.widgets[name])
            self.l_view.model().appendRow(self.it)



if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.resize(500, 500)
    w.show()
    sys.exit(app.exec_())

Ответы (1 шт):

Автор решения: S. Nick

Я вставил:

print(f'name = `{name:>15}`; mimeData = `{mimeData}`')

и отметил строки, которые надо изменить.

  1. Это ваш вариант:

введите сюда описание изображения

введите сюда описание изображения


  1. Это исправленный вариант:

.

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *


class DemoWidget(QtWidgets.QFrame):
    def __init__(self, widgets, parent):
        super().__init__(parent)

        self.widgets = widgets
        self.setAcceptDrops(True)
        self.setStyleSheet('DemoWidget {background-color: #D98C00;}')

        self.movingButton = None
    def dragEnterEvent(self, event):
        event.accept()

    def dropEvent(self, event):
        for name in self.widgets:
            mimeData = event.mimeData().data('application/x-qabstractitemmodeldatalist')
            _mimeData = mimeData.split('\n')[-1]
            mimeData = str(_mimeData, 'utf-8', errors='ignore').replace('\x00', '')
            if name in mimeData:
# +++
                print(f'name = `{name:>15}`; mimeData = `{mimeData}`')    # +++
#                if name == 'Button':
                if name == 'pushButton':                                  # +++
                
                    widget = QPushButton()
                elif name == 'label':
                    widget = QLabel()
                    widget.setStyleSheet('QLabel {background-color: #B5FE83;}')
                elif name == 'lineEdit':
                    widget = QLineEdit()
                elif name == 'RadioButton':
                    widget = QRadioButton()
# +++                    
                else:                                                     # +++
                    return                                                # +++
                    
                widget.setParent(self)
                widget.setText(name)
                widget.move(event.pos())
                widget.show()
                widget.installEventFilter(self)

    def eventFilter(self, source, event):
        if event.type() == QtCore.QEvent.MouseButtonPress and \
                event.button() == QtCore.Qt.LeftButton:
            self.movingButton = source
            self.startPos = event.pos()
        elif event.type() == QtCore.QEvent.MouseMove and self.movingButton:
            self.movingButton.move(source.pos() + event.pos() - self.startPos)
        elif event.type() == QtCore.QEvent.MouseButtonRelease and self.movingButton:
            self.movingButton.move(source.pos() + event.pos() - self.startPos)
            self.movingButton = None
        return super().eventFilter(source, event)


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.centralWidget = QtWidgets.QWidget()
        self.setCentralWidget(self.centralWidget)

        self.l_view = QtWidgets.QListView(self)
        self.m_model = QtGui.QStandardItemModel(self)
        self.l_view.setModel(self.m_model)
        self.l_view.setAcceptDrops(False)
        self.l_view.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
        self.l_view.setResizeMode(QtWidgets.QListView.Adjust)
        self.l_view.setDragDropMode(QtWidgets.QAbstractItemView.DragOnly)

        self.btn = QPushButton("sasasa", self)
        self.btn.clicked.connect(self.button)



        self.widgets = [
# +++        
#            'Button',
            'pushButton',                                               # +++
            
            'lineEdit',
            'label',
            'RadioButton',
            'asasasa',
            'dfdfdfdf',
            'dfdfxcxc',
        ]

        self.demoWidget = DemoWidget(self.widgets, self)

        vlay = QtWidgets.QVBoxLayout()
        vlay.addWidget(self.demoWidget)

        lay = QtWidgets.QHBoxLayout(self.centralWidget)
        lay.addWidget(self.l_view, 1)
        lay.addWidget(self.btn, 2)
        lay.addLayout(vlay, 5)


        for name in range(0, 3):
            item = QListWidgetItem()
            self.it = QtGui.QStandardItem(QIcon('uuuu.ico'), self.widgets[name])
            self.l_view.model().appendRow(self.it)
    def button(self):
        self.m_model.clear()
        for name in range(3, 7):
            item = QListWidgetItem()
            self.it = QtGui.QStandardItem(QIcon('uuuu.ico'), self.widgets[name])
            self.l_view.model().appendRow(self.it)


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.resize(500, 500)
    w.show()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка