Когда две кнопки используют одну и ту же функцию, как узнать, какая кнопка используется? - PullRequest
0 голосов
/ 02 мая 2019

Моя программа имеет:

Две кнопки, можно перемещать мышью и связывать друг с другом


Я использую кнопку btn1, btn2 написать в представлении

Мой вопрос: Они вызывают одну и ту же функцию Action1 и Action2. Я хотел бы отослать позицию кнопки, которую я использую, когда звоню Action2. Как я могу это сделать?

Мое достижение - «печать позиции кнопки с использованием Action2»

У меня есть код:

from PyQt5 import QtGui, QtCore
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt, QMimeData
from PyQt5.QtGui import QDrag


class Window(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        self.view = View(self)
        self.button = QPushButton('Clear View', self)
        self.button.clicked.connect(self.handleClearView)
        layout = QVBoxLayout(self)
        layout.addWidget(self.view)
        layout.addWidget(self.button)


    def handleClearView(self):
        self.view.scene().clear()


class DragButton(QPushButton):
    def __init__(self, title, parent=None):
        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)


class View(QGraphicsView):
    def __init__(self, parent):
        QGraphicsView.__init__(self, parent)
        self.setScene(QGraphicsScene(self))
        self.setAcceptDrops(True)
        self.setSceneRect(QtCore.QRectF(self.viewport().rect()))
        self.btn1=DragButton('Test1', self)
        self.btn2=DragButton('Test2', self)
        self.btn2.setGeometry(230, 80, 100, 30)

        self.menu=QMenu()
        self.menu1=QMenu()
        self.menu.addAction('use', self.Action1)
        self.menu.addAction('sendback', self.Action2)
        self.menu.addAction('delete',self.btn1.deleteLater)

        self.menu1.addAction('use', self.Action1)
        self.menu1.addAction('sendback', self.Action2)
        self.menu1.addAction('delete',self.btn2.deleteLater)

        self.btn1.setMenu(self.menu)
        self.btn2.setMenu(self.menu1)

    def Action2(self):
        print("sendback position")


    def Action1(self):
        print("~")

    def clearScene(self):
        self.scene().clear()

    def dragEnterEvent(self, e):
        if e.source() in [self.btn1, self.btn2]:
            self.clearScene()
        e.accept()

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

    def dropEvent(self, e):
        btn = e.source()
        otherBtn = self.btn2 if btn == self.btn1 else self.btn1
        position = e.pos()
        btn.move(position)

        start = QtCore.QPointF(self.mapToScene(btn.pos()))
        end = QtCore.QPointF(self.mapToScene(otherBtn.pos()))

        self.scene().addItem(
            QGraphicsLineItem(QtCore.QLineF(start, end)))

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


if __name__ == '__main__':

    import sys
    app = QApplication(sys.argv)
    window = Window()
    window.resize(640, 480)
    window.show()
    sys.exit(app.exec_())

1 Ответ

0 голосов
/ 02 мая 2019

Перемещение меню и действий непосредственно в вашем DragButton классе.

class DragButton(QPushButton):
    def __init__(self, title, parent=None):
        super().__init__(title, parent)
        self.menu=QMenu()
        self.menu.addAction('use', self.Action1)
        self.menu.addAction('sendback', self.Action2)
        self.menu.addAction('delete',self.deleteLater)
        self.setMenu(self.menu)


    def Action2(self):
        print("sendback position", self.geometry())

    def Action1(self):
        print("~")

    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)


class View(QGraphicsView):
    def __init__(self, parent):
        QGraphicsView.__init__(self, parent)
        self.setScene(QGraphicsScene(self))
        self.setAcceptDrops(True)
        self.setSceneRect(QtCore.QRectF(self.viewport().rect()))
        self.btn1=DragButton('Test1', self)
        self.btn2=DragButton('Test2', self)
        self.btn2.setGeometry(230, 80, 100, 30)

Если ваши кнопки должны делиться информацией с вашим видом, вы можете создавать новые сигналы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...