La solución más fácil (si es aplicable) es establecer WA_TransparentForMouseEvents
dependiendo de su condición de clics.
Por ejemplo, si desea hacer clic a través de ciertas regiones de Child-A, puede usar su mouseMoveEvent()
para verificar si WA_TransparentForMouseEvents
necesita establecerse o no. A continuación, haga clic en eventos que pasan automáticamente.
Si no puede determinar si un evento de clic debe ser aceptado antes de que realmente se ha activado, se puede hacer algo como esto:
void ChildA::mousePressEvent(QMouseEvent* event) {
const bool accepted = ...; //insert custom logic here
if (accepted) {
... //handle event here
} else {
//not accepting event -> resend a copy of this event...
QMouseEvent* eventCopy = new QMouseEvent(*event);
QApplication::instance()->postEvent(eventCopy);
//...but this time, ignore it
setAttribute(Qt::WA_TransparentForMouseEvents, true);
QTimer::singleSlot(1, this, SLOT(resetClickTransparency()));
//don't propagate original event any further
event->accept();
}
}
void ChildA::resetClickTransparency() { //slot
setAttribute(Qt::WA_TransparentForMouseEvents, false);
}
responsabilidad: Todo esto anotado por el corazón después de un año de no hacer Qt, por favor corrígeme por nombre o tipo de errores.
¿Puede establecer la opción "pasar todo" y volver a enviar el evento del mouse desde el controlador de eventos del mouse? Después de que el evento se haya completado, configúralo como falso nuevamente. Podría causar una recursión infinita. Tal vez debería instalar un filtro de eventos en la ventana principal para el niño A, intente si A gestiona el evento; si no, verifique si está en el área del niño B y, de ser así, páselo a eso. Esto debería funcionar, pero podría ser un poco complicado. De lo contrario, vería la posibilidad de que A sepa B y sea capaz de pasarle eventos. – 0xbaadf00d
Al buscar el código fuente de Qt, 'QWidgetPrivate :: childAtRecursiveHelper' encuentra un elemento secundario correspondiente (filtrando aquellos con' WA_TransparentForMouseEvents' y luego llama al controlador de eventos del niño pero esta llamada ocurre fuera del método de búsqueda de niños por lo que la única solución parece administrar el clic Oportunidades a mano del padre ... – gaspard