当一个按钮从一个按钮拖放到另一个按钮时,按钮是按下的

chowooseung

拖放后按钮是向下的。

有没有办法掉下来后自动恢复原状?

如果可能的话,我想避免对按钮进行子类化。

目前,我正在测试 drop 以外的事件。

下面按钮的图像和正在测试的代码。

在此处输入图片说明

from PySide2 import QtWidgets, QtCore, QtGui
from functools import partial

class DragTest(QtWidgets.QMainWindow):
    
    def __init__(self):
        super(DragTest, self).__init__()

        cent = QtWidgets.QWidget()
        self.setCentralWidget(cent)

        layout = QtWidgets.QHBoxLayout(cent)
        self.color1_btn = QtWidgets.QPushButton(acceptDrops=True)
        self.color1_btn.clicked.connect(partial(self.color_btn_click, widget=self.color1_btn))
        self.color2_btn = QtWidgets.QPushButton(acceptDrops=True)
        self.color2_btn.clicked.connect(partial(self.color_btn_click, widget=self.color2_btn))
        layout.addWidget(self.color1_btn)
        layout.addWidget(self.color2_btn)
        self.color1_btn.installEventFilter(self)
        self.color2_btn.installEventFilter(self)
        self.color1_btn.color = self.color2_btn.color = None

        self.btn1 = QtWidgets.QPushButton()
        self.btn2 = QtWidgets.QPushButton()
        layout.addWidget(self.btn1)
        layout.addWidget(self.btn2)

    def color_btn_click(self, widget):
        color = QtWidgets.QColorDialog.getColor()
        if color.isValid():
            self.set_color(widget, color)

    def set_color(self, widget, color):
        widget.setStyleSheet("background-color:rgb({0},{1},{2})".format(*color.getRgb()))
        widget.color = color
    
    def eventFilter(self, obj, event):
        if obj in {self.color1_btn, self.color2_btn}:
            if event.type() == QtCore.QEvent.MouseMove and obj.color:
                mimedata = QtCore.QMimeData()
                mimedata.setColorData(obj.color)
                
                pixmap = QtGui.QPixmap(20, 20)
                pixmap.fill(QtCore.Qt.transparent)
                painter = QtGui.QPainter(pixmap)
                painter.setRenderHint(QtGui.QPainter.Antialiasing)
                painter.setBrush(obj.color)
                painter.setPen(QtGui.QPen(obj.color.darker(150), 2))
                painter.drawEllipse(pixmap.rect().center(), 8, 8)
                painter.end()
                
                drag = QtGui.QDrag(obj)
                drag.setMimeData(mimedata)
                drag.setPixmap(pixmap)
                drag.setHotSpot(pixmap.rect().center())
                drag.exec_(QtCore.Qt.CopyAction)
                
            elif event.type() == QtCore.QEvent.DragEnter:
                event.accept() if event.mimeData().hasColor() else event.ignore()

            elif event.type() == QtCore.QEvent.Drop:
                self.set_color(obj, event.mimeData().colorData())
                self.color1_btn.setDown(False)
                self.color2_btn.setDown(False)
                event.accept()
                
        return super(DragTest, self).eventFilter(obj, event)

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    win = DragTest()
    win.show()
    sys.exit(app.exec_())
  1. 按下按钮恢复
  2. 如果可能,避免按钮子类化
音乐家

问题是在drag.exec_()阻塞)之后,只要拖动事件循环完成,鼠标移动事件仍然会被事件过滤器处理,这意味着事件将在拖动发送到按钮.

此时鼠标按钮已经被释放,但是按钮没有收到它,因为 mouseButtonRelease 事件已经被拖动释放动作“吃掉”了,然后是之前被阻止的 mouseMove 事件。

从按钮的角度来看,您按下了鼠标按钮,但没有释放它:它收到的只是最后一次鼠标移动事件(用于创建拖动的事件),因此它“相信”鼠标仍然在上面,按下按钮。

每当事件已被管理且不应进一步处理时,过滤器应返回True

    def eventFilter(self, obj, event):
        if obj in {self.color1_btn, self.color2_btn}:
            if event.type() == QtCore.QEvent.MouseMove and obj.color:
                # ...
                drag.exec_(QtCore.Qt.CopyAction)
                obj.setDown(False)
                return True

            elif event.type() == QtCore.QEvent.DragEnter:
                event.accept() if event.mimeData().hasColor() else event.ignore()

            elif event.type() == QtCore.QEvent.Drop:
                self.set_color(obj, event.mimeData().colorData())
                # self.color1_btn.setDown(False)
                # self.color2_btn.setDown(False)
                event.accept()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

按下按钮时,如何模拟按下的另一个按钮?

按下另一个活动中的按钮时更改按钮颜色

单击另一个按钮时按钮消失

按下另一个按钮后,如何只给一个按钮一次功能?

使一个按钮按另一个按钮。Matlab GUI

当我按下另一个按钮时,如何显示按下按钮的视觉效果?

禁用AeroWizard上的下一个按钮,直到按下另一个按钮

使用javascript按下按钮时,如何打开一个窗口并关闭另一个窗口?

如何更改按钮状态直到按下另一个按钮?

从另一个按钮按下控制按钮的各个方面 - Swift

按下另一个按钮后禁用和取消选择单选按钮

按下另一个按钮后如何使用按钮发送器?

当单元格中按下按钮时,如何将数据从一个Tableview传递到另一个Tableview?

当按下按钮或按键时,如何在AvalonDock中从一个选项卡转到另一个选项卡?

单击另一个按钮时如何更改一个按钮的操作(SwiftUI)?

AutoHotKey:按下另一个键盘按钮时触发无限次按下键盘按钮

按下 AlertController 的选项按钮时进入另一个页面 ionic

按下对话框的按钮时是否打开另一个活动?

在当前模态上按下按钮时,如何触发另一个模态?

当按下另一个按钮时,执行当前的UITextField自动更正建议

按下按钮时如何转到另一个视图?

当按下弹出窗口中的按钮时,从另一个类调用方法

在 Python 中按下按钮(tkinter)时如何执行另一个文件?

检测是否按下了另一个按钮

在 MATLAB GUI 中按下另一个按钮时如何调用按钮的回调?

当鼠标从一个按钮移到另一个按钮时,左右更改2个按钮的颜色

按下按钮后,打开另一个面板中的另一个面板

单击按钮并关闭另一个按钮

从另一个按钮禁用按钮