python-3.x 单击或单击并拖动时高亮显示鼠标位置

t3irkdon  于 2022-12-15  发布在  Python
关注(0)|答案(2)|浏览(141)

当鼠标在一个小部件或矩形区域内被点击或点击并拖动时,我需要某种鼠标位置的视觉反馈。视觉反馈应该停留在鼠标被释放的地方。我做了类似下面的事情,但这并不是我要做的:

import sys
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *

class test(QLabel):
    def __init__(self):
        super(test, self).__init__()
        self.setMouseTracking(True)
        self.resize(300, 300)

        self.handle = QPushButton()
        self.handle.setFixedSize(15, 15)
        self.handle.setParent(self)
        self.handle.setText("+")
        self.handle.setStyleSheet("background: none;"
                                  "border: 1px solid;"
                                  "border-radius: 7px;")

    def mousePressEvent(self, pos):
        if pos.button() == Qt.LeftButton:
            self.handle.move(pos.x(), pos.y())
            print(str(pos.x()) + ", " + str(pos.y()))

    def mouseMoveEvent(self, pos):
        if pos.buttons() & Qt.LeftButton:
            self.handle.move(pos.x(), pos.y())
            print(str(pos.x()) + ", " + str(pos.y()))

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    t = test()
    t.show()
    sys.exit(app.exec_())

以上代码的问题是:
按钮的位置是从其左上角开始计算的,因此我必须执行如下操作

self.handle.move(pos.x() -7, pos.y() -7)

使它出现在中间,这是非常不一致的。
视觉反馈应该停留在窗口部件或区域内,而不是在鼠标超出边界时超出边界。同样,我可以用几行不一致的代码来解决这个问题(因为我不是Maven)。
我一直在寻找一些可以帮助我实现它的东西,我遇到的最好的事情是安装pyqtgraph。但我怀疑这是否会占用更多的资源,添加一个新的库会使事情复杂化。或者这是我最好的选择?
下图显示了类似的情况。

a6b3iqyw

a6b3iqyw1#

正如文章中所指出的,考虑拖动元素和窗口的几何形状就足够了:

import sys

from PySide2.QtCore import Qt
from PySide2.QtWidgets import QApplication, QLabel

class TestLabel(QLabel):
    def __init__(self):
        super(TestLabel, self).__init__()
        self.setMouseTracking(True)
        self.resize(300, 300)

        self.handle = QLabel(self)
        self.handle.setFixedSize(15, 15)
        self.handle.setText("+")
        self.handle.setStyleSheet("border: 1px solid;" "border-radius: 7px;")

    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton and self.rect().contains(event.pos()):
            self.handle.move(event.pos() - self.handle.rect().center())

    def mouseMoveEvent(self, event):
        if event.buttons() & Qt.LeftButton and self.rect().contains(event.pos()):
            self.handle.move(event.pos() - self.handle.rect().center())

if __name__ == "__main__":
    import sys

    app = QApplication(sys.argv)
    t = TestLabel()
    t.show()
    sys.exit(app.exec_())
66bbxpm5

66bbxpm52#

在pyqt中查找拖动鼠标的位置的名称

释放鼠标的位置

def dropEvent(self, event):   # Drag and Drop in Camera View
        
        mimeData = QtCore.QMimeData()

        format = 'application/x-qabstractitemmodeldatalist'
       
        name_str = codecs.decode(data,'utf-8')

        if mimeData.hasText:
           
            destination = self.childAt(event.pos()) # position where mouse is released
            destination.objectName()                # object name where mouse is released

相关问题