Почему когда я перетаскаю 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}`')
и отметил строки, которые надо изменить.
- Это ваш вариант:
- Это исправленный вариант:
.
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_())


