현재 Python 프로그램에서 드래그 앤 드롭으로 항목을 한 QListWidget에서 다른 항목으로 이동하려고합니다.QListWidgets 사이의 Drag'N'Drop 사용자 정의 위젯 항목
나는 이것을 thread으로 읽고 설명 된대로 끌어서 놓기를 구현했습니다. 표준 QListWidgetItems와 함께 작동합니다. 문제는, QListWidgetItems 내에서이 사용자 정의 위젯을 수행하고, 설명 된대로 here으로 1 개의 QListWidgetItem에 아이콘과 여러 줄을 저장하고 싶습니다.
그래서 항목을 다른 목록으로 끌어다 놓으면 ItemWidget없이 QListWidgetItem을 이동/복사하는 것처럼 보이기 때문에 항목이 비어 있습니다.
Heres는 예제 코드 :
from PyQt4 import QtGui, QtCore
import sys, os
class ThumbListWidget(QtGui.QListWidget):
def __init__(self, type, parent=None):
super(ThumbListWidget, self).__init__(parent)
self.setIconSize(QtCore.QSize(124, 124))
self.setDragDropMode(QtGui.QAbstractItemView.DragDrop)
self.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
self.setAcceptDrops(True)
def dragEnterEvent(self, event):
if event.mimeData().hasUrls():
event.accept()
else:
super(ThumbListWidget, self).dragEnterEvent(event)
def dragMoveEvent(self, event):
if event.mimeData().hasUrls():
event.setDropAction(QtCore.Qt.CopyAction)
event.accept()
else:
super(ThumbListWidget, self).dragMoveEvent(event)
def dropEvent(self, event):
if event.mimeData().hasUrls():
event.setDropAction(QtCore.Qt.CopyAction)
event.accept()
links = []
for url in event.mimeData().urls():
links.append(str(url.toLocalFile()))
self.emit(QtCore.SIGNAL("dropped"), links)
else:
event.setDropAction(QtCore.Qt.MoveAction)
super(ThumbListWidget, self).dropEvent(event)
class Dialog_01(QtGui.QMainWindow):
def __init__(self):
super(QtGui.QMainWindow,self).__init__()
self.listItems={}
myQWidget = QtGui.QWidget()
myBoxLayout = QtGui.QVBoxLayout()
myQWidget.setLayout(myBoxLayout)
self.setCentralWidget(myQWidget)
self.myQListWidget = ThumbListWidget(self)
myBoxLayout.addWidget(self.myQListWidget)
for index, name, icon in [
('No.1', 'Meyoko', 'icon.png'),
('No.2', 'Nyaruko', 'icon.png'),
('No.3', 'Louise', 'icon.png')]:
# Create QCustomQWidget
myQCustomQWidget = QCustomQWidget()
myQCustomQWidget.setTextUp(index)
myQCustomQWidget.setTextDown(name)
myQCustomQWidget.setIcon(icon)
# Create QListWidgetItem
myQListWidgetItem = QtGui.QListWidgetItem(self.myQListWidget)
# Set size hint
myQListWidgetItem.setSizeHint(myQCustomQWidget.sizeHint())
# Add QListWidgetItem into QListWidget
self.myQListWidget.addItem(myQListWidgetItem)
self.myQListWidget.setItemWidget(myQListWidgetItem, myQCustomQWidget)
self.listWidgetB = ThumbListWidget(self)
myBoxLayout.addWidget(self.listWidgetB)
class QCustomQWidget (QtGui.QWidget):
def __init__ (self, parent = None):
super(QCustomQWidget, self).__init__(parent)
self.textQVBoxLayout = QtGui.QVBoxLayout()
self.textUpQLabel = QtGui.QLabel()
self.textDownQLabel = QtGui.QLabel()
self.textQVBoxLayout.addWidget(self.textUpQLabel)
self.textQVBoxLayout.addWidget(self.textDownQLabel)
self.allQHBoxLayout = QtGui.QHBoxLayout()
self.iconQLabel = QtGui.QLabel()
self.allQHBoxLayout.addWidget(self.iconQLabel, 0)
self.allQHBoxLayout.addLayout(self.textQVBoxLayout, 1)
self.setLayout(self.allQHBoxLayout)
# setStyleSheet
self.textUpQLabel.setStyleSheet('''
color: rgb(0, 0, 255);
''')
self.textDownQLabel.setStyleSheet('''
color: rgb(255, 0, 0);
''')
def setTextUp (self, text):
self.textUpQLabel.setText(text)
def setTextDown (self, text):
self.textDownQLabel.setText(text)
def setIcon (self, imagePath):
self.iconQLabel.setPixmap(QtGui.QPixmap(imagePath))
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
dialog_1 = Dialog_01()
dialog_1.show()
dialog_1.resize(480,320)
sys.exit(app.exec_())
그래서 기본적인 질문은 : 드래그 앤 드롭을 사용하는 동안 내가 항목 ItemWidget을 전송할 수있는 방법.
QListView를 이런 식으로 사용하는 것이 더 좋을까요?
이 작업을 수행 할 수 없습니다. 드래그 앤 드롭 중에 Item의 데이터와 플래그를 직렬화해야하며'QWidget'을 직렬화 할 방법이 없습니다 ([Qt 데이터 유형 직렬화] (https://doc.qt.io/qt-4.8/ 참조). datastreamformat.html)). [이 관련 질문] (http://stackoverflow.com/q/40413221/984421)도 참조하십시오. – ekhumoro
대답은 내가 원했던 것이지만 기대했던 것이었다. :) QWidget을 목록에서 다시 읽지 못했습니다. 지금은 드래그 앤 드롭 한 항목을 다시 만들었습니다. 내일 QListView를 사용해 보겠습니다. – JohnnyKonfetti
'QListWidget' 클래스 **는 ** QListView입니다. 따라서 아무런 차이가 없습니다. 끌어서 놓기 메커니즘은 Qt에서 동일하므로 동일한 제한이 적용됩니다. 왜 항목에 데이터로 위젯을 저장해야합니까? 왜 위젯에 대한 참조를 보유하고있는 사전에 키를 저장하지 않는가? – ekhumoro