PyQt:eventFilter,用于在半透明窗口中获取鼠标位置

PyQt:eventFilter,用于在半透明窗口中获取鼠标位置,qt,pyqt,Qt,Pyqt,我想提出: 半透明全屏窗口(rgba(0,0,0180)) 移动鼠标时,显示标签上的绝对位置 用户可以按它来获得鼠标的绝对位置 然而,我无法实现第二个目标。在标签上移动鼠标时,标签不会更新鼠标的位置。但我发现,当移出标签时(在删除layout.setMargin(0)和layout.setspace(0)之后),它可以工作 # -*- coding: utf-8 -*- import sys, os, math from PyQt4 import QtCore, QtGui class Scr

我想提出:

  • 半透明全屏窗口(
    rgba(0,0,0180)
  • 移动鼠标时,显示标签上的绝对位置
  • 用户可以按它来获得鼠标的绝对位置 然而,我无法实现第二个目标。在标签上移动鼠标时,标签不会更新鼠标的位置。但我发现,当移出标签时(在删除
    layout.setMargin(0)
    layout.setspace(0)
    之后),它可以工作

    # -*- coding: utf-8 -*-
    import sys, os, math
    from PyQt4 import QtCore, QtGui
    
    class ScreenPositionLabel(QtGui.QWidget):
        def __init__(self):
            super(ScreenPositionLabel, self).__init__()
    
            self.setStyleSheet("background-color:rgba(0, 0, 0, 180); color:#fff;")
            self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
            #self.setAttribute(QtCore.Qt.WA_OpaquePaintEvent, False)
            #self.setStyleSheet("QMainWindow{opacity:0.5;}")
    
            self.label = QtGui.QLabel("Please click on screen")
            self.label.setAlignment(QtCore.Qt.AlignCenter)
    
            layout = QtGui.QHBoxLayout()
            layout.addWidget(self.label)
    
            # remove margin and padding
            layout.setMargin(0)
            layout.setSpacing(0)
    
            self.setLayout(layout)
    
            self.setMouseTracking(True)
            self.installEventFilter(self)
    
            self.label.show()
            self.show()
    
        def eventFilter(self, source, event):
            if (event.type() == QtCore.QEvent.MouseMove and
                event.buttons() == QtCore.Qt.NoButton):
                    pos = event.pos()
                    self.label.setText('Please click on screen. ( %d : %d )' % (pos.x(), pos.y()))
            elif event.type() == QtCore.QEvent.MouseButtonPress:
                pos = event.pos()
                print('( %d : %d )' % (pos.x(), pos.y()))
                self.close()
            return QtGui.QWidget.eventFilter(self, source, event)
    
    app = QtGui.QApplication(sys.argv)
    
    main_window = ScreenPositionLabel()
    app.exec_()
    
    有办法解决这个问题吗?谢谢

    你的4个问题:

    1) 我想制作一个半透明的全屏窗口(rgba(0,0,0180))

    是的,你可以。请使用

    2) 我想做:移动鼠标时,显示标签上的绝对位置

    我建议使用
    QWidget.mouseMoveEvent(self,QMouseEvent)
    获取鼠标的当前位置,并启用
    QWidget.setMouseTracking(self,bool enable)
    跟踪所有鼠标移动

    3) 我想做的是:用户可以按下它来获得鼠标的绝对位置

    4) 然而,我无法实现第二个目标。在标签上移动鼠标时,标签不会更新鼠标的位置。但我发现,当移出标签时(在删除
    layout.setMargin(0)
    layout.setspace(0)之后)
    ,它可以工作

    # -*- coding: utf-8 -*-
    import sys, os, math
    from PyQt4 import QtCore, QtGui
    
    class ScreenPositionLabel(QtGui.QWidget):
        def __init__(self):
            super(ScreenPositionLabel, self).__init__()
    
            self.setStyleSheet("background-color:rgba(0, 0, 0, 180); color:#fff;")
            self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
            #self.setAttribute(QtCore.Qt.WA_OpaquePaintEvent, False)
            #self.setStyleSheet("QMainWindow{opacity:0.5;}")
    
            self.label = QtGui.QLabel("Please click on screen")
            self.label.setAlignment(QtCore.Qt.AlignCenter)
    
            layout = QtGui.QHBoxLayout()
            layout.addWidget(self.label)
    
            # remove margin and padding
            layout.setMargin(0)
            layout.setSpacing(0)
    
            self.setLayout(layout)
    
            self.setMouseTracking(True)
            self.installEventFilter(self)
    
            self.label.show()
            self.show()
    
        def eventFilter(self, source, event):
            if (event.type() == QtCore.QEvent.MouseMove and
                event.buttons() == QtCore.Qt.NoButton):
                    pos = event.pos()
                    self.label.setText('Please click on screen. ( %d : %d )' % (pos.x(), pos.y()))
            elif event.type() == QtCore.QEvent.MouseButtonPress:
                pos = event.pos()
                print('( %d : %d )' % (pos.x(), pos.y()))
                self.close()
            return QtGui.QWidget.eventFilter(self, source, event)
    
    app = QtGui.QApplication(sys.argv)
    
    main_window = ScreenPositionLabel()
    app.exec_()
    
    因为在默认布局高度下,QLabel具有间距和边距,所以实际面积并不是所有面积小部件都可以解决的,而是您的解决方案可以

    解决方案的完整示例:

    import sys
    from PyQt4 import QtGui, QtCore
    
    class QCustomLabel (QtGui.QLabel):
        def __init__ (self, parent = None):
            super(QCustomLabel, self).__init__(parent)
            self.setMouseTracking(True)
            self.setTextLabelPosition(0, 0)
            self.setAlignment(QtCore.Qt.AlignCenter)
    
        def mouseMoveEvent (self, eventQMouseEvent):
            self.setTextLabelPosition(eventQMouseEvent.x(), eventQMouseEvent.y())
            QtGui.QWidget.mouseMoveEvent(self, eventQMouseEvent)
    
        def mousePressEvent (self, eventQMouseEvent):
            if eventQMouseEvent.button() == QtCore.Qt.LeftButton:
                QtGui.QMessageBox.information(self, 'Position', '( %d : %d )' % (self.x, self.y))
            QtGui.QWidget.mousePressEvent(self, eventQMouseEvent)
    
        def setTextLabelPosition (self, x, y):
            self.x, self.y = x, y
            self.setText('Please click on screen ( %d : %d )' % (self.x, self.y))
    
    class QCustomWidget (QtGui.QWidget):
        def __init__ (self, parent = None):
            super(QCustomWidget, self).__init__(parent)
            self.setWindowOpacity(0.7)
            # Init QLabel
            self.positionQLabel = QCustomLabel(self)
            # Init QLayout
            layoutQHBoxLayout = QtGui.QHBoxLayout()
            layoutQHBoxLayout.addWidget(self.positionQLabel)
            layoutQHBoxLayout.setMargin(0)
            layoutQHBoxLayout.setSpacing(0)
            self.setLayout(layoutQHBoxLayout)
            self.showFullScreen()
    
    
    myQApplication = QtGui.QApplication(sys.argv)
    myQTestWidget = QCustomWidget()
    myQTestWidget.show()
    myQApplication.exec_()
    

    非常详细的解释~!