Возврат координат мыши относительно определённого окна после нажатия на кнопку
Подскажите пожалуйста способ определения координат мыши относительно определённого окна после нажатия на кнопку.
Т.е. нажимаем кнопку, затем идёт определение координат, после отпускания в определённом месте окна ЛКМ - координаты фиксируются, выводятся и на этом действие кнопки прекращается.
Больше она координаты определять не должна.
Пытался сделать как-то вот так:
import mouse
...
self.pushButton.clicked.connect(self.on_cursorPositionChanged)
def on_cursorPositionChanged(self):
mouse.on_click(lambda: self.mousePressEvent())
def mousePressEvent(self, event):
print('Mouse coords: ( %d : %d )' % (event.x(), event.y()))
Но оно работает постоянно и да, код выше не работает.
Для примера -
На самом деле вывод в консоль - для наглядности, а так после получения с ними будут проводиться другие манипуляции.
Ответы (1 шт):
Qt обнаруживает только щелчок внутри виджета, если вы хотите обнаруживать вне виджетов, тогда вы должны использовать другую библиотеку,
которая использует ресурсы ОС для мониторинга событий ОС, например pynput.
import sys
from pynput import mouse # pip install pynput
from PyQt5 import QtCore, QtGui, QtWidgets
class ButtonReleaseManager(QtCore.QObject): # !!!
released = QtCore.pyqtSignal(int, int)
def __init__(self, parent=None):
super().__init__(parent)
self._listener = mouse.Listener(on_click=self._handle_click)
self._listener.start()
def _handle_click(self, x, y, button, pressed):
if not pressed:
self.released.emit(x, y)
class MainWindow(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowFlags(self.windowFlags() | QtCore.Qt.WindowStaysOnTopHint)
self.setGeometry(500, 500, 400, 100)
self.textEdit = QtWidgets.QTextEdit()
self.pushButton = QtWidgets.QPushButton('Click me')
self.pushButton.clicked.connect(self.func_connect)
grid = QtWidgets.QGridLayout(self)
grid.setSpacing(10)
grid.addWidget(self.textEdit)
grid.addWidget(self.pushButton)
def func_connect(self):
self.manager = ButtonReleaseManager() # !!!
self.manager.released.connect(self.show_position) # !!!
self.pushButton.setEnabled(False)
@QtCore.pyqtSlot(int, int)
def show_position(self, x, y):
screen_coordinate = f"x:{x}, y:{y}"
self.textEdit.setText(screen_coordinate)
self.manager.released.disconnect() # !!!
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
Update
Мне вот именно внутри виджет нужно координаты определить т.к. это влияет на правильность постановки внутри виджета
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
class Label(QtWidgets.QLabel):
def __init__(self, parent):
super().__init__()
self.parent = parent
def mousePressEvent(self, event):
print(f'def mousePressEvent(self, event): {event.pos()}')
def mouseMoveEvent(self, event):
if (event.buttons() == Qt.LeftButton):
print(f'def mouseMoveEvent(self, event): {event.pos()}') #
def mouseReleaseEvent(self, event):
if event.button() == Qt.LeftButton and self.parent.flag:
self._pos = event.pos()
print(f'def mouseReleaseEvent(self, event): {event.pos()} <----')
self.parent.label_pos.setText(
f"<b style='color: #fff'>.</b> x:{self._pos.x()}, y:{self._pos.y()}")
self.parent.label_pos.move(self._pos.x(), self._pos.y())
self.parent.label_pos.adjustSize()
self.parent.flag = False
class MainWindow(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.flag = False
self.label = Label(self)
self.label.setFixedSize(570, 316)
self.label.setPixmap(QtGui.QPixmap("image1.png"))
self.label_pos = QLabel(self.label)
self.pushButton = QtWidgets.QPushButton('Add', self.label)
self.pushButton.move(10, 10)
self.pushButton.clicked.connect(self.func_connect)
grid = QtWidgets.QGridLayout(self)
grid.addWidget(self.label)
def func_connect(self):
self.flag = True
self.pushButton.setEnabled(False)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())


