使用 PyQt5 像素图和文本拖放 QLabel
Drag and Drop QLabels with PyQt5 Pixmap and text
我在大约 11 个月前的一个问题中找到了与此标题相同的问题。我想念的是:如何拖放 Qlabel,我可以在其中复制像素图和标签文本。
我将有几个具有不同像素图的 QLabel。通过拖放,我将填充另一个标签(我的 goal-label)。在那里,我想看图片(Pixmap)并想阅读标签的文本,因为我想做另一个动作,这取决于我从哪个 QLabels 中填充了我的目标级别
根据上述问题的答案,我可以复制文本或像素图,但不能同时复制两者。
我试着解释下面的代码:
在可拖动标签中,我看到了我的文字和图片。在 init-section 中,我打印 self.text() 并从调用中获取正确的文本。但是在 mouseMoveEvent 中,self.text() 是空的。
当我稍后设置文本(...)时,可以在我的 goal-label 的 drop-event 中评估此文本。
只有 Pxmap 的副本在这里有效。
问题:如何让 selt.text() 进入我的 mouseMoveEvent?
class DraggableLabel(QLabel):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setText = args[0]
self.setAcceptDrops(True)
print("my text in init ", self.text())
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
self.drag_start_position = event.pos()
def mouseMoveEvent(self, event):
print("where is the text?", self.text())
if not (event.buttons() & Qt.LeftButton):
return
if (event.pos() - self.drag_start_position).manhattanLength() < QApplication.startDragDistance():
return
drag = QDrag(self)
mimedata = QMimeData()
mimedata.setText('this text works')
print("text in mimedata",self.text(), " und ",mimedata.text())
mimedata.setImageData(self.pixmap().toImage())
drag.setMimeData(mimedata)
pixmap = QPixmap(self.size())
painter = QPainter(pixmap)
painter.drawPixmap(self.rect(), self.grab())
painter.end()
drag.setPixmap(pixmap)
drag.setHotSpot(event.pos())
drag.exec_(Qt.CopyAction | Qt.MoveAction)
class my_label(QLabel):
def __init__(self,title,parent):
super().__init__(title,parent)
self.setAcceptDrops(True)
pixmap = QPixmap('/home/jf/PycharmProjects/Einzelnoten-1.jpg')
self.setPixmap(pixmap)
def dragEnterEvent(self,event):
if event.mimeData().hasImage():
print("event accepted")
event.accept()
else:
print("event rejected")
event.ignore()
def dropEvent(self,event):
if event.mimeData().hasImage():
text = event.mimeData().text()
self.setPixmap(QPixmap(event.mimeData().imageData()))
print("mimetext",event.mimeData().text())
`
class Widget(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
label = my_label("muh",self) #DropLabel("drop there",self)
label.setGeometry(190, 65, 100,100)
label_to_drag = DraggableLabel("mist", self) #image) #"/home/jf/PycharmProjects/Image.png", self) #("Einzelnoten-1.jpg", self)
image=QPixmap("/home/jf/PycharmProjects/Image.png")
label_to_drag.setPixmap((image))
self.show()
P.S。抱歉,但我没有得到正确的代码,class 和 def 处于不同的级别
(在 Ubuntu 18 和 python3,6 工作)
当您为标签设置 QPixmap
时,它会丢失其文本。因此,您可以在设置像素图之前保存标签文本:
class DraggableLabel(QLabel):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setText(args[0])
self._text = None
self.setAcceptDrops(True)
print("my text in init ", self.text())
def setPixmap(self, pixmap):
if pixmap.isNull():
self._text = None
else:
self._text = self.text()
super().setPixmap(pixmap)
def text(self):
if self._text:
return self._text
return super().text()
我在大约 11 个月前的一个问题中找到了与此标题相同的问题。我想念的是:如何拖放 Qlabel,我可以在其中复制像素图和标签文本。
我将有几个具有不同像素图的 QLabel。通过拖放,我将填充另一个标签(我的 goal-label)。在那里,我想看图片(Pixmap)并想阅读标签的文本,因为我想做另一个动作,这取决于我从哪个 QLabels 中填充了我的目标级别
根据上述问题的答案,我可以复制文本或像素图,但不能同时复制两者。
我试着解释下面的代码: 在可拖动标签中,我看到了我的文字和图片。在 init-section 中,我打印 self.text() 并从调用中获取正确的文本。但是在 mouseMoveEvent 中,self.text() 是空的。 当我稍后设置文本(...)时,可以在我的 goal-label 的 drop-event 中评估此文本。 只有 Pxmap 的副本在这里有效。
问题:如何让 selt.text() 进入我的 mouseMoveEvent?
class DraggableLabel(QLabel):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setText = args[0]
self.setAcceptDrops(True)
print("my text in init ", self.text())
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
self.drag_start_position = event.pos()
def mouseMoveEvent(self, event):
print("where is the text?", self.text())
if not (event.buttons() & Qt.LeftButton):
return
if (event.pos() - self.drag_start_position).manhattanLength() < QApplication.startDragDistance():
return
drag = QDrag(self)
mimedata = QMimeData()
mimedata.setText('this text works')
print("text in mimedata",self.text(), " und ",mimedata.text())
mimedata.setImageData(self.pixmap().toImage())
drag.setMimeData(mimedata)
pixmap = QPixmap(self.size())
painter = QPainter(pixmap)
painter.drawPixmap(self.rect(), self.grab())
painter.end()
drag.setPixmap(pixmap)
drag.setHotSpot(event.pos())
drag.exec_(Qt.CopyAction | Qt.MoveAction)
class my_label(QLabel):
def __init__(self,title,parent):
super().__init__(title,parent)
self.setAcceptDrops(True)
pixmap = QPixmap('/home/jf/PycharmProjects/Einzelnoten-1.jpg')
self.setPixmap(pixmap)
def dragEnterEvent(self,event):
if event.mimeData().hasImage():
print("event accepted")
event.accept()
else:
print("event rejected")
event.ignore()
def dropEvent(self,event):
if event.mimeData().hasImage():
text = event.mimeData().text()
self.setPixmap(QPixmap(event.mimeData().imageData()))
print("mimetext",event.mimeData().text())
`
class Widget(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
label = my_label("muh",self) #DropLabel("drop there",self)
label.setGeometry(190, 65, 100,100)
label_to_drag = DraggableLabel("mist", self) #image) #"/home/jf/PycharmProjects/Image.png", self) #("Einzelnoten-1.jpg", self)
image=QPixmap("/home/jf/PycharmProjects/Image.png")
label_to_drag.setPixmap((image))
self.show()
P.S。抱歉,但我没有得到正确的代码,class 和 def 处于不同的级别 (在 Ubuntu 18 和 python3,6 工作)
当您为标签设置 QPixmap
时,它会丢失其文本。因此,您可以在设置像素图之前保存标签文本:
class DraggableLabel(QLabel):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setText(args[0])
self._text = None
self.setAcceptDrops(True)
print("my text in init ", self.text())
def setPixmap(self, pixmap):
if pixmap.isNull():
self._text = None
else:
self._text = self.text()
super().setPixmap(pixmap)
def text(self):
if self._text:
return self._text
return super().text()