Pyqt5 Two QButton Drag and Drop - PullRequest
       3

Pyqt5 Two QButton Drag and Drop

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

В окне есть две кнопки, называемые Button1 и Button2. В приведенном ниже коде я могу переместить его, щелкнув правой кнопкой мыши кнопку с именем Button1. Button1 снова перемещается, когда я хочу щелкнуть правой кнопкой мыши и перетащить Button2. Но я не могу переместить Button2 с кодом ниже. Я хочу переместить какую из этих двух кнопок правой кнопкой мыши. Как я могу это сделать?

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.button1 = Button('Button1', self)
        self.button1.setFixedSize(100,100)
        self.button1.move(0, 0)

        self.button2 = Button('Button2', self)
        self.button2.move(0, 110)
        self.setWindowTitle('Click or Move')
        self.setGeometry(0, 0, 400, 400)


    def dragEnterEvent(self, e):
        e.accept()

    def dropEvent(self, e):
        position = e.pos()
        print(position)
        self.button1.move(position)
        e.setDropAction(Qt.MoveAction)
        e.accept()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    ex.show()
    app.exec_() 

1 Ответ

2 голосов
/ 10 марта 2020

Вам не нужно создавать подкласс для кнопки, чтобы переместить ее, и вам определенно не следует использовать перетаскивание, если вы собираетесь переместить объект в пределах одного и того же родителя.

Кроме того, если вы При проверке только тех движений, которые происходят, пока нажата правая кнопка, вы должны всегда вызывать базовую реализацию для других ситуаций (других кнопок или без кнопки, если mouseTracking включен; обычно это не так с кнопками pu sh, но это не главное).

Установите на кнопки фильтр событий и отследите следующие события:

  • QEvent.MouseButtonPress: если кнопка является правой, установите переменную для текущего движущегося виджета и другую с текущей позицией мыши (скажем, startPosition)
  • QEvent.MouseMove: если текущий движущийся виджет существует, переместите его по формуле newPosition = currentPosition + eventPosition - startPosition
  • QEvent.MouseButtonRelease: очистить текущий движущийся виджет
class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()

        self.movingButton = None

    def initUI(self):

        self.button1 = QPushButton('Button1', self)
        self.button1.setFixedSize(100,100)
        # no need for this, every new widget is always placed at (0, 0)
        # self.button1.move(0, 0)
        self.button1.installEventFilter(self)

        self.button2 = QPushButton('Button2', self)
        self.button2.move(0, 110)
        self.button2.installEventFilter(self)

        self.setWindowTitle('Click or Move')
        self.setGeometry(0, 0, 400, 400)

    def eventFilter(self, source, event):
        if source in (self.button1, self.button2):
            if event.type() == QEvent.MouseButtonPress and event.button() == Qt.RightButton:
                self.movingButton = source
                self.startPos = event.pos()
            # uncomment the following lines if you want to move the button while
            # moving the mouse
            # elif event.type() == QEvent.MouseMove and self.movingButton:
            #     self.movingButton.move(source.pos() + event.pos() - self.startPos)
            elif event.type() == QEvent.MouseButtonRelease and self.movingButton:
                self.movingButton.move(source.pos() + event.pos() - self.startPos)
                self.movingButton = None
        return super().eventFilter(source, event)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...