es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

PyQt5: al cerrar la ventana al hacer clic derecho, también envía el evento a la aplicación que se encuentra debajo.

Tengo esta aplicación en la que estaba intentando cerrar la ventana en el evento de clic derecho, aunque el evento funciona y mi ventana se cierra, el clic derecho también se envía a la aplicación que está debajo de mi aplicación de Python y, por lo tanto, se abre un menú contextual (si está presente) para esa aplicación.

Por ejemplo, si tengo la pantalla del escritorio de Windows debajo de mi aplicación de Python, se abrirá el menú contextual de Windows.

Esto es lo que he intentado:

from PyQt5 import QtWidgets as qtw
from PyQt5 import QtCore as qtc
from PyQt5 import QtGui as qtg
import sys

class MainWindow(qtw.QMainWindow): 

    def __init__(self, *arg, **kwargs):
        super().__init__(*arg, **kwargs)

        self.setWindowFlag(qtc.Qt.FramelessWindowHint)
        self.setAttribute(qtc.Qt.WA_TranslucentBackground)
        self.setGeometry(100, 100, 400, 300)
        self.showFullScreen()
        self.setAttribute(qtc.Qt.WA_NoMousePropagation)

        self.show()

    def paintEvent(self, event):
        qp = qtg.QPainter(self)
        qp.setPen(qtg.QPen(qtc.Qt.blue, 1))
        qp.drawRect(self.rect())

        qp.setOpacity(0.01)
        qp.setPen(qtc.Qt.NoPen)
        qp.setBrush(self.palette().window())
        qp.drawRect(self.rect())

    # cerrar al hacer clic derecho
    def mousePressEvent(self, QMouseEvent):
        if QMouseEvent.button() == qtc.Qt.LeftButton:
            print("Se ha hecho clic en el botón izquierdo")
        elif QMouseEvent.button() == qtc.Qt.RightButton:
            self.close()

if __name__ == '__main__':
    app = qtw.QApplication(sys.argv)
    w = MainWindow()
    sys.exit(app.exec_())

He intentado usar WA_NoMousePropagation, pero eso tampoco funciona.

Sistema operativo: Windows 10
PyQt5==5.15.6
PyQt5-Qt5==5.15.2
PyQt5-sip==12.9.0

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Problema con la aplicación Python PyQt5

    Si tienes una aplicación que intenta cerrar una ventana al hacer clic derecho, pero el clic derecho también se envía a la aplicación que se encuentra debajo de tu aplicación Python, puedes intentar usar setMouseTracking(True) y setFocusPolicy(qtc.Qt.NoFocus) en tu método __init__:

        def __init__(self, *arg, **kwargs):
            super().__init__(*arg, **kwargs)
    
            # ...
    
            self.setMouseTracking(True)
            self.setFocusPolicy(qtc.Qt.NoFocus)
    
            self.show()
    

    Además, puedes intentar usar setWindowFlags(qtc.Qt.WindowStaysOnTopHint) para mantener tu aplicación en la parte superior de todas las demás ventanas:

        def __init__(self, *arg, **kwargs):
            super().__init__(*arg, **kwargs)
    
            # ...
    
            self.setWindowFlags(qtc.Qt.WindowStaysOnTopHint) 
            self.setMouseTracking(True)
            self.setFocusPolicy(qtc.Qt.NoFocus)
    
            self.show()
    

    Puedes experimentar con estas soluciones para ver cuál funciona mejor para tu caso de uso particular.

Comments are closed.