如何解决如何在 QListWidget 和 QMainWindow 之间拖动 QListWidgetItem?
我查看了 QT 文档 (https://doc.qt.io/qt-5/model-view-programming.html#using-drag-and-drop-with-item-views),但他们没有提到在 QListWidget 和 QMainWindow(或任何其他 QWidget)之间拖动项目。我希望用户能够在 QListWidget 之外自由拖动这些项目。我该怎么做?
这是我的代码:
import json
import os
import sys
from PyQt5 import QtGui
from PyQt5.Qt import Qpixmap
from PyQt5.QtCore import QPoint,Qt,QSize
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication,QMainWindow,QListWidget,QListWidgetItem
from MovableLabel import MovableLabel
class MainWindow(QMainWindow):
def __init__(self,*args,obj=None,**kwargs):
super(MainWindow,self).__init__(*args,**kwargs)
def makeLabel():
item = listWidget.currentItem()
rect = listWidget.visualItemRect(item)
itemPos = QPoint(rect.x(),rect.y())
imageSize = item.icon().actualSize(QSize(100,200))
listWidget.takeItem(listWidget.currentRow())
label = MovableLabel(self,'Pogba.jpg')
pixmap = item.icon().pixmap(imageSize)
label.setpixmap(pixmap)
label.setFixedSize(imageSize)
label.move(itemPos)
label.grabMouse()
label.oldPos = itemPos
label.clicked = False
label.show()
self.players = []
pixmap = Qpixmap()
listWidget = QListWidget(self)
listWidget.setviewmode(QListWidget.IconMode)
listWidget.setFixedSize(500,700)
listWidget.setIconSize(QSize(100,200))
listWidget.setDragDropMode(listWidget.InternalMove)
listWidget.setFocusPolicy(Qt.NoFocus) #Why no work?
listWidget.itemEntered.connect(makeLabel()) #Wrong way of doing this
self.listWidget = listWidget
'''json file contains positions of "outfield" players'''
try:
with open('players.txt','r') as file:
data = json.load(file)
except:
data = []
dir = 'Players/'
for filename in os.listdir(dir):
playersIndex = next((i for i,player in enumerate(data) if player['filename'] ==
filename),None)
playersIndex = None #Create button to reset @myself
if playersIndex == None:
item = QListWidgetItem(QIcon(dir + filename),filename,listWidget)
else:
pixmap = Qpixmap(dir + filename).scaledToHeight(100,Qt.SmoothTransformation)
label = MovableLabel(self,filename)
label.setpixmap(pixmap)
label.setFixedSize(pixmap.width(),pixmap.height())
label.setParent(self)
label.move(data[playersIndex]['x'],data[playersIndex]['y'])
self.players.append(label)
self.setStyleSheet("background-color: black;")
self.showMaximized()
self.setAcceptDrops(True)
def closeEvent(self,a0: QtGui.QCloseEvent) -> None:
with open('players.txt','w') as outfile:
json.dump([{'filename': player.filename,'x': player.x(),'y': player.y()} for player in self.players],outfile,indent= 4)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
app.exec_()
from PyQt5 import QtGui
from PyQt5.QtCore import QPoint
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QLabel,QListWidgetItem
class MovableLabel(QLabel):
"""WToolBar is a personalized toolbar."""
homeAction = None
oldPos = QPoint()
def __init__(self,mainWindow: QMainWindow,filename: str):
super().__init__(mainWindow)
self.mainWindow = mainWindow
self.filename = filename
self.clicked = False
def mousepressEvent(self,evt):
"""Select the toolbar."""
self.oldPos = evt.globalPos()
def mouseMoveEvent(self,evt):
"""Move the toolbar with mouse iteration."""
if self.clicked:
delta = QPoint(evt.globalPos() - self.oldPos)
self.move(self.x() + delta.x(),self.y() + delta.y())
else:
self.clicked = True
self.oldPos = evt.globalPos()
def mouseReleaseEvent(self,ev: QtGui.QMouseEvent) -> None:
self.releaseMouse()
self.clicked = False
listWidget: QListWidget = self.mainWindow.listWidget
if ev.globalPos().x() < listWidget.width():
pos = listWidget.mapFromGlobal(ev.globalPos())
index = listWidget.indexAt(pos).row()
icon = QIcon(self.pixmap())
listWidget.insertItem(index,QListWidgetItem(icon,""))
self.hide()
if self in self.mainWindow.players:
self.mainWindow.players.remove(self)
if self not in self.mainWindow.players:
self.mainWindow.players.append(self)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。