#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