Перетаскивание QLabels с помощью PyQt5 Pixmap и текста

#python-3.x #drag-and-drop #pyqt5 #qlabel

#python-3.x #перетаскивание #pyqt5 #qlabel

Вопрос:

Я нахожу тот же вопрос с этим заголовком в вопросе около 11 месяцев назад. Чего мне не хватает, так это: как мне перетащить Qlabel, куда я могу скопировать пиксельную карту и текст метки.

У меня будет несколько QLabel с разными пиксельными изображениями. С помощью перетаскивания я собираюсь заполнить другую метку (моя цель-метка). Там я хочу увидеть изображение (Pixmap) и хочу прочитать текст метки, потому что я хочу выполнить другое действие, в зависимости от того, с какой из QLabels я заполнил свой целевой уровень

С ответами на упомянутый вопрос я могу скопировать либо текст, либо пиксельную карту, но никогда оба.

Я пытаюсь объяснить приведенный ниже код: в перетаскиваемой метке я вижу свой текст и картинку. В разделе инициализации я печатаю self.text() и получаю правильный текст из вызова. Но в mouseMoveEvent функция self.text() пуста. Когда я установлю текст (…) позже, этот текст может быть оценен в событии удаления моей метки цели. ЗДЕСЬ работает только копия 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() amp; 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()
  

PS Извините, но я неправильно понял код, что class и def находятся на разных уровнях
(Работает в Ubuntu 18 с python3,6)

Ответ №1:

Когда вы устанавливаете a 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()