【问题标题】:Drag and Drop QLabels with PyQt5 Pixmap and text使用 PyQt5 Pixmap 和文本拖放 QLabels
【发布时间】:2019-04-11 16:06:24
【问题描述】:

我在大约 11 个月前的一个问题中发现了与此标题相同的问题。我想念的是:如何拖放 Qlabel,我可以在其中复制 Pixmap 和标签的文本。

我将有几个具有不同像素图的 QLabel。通过拖放,我将填充另一个标签(我的目标标签)。在那里,我想查看图片(像素图)并想阅读标签的文本,因为我想做另一个动作,这取决于我从哪个 QLabels 填充了我的目标级别

通过上述问题的答案,我可以复制文本或像素图,不能同时复制。

我尝试解释下面的代码: 在可拖动标签中,我看到了我的文字和图片。在初始化部分中,我打印 self.text() 并从调用中获取正确的文本。但是在 mouseMoveEvent 中,self.text() 是空的。 当我稍后 setText(...) 时,可以在我的目标标签的放置事件中评估此文本。 只有 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()

附:抱歉,但我没有得到正确的代码,该类和 def 处于不同的级别 (使用 python3,6 在 Ubuntu 18 中工作)

【问题讨论】:

    标签: python-3.x drag-and-drop pyqt5 qlabel


    【解决方案1】:

    当您为标签设置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()
    

    【讨论】:

      猜你喜欢
      • 2018-10-18
      • 2017-05-27
      • 1970-01-01
      • 2019-02-13
      • 2018-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多