如何使用Python Qt创建拖放图像重新排序?

如何使用Python Qt创建拖放图像重新排序?,python,python-3.x,pyqt,pyqt5,Python,Python 3.x,Pyqt,Pyqt5,我想做的是能够显示图像,并允许用户拖动和重新排序它们。我对pythonqt几乎没有经验,所以我有点不确定应该如何处理这个问题。我也不确定这是否可以通过pixmap实现,或者我是否应该使用Qimage。任何人都可以提供一些关于我应该如何处理这个问题的见解。谢谢。您必须重新实现一个小部件,以便在其上显示图像并编辑其mousePressEvent、mouseMoveEvent和mouseereleasevent方法 以下是一个例子: 类DragableImage(qtwidts.QLabel): 定义

我想做的是能够显示图像,并允许用户拖动和重新排序它们。我对pythonqt几乎没有经验,所以我有点不确定应该如何处理这个问题。我也不确定这是否可以通过pixmap实现,或者我是否应该使用Qimage。任何人都可以提供一些关于我应该如何处理这个问题的见解。谢谢。

您必须重新实现一个小部件,以便在其上显示图像并编辑其
mousePressEvent
mouseMoveEvent
mouseereleasevent
方法

以下是一个例子:

类DragableImage(qtwidts.QLabel):
定义初始化(self,imgPath=None,parent=None):
super(DraggableImage,self)。\uuuu init\uuuu()
self.setParent(父级)
self.setFixedSize(64,64)
self.setPixmap(QtGui.QPixmap(imgPath))
self.drag\u start\u pos=无
def鼠标压力事件(自身、事件):
如果event.button()==QtCore.Qt.LeftButton:
self.setCursor(QtCore.Qt.ClosedHandCursor)
#这将为我们提供触发拖动时的开始位置
self.drag\u start\u pos=event.pos()
自我提升()
超级(DragableImage,self).mousePressEvent(事件)
def mouseMoveEvent(自身、事件):
如果self.drag\u start\u pos不是无:
#单击左键时,小部件将随鼠标移动
self.move(self.pos()+event.pos()-self.drag\u start\u pos)
超级(DragableImage,self).mouseMoveEvent(事件)
def mouseReleaseEvent(自身,事件):
self.setCursor(QtCore.Qt.ArrowCursor)
self.drag\u start\u pos=无
父布局=self.parent().mainLayout
all_images=[parent_layout.itemAt(i).widget()表示范围内的i(parent_layout.count())]
#按窗口小部件的x位置对其列表进行排序
顺序=已排序(所有图像,键=lambda i:i.pos().x())
#从布局中删除每个项目,并插入应该放在该索引中的项目。
对于idx,枚举小部件(顺序):
父_布局。takeAt(idx)
parent_layout.insertWidget(idx,widget)
超级(DragableImage,self).mouseReleaseEvent(事件)
类主窗口(qtwidts.QWidget):
定义初始化(自):
超级(主窗口,自我)。\uuuu初始化
self.mainLayout=qtwidts.QHBoxLayout()
self.setLayout(self.mainloayout)
自我评价。_imgList=[
“dog.jpg”,
“cat.jpg”,
“mouse.jpg”,
“fish.jpg”
]
对于自我中的img。\u imgList:
draggableImage=draggableImage(imgPath=img,parent=self)
self.mainLayout.addWidget(DragableImage)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
导入系统
app=qtwidts.QApplication(sys.argv)
win=主窗口()
win.show()
sys.exit(app.exec_())

您必须重新实现一个小部件,以便在其上显示图像并编辑其
mousePressEvent
mouseMoveEvent
mouseReleaseEvent
方法

以下是一个例子:

类DragableImage(qtwidts.QLabel):
定义初始化(self,imgPath=None,parent=None):
super(DraggableImage,self)。\uuuu init\uuuu()
self.setParent(父级)
self.setFixedSize(64,64)
self.setPixmap(QtGui.QPixmap(imgPath))
self.drag\u start\u pos=无
def鼠标压力事件(自身、事件):
如果event.button()==QtCore.Qt.LeftButton:
self.setCursor(QtCore.Qt.ClosedHandCursor)
#这将为我们提供触发拖动时的开始位置
self.drag\u start\u pos=event.pos()
自我提升()
超级(DragableImage,self).mousePressEvent(事件)
def mouseMoveEvent(自身、事件):
如果self.drag\u start\u pos不是无:
#单击左键时,小部件将随鼠标移动
self.move(self.pos()+event.pos()-self.drag\u start\u pos)
超级(DragableImage,self).mouseMoveEvent(事件)
def mouseReleaseEvent(自身,事件):
self.setCursor(QtCore.Qt.ArrowCursor)
self.drag\u start\u pos=无
父布局=self.parent().mainLayout
all_images=[parent_layout.itemAt(i).widget()表示范围内的i(parent_layout.count())]
#按窗口小部件的x位置对其列表进行排序
顺序=已排序(所有图像,键=lambda i:i.pos().x())
#从布局中删除每个项目,并插入应该放在该索引中的项目。
对于idx,枚举小部件(顺序):
父_布局。takeAt(idx)
parent_layout.insertWidget(idx,widget)
超级(DragableImage,self).mouseReleaseEvent(事件)
类主窗口(qtwidts.QWidget):
定义初始化(自):
超级(主窗口,自我)。\uuuu初始化
self.mainLayout=qtwidts.QHBoxLayout()
self.setLayout(self.mainloayout)
自我评价。_imgList=[
“dog.jpg”,
“cat.jpg”,
“mouse.jpg”,
“fish.jpg”
]
对于自我中的img。\u imgList:
draggableImage=draggableImage(imgPath=img,parent=self)
self.mainLayout.addWidget(DragableImage)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
导入系统
app=qtwidts.QApplication(sys.argv)
win=主窗口()
win.show()
sys.exit(app.exec_())

谢谢,这正是我想要的。我已经编辑了
mousePressEvent
以包含
self.raise()。这解决了拖动时图像落后于其他图像的问题。谢谢,这正是我想要的。我编辑了
mousePressEvent
以包含
self.raise()。这修复了拖动时图像落后于其他图像的问题。