将带有光标的小部件移动到另一个布局

如何解决将带有光标的小部件移动到另一个布局

我想模拟自定义小部件的 QDockWidget/qtoolbar 行为,使用 mousepressEvent一个位置取消固定小部件并将其固定到另一个位置。喜欢将上框放置到“子”位置:

enter image description here

我可以使用以下代码取消固定它:

class DraggableSpectralFrame(SpectralFrame):
    def __init__(self,parent=None):
        super().__init__(parent)
        self.setMouseTracking(True)
        self.setwindowFlags(Qt.Window | Qt.FramelessWindowHint)
        self.oldPos = QPointF(self.pos())
        self.local= QPointF(self.pos())
        self.floating = False

    def mousepressEvent(self,event):
        self.oldPos = event.globalPos()
        if self.hoverRect.contains(event.localPos()) and \
                event.button() == Qt.LeftButton:
            self.floating = True
            self.local = event.localPos()
            self.setParent(None)
            self.show()
            self.move((self.oldPos - self.local).toPoint())


    def mouseMoveEvent(self,event):
        self.oldPos = event.globalPos()
        if self.floating:
            self.move((self.oldPos - self.local).toPoint())

enter image description here

在将 DraggableSpectralFrame 变形为窗口并以正确的方式移动窗口后,我失去了按下功能的问题,我必须再次单击/按下。没有额外的点击窗口仍然对光标移动做出反应(由于 self.floatingTrue)但很容易失去对急剧移动的关注。

也许有更简单的方法来实现这个想法,如果是这样的话 - 请告诉我!

解决方法

实现拖放的一种方法是使用 QDrag 对象在拖动时显示小部件。对于应该接受拖动的小部件的小部件,您需要将 acceptDrops 设置为 True 并至少重新实现 dragEnterEventdropEvent。这是一个非常简单的例子,如何做到这一点。在这个例子中,“Move me”标签可以在两个窗口之间来回拖动。

from PyQt5 import QtWidgets,QtCore,QtGui


class DropFrame(QtWidgets.QWidget):
    def __init__(self,parent=None):
        super().__init__(parent)
        self.vlayout = QtWidgets.QVBoxLayout(self)
        self.setAcceptDrops(True)

    def dragEnterEvent(self,event):
        if isinstance(event.source(),DraggableLabel):
            event.accept()

    def dropEvent(self,event):
        event.accept()
        widget = event.source()
        if widget:
            self.vlayout.addWidget(widget)


class DraggableLabel(QtWidgets.QLabel):
    def __init__(self,text,parent=None):
        super().__init__(text,parent)
        self.setFrameShape(self.Box)

    def mousePressEvent(self,event):
        self.drag = QtGui.QDrag(self)
        self.mime_data = QtCore.QMimeData()
        self.drag.setMimeData(self.mime_data)
        # capture image of self to use as pixmap while dragging
        self.pixmap = self.grab()
        self.drag.setPixmap(self.pixmap)

        self.hide()
        self.drag.exec(QtCore.Qt.MoveAction)
        self.show()


if __name__ == "__main__":
    app = QtWidgets.QApplication([])
    widget1 = DropFrame()
    label = DraggableLabel('Move me')
    widget1.layout().addWidget(label)
    widget1.show()

    widget2 = DropFrame()
    widget2.show()
    widget2.move(widget1.pos().x(),widget1.pos().y()+150)
    app.exec()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?