Всем спасибо за ответы! Особенно Alex03.
Действительно, флаг Qt::WA_TransparentForMouseEvents делает окно прозрачным для кликов мышки. Но MouseMove не проходит, да и курсор отображается не нижнего окошка. Покопавшись в исходных кодах Qt, стало понятно, что Qt::WA_TransparentForMouseEvents делает окно незаметным для функции QApplication ::widgetAt(). Это делает задачу поиска нижележащего окошка довольно простой.
Если точно знать название класса тени, то можно перекрыть функцию QApplication::notify(), и в ней перераспределить сообщения. Теперь наше окошко действительно "прозрачное".
bool CMyApp::notify ( QObject * receiver, QEvent * event )
{
if (receiver->inherits("CShadowWidget")) // сообщение пришло тени
{
if (event->type() == QEvent::MouseMove) // и по ней двигается мышка
{
QPoint p = ((QMouseEvent*)event)->globalPos();
QWidget* newReceiver = widgetAt(p); // найдём того, кто лежит под тенью
if (newReceiver) // а таки лежит
{
((QWidget*)receiver)->setCursor(newReceiver->cursor()); // поставим на тени курсор от ниже лежащего
receiver = newReceiver; // переправим событие нижележащему
}
}
}
return QApplication::notify(receiver,event);
}