Легкое положение мыши при щелчке или щелчке и перетаскивании

#python #python-3.x #pyside2

#python #python-3.x #pyside2

Вопрос:

Мне нужна какая-то визуальная обратная связь с положением мыши, когда на нее нажимают или щелкают и перетаскивают в пределах виджета или прямоугольной области. Визуальная обратная связь должна оставаться там, где отпущена мышь. Я сделал что-то вроде следующего, но это не совсем то, что я собираюсь делать:

 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() amp; 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)
  

чтобы он отображался в центре, что очень непоследовательно.

Визуальная обратная связь должна оставаться в пределах виджета или области и не выходить за пределы, когда это делает мышь. Опять же, я мог бы обойти это с помощью нескольких строк непоследовательного кода (поскольку я не эксперт).

Я искал что-то, что может помочь мне в достижении этого, и лучшее, с чем я столкнулся, — это установить pyqtgraph. Но я сомневаюсь, что для этого потребуется больше ресурсов, и добавление новой библиотеки усложнит мне задачу. Или это мой лучший выбор?

Изображение ниже показывает нечто подобное.

Выбор цвета

Ответ №1:

Как указано в сообщении, достаточно учитывать геометрию перетаскиваемого элемента и окна:

 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() amp; 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_())
  

Комментарии:

1. Это единственный способ; обновить положение виджета? Что-то похожее я обнаружил, так это то, как эти средства выбора цвета позволяют перемещать дескриптор внутри области для выбора цвета. Я не смог найти никаких источников, чтобы узнать об этом. Или это что-то подобное?

2. @x0_0x Я тебя не понимаю, объясни лучше сам

3. Я обновил вопрос тем, о чем я говорил.

4. @x0_0x ммм, нигде в своем посте вы не указываете, что хотите 2 пересекающиеся линии, или вы думаете, что мы предсказатели? Вы только указали, что в вашем решении у вас были некоторые недостатки, которые мой ответ явно устраняет.

5. Я не говорю о двух строках, пересечение линий показывает координаты мыши. Этот метод кажется гораздо более последовательным, чем то, что я делал.

Ответ №2:

Поиск названия места, куда я перетаскиваю мышь в 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