определить экземпляр в перетаскивании - PullRequest
1 голос
/ 17 марта 2020

Я очень стараюсь понять, как определить экземпляр класса с помощью перетаскивания, но мне нужна помощь.

Ниже я добавляю образец из "http://zetcode.com/gui/pyqt5/dragdrop/" Чтобы объяснить.

#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
ZetCode PyQt5 tutorial

In this program, we can press on a button with a left mouse
click or drag and drop the button with  the right mouse click. 

Author: Jan Bodnar
Website: zetcode.com
Last edited: August 2017
"""

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)

        e.setDropAction(Qt.MoveAction)
        e.accept()


if __name__ == '__main__':

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

Вот мои вопросы:

если я создаю 2-ю кнопку

    self.button2 = Button('Button2', self)
    self.button2.move(100, 165)

, я также могу переместить button2, но в DropEvent первый кнопка "кнопка" перемещена.

Как можно определить в DropEvent, что я перемещаю "кнопку2" и помещаю кнопку 2?

Итак: вопрос в том, как определить, какую кнопку является. (я нашел только перетаскивание n примеров, как заменить метку или кнопку другим элементом того же типа)

И дополнительный вопрос: создание нового экземпляра работает с этим типом кода. Если я создаю кнопки в конструкторе QT5, я не могу использовать их в качестве экземпляра этого типа класса Button в этом коде. Итак, определяя перетаскивание n drop в конструкторе QT5, перетаскивание n drop элемента в списке в другой список работает, но я не могу определить, какой элемент я перетащил

Ответы [ 2 ]

1 голос
/ 17 марта 2020

Если объект, который вы перетаскиваете, является QWidget, то вы можете получить его через метод QDropEvent source (), а QPushButton - это QWidget, поэтому он работает в этом случае:

def dropEvent(self, e):
    if e.source() is not None:
        position = e.pos()
        e.source().move(position)
        e.setDropAction(Qt.MoveAction)
        e.accept()

Не забудьте проверить, что это не None, поскольку источником может быть другое окно, которое не является QWidget, поэтому вы получите исключение


Если вы хотите, чтобы кнопки добавлялись через Qt Designer, то вы хотите чтобы они имели ту же функциональность, что и самое простое решение - продвигать кнопки, в SO много примеров, где они показывают, как это сделать:

0 голосов
/ 17 марта 2020

Вы всегда используете self.button в своем событии перетаскивания, поэтому оно относится к одной и той же кнопке. Вместо этого вы можете использовать QDropEvent.source(), чтобы получить правильный виджет.

def dropEvent(self, e):
    position = e.pos()
    e.source().move(position) # source widget

    e.setDropAction(Qt.MoveAction)
    e.accept()
...