整个屏幕上的鼠标释放事件 [英] mouse release event on entire screen

查看:44
本文介绍了整个屏幕上的鼠标释放事件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 pyqt 小部件,它在启动时显示在所有窗口上.在用户决定之前,我需要它保持未关闭状态.是否可以在每次执行 mouseclick 时捕获鼠标释放事件,无论在何处执行:QtWidget 窗口内部或外部?

I have a pyqt widget that is shown over all windows when launched. I need it to keep unclosed until user decides to. Is that possible to catch mouse release event every time mouseclick performed no matter where it was done: inside QtWidget window or outside of it?

这是我使用的示例:

class Release_check(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()


    def initUI(self):
        self.canvas = iface.mapCanvas()
        self.setWindowFlags(self.windowFlags() | QtCore.Qt.WindowStaysOnTopHint)
        self.grid = QGridLayout()
        self.grid.setSpacing(10)
        self.setGeometry(500, 500, 400, 100)

        self.text_out = QTextEdit()

        self.setLayout(self.grid)
        self.grid.addWidget(self.text_out, 0, 1, 1, 2)

        self.show()


    def mouseReleaseEvent(self, e):
        screen_coordinate = f"x:{e.x()}, y:{e.y()}"
        self.text_out.setText(screen_coordinate)
        super(Release_check, self).mouseReleaseEvent(e)


app = Release_check()

推荐答案

Qt 只检测小部件内部的点击,如果要检测小部件外部,则必须使用另一个使用 OS 资源来监视 OS 事件的库,例如pyinput:

Qt only detects the click inside the widget, if you want to detect outside the widgets then you must use another library that uses OS resources to monitor OS events such as pyinput:

import sys
from pynput import mouse
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 Release_check(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
        self.manager = ButtonReleaseManager()
        self.manager.released.connect(self.show_position)

    def initUI(self):
        self.setWindowFlags(self.windowFlags() | QtCore.Qt.WindowStaysOnTopHint)
        self.setGeometry(500, 500, 400, 100)

        self.text_out = QtWidgets.QTextEdit()

        grid = QtWidgets.QGridLayout(self)
        grid.setSpacing(10)
        grid.addWidget(self.text_out, 0, 1, 1, 2)

    @QtCore.pyqtSlot(int, int)
    def show_position(self, x, y):
        screen_coordinate = f"x:{x}, y:{x}"
        self.text_out.setText(screen_coordinate)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    w = Release_check()
    w.show()
    sys.exit(app.exec_())

这篇关于整个屏幕上的鼠标释放事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆