Python 使用拖放时如何拖动图标

Python 使用拖放时如何拖动图标,python,pyqt5,Python,Pyqt5,目前,我有以下代码执行拖放功能,并通过拖放另一个按钮来生成一个新按钮 但我想知道的是: 当我拖动鼠标按钮时,我怎样才能制作出他的图像 大概是这样的: 这是您使用的代码 在这方面,我希望通过使用Qpushbutton from PyQt5.QtWidgets import QPushButton, QWidget, QApplication from PyQt5.QtCore import Qt, QMimeData from PyQt5.QtGui import QDrag import sy

目前,我有以下代码执行拖放功能,并通过拖放另一个按钮来生成一个新按钮

但我想知道的是: 当我拖动鼠标按钮时,我怎样才能制作出他的图像

大概是这样的:

这是您使用的代码

在这方面,我希望通过使用
Qpushbutton

from PyQt5.QtWidgets import QPushButton, QWidget, QApplication
from PyQt5.QtCore import Qt, QMimeData
from PyQt5.QtGui import QDrag
import sys

class Button(QPushButton):

    def __init__(self, title, parent):
        super().__init__(title, parent)


    def mouseMoveEvent(self, e):

        if e.buttons() != Qt.RightButton:
            return

        mimeData = QMimeData()

        drag = QDrag(self)
        drag.setMimeData(mimeData)
        drag.setHotSpot(e.pos() - self.rect().topLeft())

        dropAction = drag.exec_(Qt.MoveAction)


    def mousePressEvent(self, e):

        super().mousePressEvent(e)

        if e.button() == Qt.LeftButton:
            print('press')


class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):

        self.setAcceptDrops(True)

        self.button = Button('Button', self)
        self.button.move(100, 65)

        self.setWindowTitle('Click or Move')
        self.setGeometry(300, 300, 280, 150)


    def dragEnterEvent(self, e):

        e.accept()


    def dropEvent(self, e):

        position = e.pos()
        self.button.move(position)
        self.create(position)
        e.setDropAction(Qt.MoveAction)
        e.accept()


    def create(self,position):
        print(position)
        self.position  = position
        self.newButton = QPushButton("new",self)
        self.newButton.move(self.position)
        self.newButton.resize(150,50)
        self.newButton.show()



if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    ex.show()
    app.exec_() 

您必须使用
grab()
方法拍摄小部件图像,然后使用
setPixmap()
方法将其设置为QDrag。此外,我还创建了一个方法,用于创建具有相同q属性的相同类型源的小部件(这并不意味着它是小部件的副本,因为存在不可复制的元素)。另一方面,建议使用右键点击,因为左键点击会干扰点击信号

from PyQt5 import QtCore, QtGui, QtWidgets

def fake_copy_widget(widget, parent):
    t = type(widget)
    w = t(parent)
    mo = widget.metaObject()
    for i in range(mo.propertyCount()):
        prop = mo.property(i)
        if prop.isWritable() and prop.isReadable():
            name = prop.name()
            w.setProperty(name, widget.property(name))
    return w

class Button(QtWidgets.QPushButton):
    def mouseMoveEvent(self, e):
        if e.buttons() & QtCore.Qt.RightButton:
            pos = self.mapFromGlobal(QtGui.QCursor().pos())
            ba = QtCore.QByteArray()
            ds = QtCore.QDataStream(ba, QtCore.QIODevice.WriteOnly)
            ds << pos
            mimeData = QtCore.QMimeData()
            mimeData.setData("application/x-pos", ba)
            pixmap = self.grab()
            drag = QtGui.QDrag(self)
            drag.setHotSpot(pos)
            drag.setPixmap(pixmap)
            drag.setMimeData(mimeData)
            drag.setHotSpot(e.pos() - self.rect().topLeft())
            dropAction = drag.exec_(QtCore.Qt.MoveAction)

class Example(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setAcceptDrops(True)
        button = Button('Button', self)
        button.move(100, 65)
        self.setWindowTitle('Click or Move')
        self.setGeometry(300, 300, 280, 150)

    def dragEnterEvent(self, e):
        if e.mimeData().hasFormat("application/x-pos"):
            e.accept()

    def dropEvent(self, e):
        position = e.pos()
        button = e.source()
        mimedata = e.mimeData()
        p = QtCore.QPoint()
        ba = mimedata.data("application/x-pos")
        ds = QtCore.QDataStream(ba)
        ds >> p
        self.create(QtCore.QRect(position - p, button.size()), button, self)
        e.accept()

    def create(self, geometry, widget, parent):
        button = fake_copy_widget(widget, parent)
        button.setGeometry(geometry)
        button.show()

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    ex = Example()
    ex.show()
    sys.exit(app.exec_())
从PyQt5导入QtCore、QtGui、qtwidget
def fake_copy_小部件(小部件,父部件):
t=类型(小部件)
w=t(父级)
mo=widget.metaObject()
对于范围内的i(mo.propertyCount()):
prop=mo.property(i)
如果prop.isWritable()和prop.isReadable():
name=prop.name()
w、 setProperty(名称,widget.property(名称))
返回w
类按钮(QtWidgets.QPushButton):
def mouseMoveEvent(自身,e):
如果e.buttons()&QtCore.Qt.RightButton:
pos=self.mapFromGlobal(QtGui.QCursor().pos())
ba=QtCore.QByteArray()
ds=QtCore.QDataStream(ba,QtCore.QIODevice.WriteOnly)
ds>p
创建(QtCore.QRect(position-p,button.size()),button,self)
e、 接受
def创建(自身、几何体、小部件、父项):
按钮=假复制小部件(小部件,父部件)
按钮。设置几何体(几何体)
按钮。显示()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
导入系统
app=qtwidts.QApplication(sys.argv)
ex=示例()
例如:show()
sys.exit(app.exec_())