2014-09-12 17 views
1

최상위 부모없는 QWidget이 있는데 그 위에 다른 QWidgets (예 : QPushButton)이 있습니다. 내 QWidget 동작을 마우스 이벤트와 같이 투명하게 보이게 만들고 싶습니다. 따라서 내 버튼이 아닌 QWidget을 클릭하면 내 창에서 포커스를 잃고 뒤쪽에서 뭔가를 선택해야합니다 (예 : 내 창 뒤쪽에있는 경우 Windows 탐색기 창). 또한 QPushButton에서 마우스 이벤트 처리를 계속하고 싶습니다.QWidget 클릭 이벤트를 무시하고 OS에 전파하십시오.

이것이 가능합니까? 위젯에서 Qt::WA_TranslucentBackgroundQt::WA_TransparentForMouseEvents을 설정하려고했지만 그 위에 무언가를 그립니다. QGraphicsDropShadowEffect 위젯은 여전히 ​​QGraphicsDropShadowEffect이 그려지는 부분에서 마우스 클릭 이벤트를 처리합니다.

이것이 가능합니까?

감사합니다.

+0

어떤 Qt 버전인가? , 그리고 어떤 플랫폼? 지난번에 제가 확인한 바에 따르면,'WA_TransparentForMouseEvents'는 위젯 계층 내에서만 동작했고 어떤 마우스 이벤트도 "뒤로"운영체제로 전달하지 않았습니다. –

답변

1

해결책을 찾았습니다. 내 경우에 this는 QMainWindow에 대한 포인터입니다. 주요 아이디어 : 클릭 잡아 globalPos을 얻고 창을 숨기고 OS를 클릭하십시오. 하지만 그것은 OS 고유의 코드 여야하며, Windows에서 작동하는 예제를 제공 할 수 있습니다. eventFilter을 작성해야합니다 (이 방법을 알고 있으면 다음 코드 게시).

bool MainWindow::eventFilter(QObject *obj, QEvent *event) 
{ 
    if(obj == this && event->type() == QEvent::MouseButtonRelease) 
    { 
     qDebug() << "mouse"; 
     QMouseEvent *mouse = static_cast<QMouseEvent*>(event); 
     qDebug() << mouse->globalPos(); 
     QPoint point = mouse->globalPos(); 
     this->hide(); 
     //start of OS specific code 
     mouse_event(MOUSEEVENTF_LEFTDOWN,point.x(),point.y(),0,0); 
     mouse_event(MOUSEEVENTF_LEFTUP,point.x(),point.y(),0,0); 
     mouse_event(MOUSEEVENTF_LEFTDOWN,point.x(),point.y(),0,0); 
     mouse_event(MOUSEEVENTF_LEFTUP,point.x(),point.y(),0,0); 
     //this->show();//as you want 
    } 

return QObject::eventFilter(obj, event); 
} 

예를 들어, 윈도우가 숨겨져 doubleclick을 에뮬레이션합니다. 내 컴퓨터에서 나는 QMainWindow을 무시하고 닫은 그림은 QMainWindow (나는 그것을 볼 수 없었고, 나는 내 QMainWindow 만 보았지만 클릭은 무시되었고 우리는이 클릭을 OS로 보냈다)

+0

좋은, 고마워! –