Python PySide如何在拖放时保持QLabel可见?

Python PySide如何在拖放时保持QLabel可见?,python,qt,pyqt,drag-and-drop,pyside,Python,Qt,Pyqt,Drag And Drop,Pyside,我想拖放标签,我的代码就是这样做的,但是当移动标签时,标签消失了。如何在拖动标签时使其可见?我正在使用QDrag复制内容 我想能够把这些标签拖到一个有很多插槽的盒子里,当标签掉在附近时,把标签锁在一个插槽里。由于标签在拖动时变得不可见,因此很难想象当我松开鼠标按钮时,标签将被放置在何处 from PySide import QtCore, QtGui myMimeType = 'application/MyWindow' class MyLabel(QtGui.QLabel): de

我想拖放标签,我的代码就是这样做的,但是当移动标签时,标签消失了。如何在拖动标签时使其可见?我正在使用QDrag复制内容

我想能够把这些标签拖到一个有很多插槽的盒子里,当标签掉在附近时,把标签锁在一个插槽里。由于标签在拖动时变得不可见,因此很难想象当我松开鼠标按钮时,标签将被放置在何处

from PySide import QtCore, QtGui

myMimeType = 'application/MyWindow'

class MyLabel(QtGui.QLabel):
    def __init__(self, parent):
        super(MyLabel, self).__init__(parent)

        self.setStyleSheet("""
            background-color: black;
            color: white;
            font: bold;
            padding: 6px;
            border-width: 2px;
            border-style: solid;
            border-radius: 16px;
            border-color: white;
        """)

    def mousePressEvent(self, event):
        itemData   = QtCore.QByteArray()
        dataStream = QtCore.QDataStream(itemData, QtCore.QIODevice.WriteOnly)
        dataStream.writeString(self.text())
        dataStream << QtCore.QPoint(event.pos() - self.rect().topLeft())
    print dataStream

        mimeData = QtCore.QMimeData()
        mimeData.setData(myMimeType, itemData)
        mimeData.setText(self.text())

        drag = QtGui.QDrag(self)
        drag.setMimeData(mimeData)
        drag.setHotSpot(event.pos() - self.rect().topRight())

        self.hide()

        if drag.exec_(QtCore.Qt.MoveAction | QtCore.Qt.CopyAction, QtCore.Qt.CopyAction) == QtCore.Qt.MoveAction:
            self.close()

        else:
            self.show()


class MyFrame(QtGui.QFrame):
    def __init__(self, parent=None):
        super(MyFrame, self).__init__(parent)

        self.setStyleSheet("""
            background-color: lightgray;
            border-width: 2px;
            border-style: solid;
            border-color: black;
            margin: 2px;
        """)

        y = 6
        for labelNumber in range(6):
            label = MyLabel(self)
            label.setText("Label #{0}".format(labelNumber))
            label.move(6, y)
            label.show()

            y += label.height() + 2

        self.setAcceptDrops(True)

    def dragEnterEvent(self, event):
        if event.mimeData().hasFormat(myMimeType):
            if event.source() in self.children():
                event.setDropAction(QtCore.Qt.MoveAction)
                event.accept()

            else:
                event.acceptProposedAction()

        else:
            event.ignore()

    def dropEvent(self, event):
        if event.mimeData().hasFormat(myMimeType):
            mime       = event.mimeData()
            itemData   = mime.data(myMimeType)
            dataStream = QtCore.QDataStream(itemData, QtCore.QIODevice.ReadOnly)

            text = QtCore.QByteArray()
            offset = QtCore.QPoint()
            dataStream >> text >> offset

            newLabel = MyLabel(self)
            newLabel.setText(event.mimeData().text())
            newLabel.move(event.pos() - offset)
            newLabel.show()

            if event.source() in self.children():
                event.setDropAction(QtCore.Qt.MoveAction)
                event.accept()

            else:
                event.acceptProposedAction()

        else:
            event.ignore()

class MyWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MyWindow, self).__init__(parent)

        self.myFrame = MyFrame(self)

        self.setCentralWidget(self.myFrame)

if __name__ == "__main__":
    import sys

    app = QtGui.QApplication(sys.argv)
    app.setApplicationName('MyWindow')

    main = MyWindow()
    main.resize(333, 333)
    main.move(app.desktop().screen().rect().center() - main.rect().center())
    main.show()

    sys.exit(app.exec_())
从PySide导入QtCore、QtGui
myMimeType='应用程序/MyWindow'
MyLabel类(QtGui.QLabel):
定义初始化(自身,父级):
超级(MyLabel,self)。\uuuuu初始化\uuuuuu(父级)
self.setStyleSheet(“”)
背景色:黑色;
颜色:白色;
字体:粗体;
填充:6px;
边框宽度:2倍;
边框样式:实心;
边界半径:16px;
边框颜色:白色;
""")
def鼠标压力事件(自身、事件):
itemData=QtCore.QByteArray()
dataStream=QtCore.QDataStream(itemData,QtCore.QIODevice.WriteOnly)
dataStream.writeString(self.text())
数据流>文本>>偏移量
newLabel=MyLabel(自)
newLabel.setText(event.mimeData().text())
newLabel.move(event.pos()-offset)
newLabel.show()
如果self.children()中的event.source()为:
event.setDropAction(QtCore.Qt.MoveAction)
event.accept()
其他:
event.acceptProposeAction()
其他:
event.ignore()
类MyWindow(QtGui.QMainWindow):
def uuu init uuu(self,parent=None):
超级(MyWindow,self)。\uuuuu init\uuuuuu(父级)
self.myFrame=myFrame(self)
self.setCentralWidget(self.myFrame)
如果名称=“\uuuuu main\uuuuuuuu”:
导入系统
app=QtGui.QApplication(sys.argv)
app.setApplicationName('MyWindow')
main=MyWindow()
main.resize(333333)
main.move(app.desktop().screen().rect().center()-main.rect().center())
main.show()
sys.exit(app.exec_())

您必须保存小部件并在QDrag中进行设置:

从PySide导入QtCore、QtGui
myMimeType=“应用程序/MyWindow”
MyLabel类(QtGui.QLabel):
定义初始化(自身,父级):
超级(MyLabel,self)。\uuuuu初始化\uuuuuu(父级)
自选表格(
"""
背景色:黑色;
颜色:白色;
字体:粗体;
填充:6px;
边框宽度:2倍;
边框样式:实心;
边界半径:16px;
边框颜色:白色;
"""
)
def鼠标压力事件(自身、事件):
itemData=QtCore.QByteArray()
dataStream=QtCore.QDataStream(itemData,QtCore.QIODevice.WriteOnly)
dataStream.writeString(self.text())
数据流>文本>>偏移量
newLabel=MyLabel(自)
newLabel.setText(event.mimeData().text())
newLabel.move(event.pos()-offset)
newLabel.show()
event.setDropAction(QtCore.Qt.MoveAction)
其他:
event.ignore()
类MyWindow(QtGui.QMainWindow):
def uuu init uuu(self,parent=None):
超级(MyWindow,self)。\uuuuu init\uuuuuu(父级)
self.myFrame=myFrame()
self.setCentralWidget(self.myFrame)
如果名称=“\uuuuu main\uuuuuuuu”:
导入系统
app=QtGui.QApplication(sys.argv)
app.setApplicationName(“MyWindow”)
main=MyWindow()
main.resize(333333)
main.show()
sys.exit(app.exec_())

在Win7x64上使用Pyside和Python 2.7.15,我得到了一个
AttributeError:“MyLabel”对象没有属性“grab”
@noEmbryo我已经用PySide2对它进行了测试,但我发现grab是在Qt5中引入的。我刚刚用Qt4兼容代码替换了它,因此PySide兼容,请再试一次。谢谢,它可以工作!你能看看这个问题吗?这个项目的下一步是什么?