Я создал собственный QListWidget с пользовательскими виджетами списков (для этого примера только виджеты QPushButton), добавленными в его QListWidgetItems, все настройки, так что я могу перетаскивать и отпускать из QPushButton, чтобы добавить еще одну кнопку в QListWidget.В первом виджете списка вы заметите пунктирную линию между двумя элементами виджета списка, указывающую, что вы можете перетаскивать и вставлять виджет между двумя существующими.Однако с моим пользовательским списком я потерял это поведение.Я все еще могу перетаскивать их между существующими виджетами, но для пользователя, как и прежде, нет визуального индикатора горизонтальной полосы между двумя виджетами, куда он будет вставлен.Кто-нибудь знает, как я это сделаю?Вы можете видеть на изображении ниже строку в первом списке, которая является индикатором по умолчанию для вставки элемента между двумя.Красная стрелка указывает на тот тип пользовательского индикатора вставки, который я хотел бы создать.
А во-вторых, когда я перетаскиваю из моегоПользовательский QPushButton выделяется черным, но никогда не возвращается к своему обычному серому цвету, как показано на рисунке выше.Как мне вернуть эту кнопку в состояние по умолчанию?
from inspect import isclass
from shiboken2 import wrapInstance
from PySide2 import QtCore, QtGui, QtWidgets
from maya import OpenMayaUI as omui
def show_ui():
main_win_obj = omui.MQtUtil.mainWindow()
main_win = wrapInstance(long(main_win_obj), QtWidgets.QWidget)
win = Test(parent=main_win)
win.show()
class DragButton(QtWidgets.QPushButton):
def __init__(self, parent=None, text=''):
super(DragButton, self).__init__()
self.setText(text)
def mouseMoveEvent(self, event):
if event.buttons() != QtCore.Qt.LeftButton:
super(DragButton, self).mouseMoveEvent(event)
return
btn_img = self.grab()
painter = QtGui.QPainter(btn_img)
painter.setCompositionMode(
painter.CompositionMode_DestinationIn
)
painter.fillRect(btn_img.rect(), QtGui.QColor(0, 0, 0, 127))
painter.end()
data = QtCore.QMimeData()
data.setText('ReorderListAdd()')
drag = QtGui.QDrag(self)
drag.setMimeData(data)
drag.setPixmap(btn_img)
drag.setHotSpot(event.pos())
drag.exec_(QtCore.Qt.CopyAction)
super(DragButton, self).mouseMoveEvent(event)
def mouseReleaseEvent(self, event):
data = QtCore.QMimeData()
data.setText('my text')
drag = QtGui.QDrag(self)
drag.setMimeData(data)
drag.exec_()
super(DragButton, self).mouseReleaseEvent(event)
class ReorderList(QtWidgets.QListWidget):
def __init__(self, parent=None):
super(ReorderList, self).__init__(parent)
self.setDragDropMode(
QtWidgets.QAbstractItemView.InternalMove
)
self.setAcceptDrops(True)
self.setAlternatingRowColors(True)
self.setSelectionMode(
QtWidgets.QAbstractItemView.SingleSelection
)
self.setDragDropMode(
QtWidgets.QAbstractItemView.InternalMove
)
def add_btn(self, text='', index=-1):
widget = QtWidgets.QWidget()
if not text:
text = 'item {0}'.format(self.count() + 1)
btn = QtWidgets.QPushButton(text)
layout = QtWidgets.QVBoxLayout(widget)
layout.setContentsMargins(2, 2, 2, 2)
layout.setSpacing(2)
layout.addWidget(btn)
item = QtWidgets.QListWidgetItem()
item.setSizeHint(widget.sizeHint())
if index < 0:
self.addItem(item)
else:
self.insertItem(index, item)
self.setItemWidget(item, widget)
def dropEvent(self, event):
drop_index = self.indexAt(event.pos()).row()
self.add_btn(index=drop_index)
super(ReorderList, self).dropEvent(event)
def dragEnterEvent(self, event):
event.accept()
def dragMoveEvent(self, event):
event.accept()
def onClick(self):
print self.sender().text()
class Test(QtWidgets.QMainWindow):
def __init__(self, *args, **kwargs):
super(Test, self).__init__(*args, **kwargs)
self.list1 = QtWidgets.QListWidget()
self.list1.setDragDropMode(
QtWidgets.QAbstractItemView.DragDrop
)
self.list1.setSelectionMode(
QtWidgets.QAbstractItemView.SingleSelection
)
self.list1.setDragDropMode(
QtWidgets.QAbstractItemView.InternalMove
)
self.list1.setMaximumHeight(60)
self.list2 = ReorderList()
self.list2.setMaximumHeight(120)
for name in ('item 1', 'item 2', 'item 3'):
item = QtWidgets.QListWidgetItem(name)
self.list1.addItem(item)
self.list2.add_btn(text=name)
self.btn = DragButton(text='Add list button')
self.btn.clicked.connect(self.list2.add_btn)
self.widget = QtWidgets.QWidget()
self.setCentralWidget(self.widget)
self.layout = QtWidgets.QVBoxLayout(self.widget)
for item in (self.list1, self.list2, self.btn):
self.layout.addWidget(item)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
win = Test()
win.show()
sys.exit(app.exec_())
Я бы хотел иметь горизонтальную полосу при вставке виджета в QListWidget и иметь кнопки, которые были возвращены наркотикамиих цвет по умолчанию.
Вот некоторые похожие ссылки, которые я смог найти, которые помогли мне подойти к этому вопросу: