2012-07-19 3 views
1

QDialog를 상속받은 대화 상자가 있습니다. 대화 상자에는 Qbuttons, QLabel, QGraphicsView 등을 포함한 많은 위젯이 있습니다. 버튼과 같은 많은 위젯은 포커스를받을 때 SPACE 키 누름 이벤트를 처리 할 수 ​​있습니다. 이제 나는 자식 위젯이 그것을 처리하는 것을 원하지 않지만, 메인 대화 상자는 그렇게하겠습니다. 메인 대화 상자에는 많은 위젯이 있으므로 intallEventFilter를 사용하지 않고 qApp를 사용했습니다. 다음과 같은자식 위젯 대신 키 이벤트를 처리하는 Qt 대화 상자를 만드는 방법은 무엇입니까?

코드 :

QApplication app(argc, 0); 
MyDialog *pDlg = new MyDialog(...); 
qApp->installEventFilter(pDlg); 
app.exec(); 

그리고 기본 대화 상자의 eventfilter는 :

bool MyDialog::eventFilter(QObject *obj, QEvent *e) 
{ 
    if(e->type() == QEvent::KeyPress) 
    { 
     QKeyEvent *ke = static_cast<QKeyEvent*>(e); 
     if (ke->key == Qt::Key_Space && !ke->isAutoRepeat()) 
     { 
      // do my things in the main dialog 
      return true; 
     } 
    } 
    return qApp->eventFilter(watched, event); 
} 

불행하게도,이 코드를 사용 후, 주 대화 상자의 레이아웃은 호기심, 일부 위젯이 기억하지 않은 것 같습니다 자신의 크기 정책. 어쩌면 일부 Qt의 크기를 조정하거나 다시 칠하는 이벤트가 처리되지 않았을 수 있습니까? 어떤 사람이 주 대화 상자에서 키 이벤트를 잡는 방법을 알려줄 수 있습니까? 그러나 다른 기능에는 영향을주지 않습니까?

답변

0

기본적으로 Qt에서 대화 상자 기반 응용 프로그램을 개발하는 경우 기본 키 누르기 이벤트는 주 대화 상자 클래스에 의해 캡처됩니다 (주 클래스에서 keypressevent를 정의한 경우).

편집 사용 postevent() 자녀에이 목적

에 대한 키를 눌러 이벤트가 마찬가지로 당신은 또한 주요 이벤트의 다른 유형을 처리 할 수 ​​

void childwdgt::keyPressEvent(QKeyEvent *e) 
{ 
if (e->type() == QEvent::KeyPress) 
{ 
    { 
     QKeyEvent* newEvent = new QKeyEvent(QEvent::KeyPress,e->key(), e->modifiers()); 
     qApp->postEvent (yourParentWdgt, newEvent, 0); 
    } 
} 

을 위젯.

+0

위젯 (예 : 버튼)이 포커스를 얻은 다음 키를 누르면 포커스가있는 위젯의 keyPress 이벤트가 호출되고 해당 부모를 처리하지 않습니다. 아마도 qApp가 올바른 대상 (집중 위젯)으로 이벤트를 보냅니다. – Royt

+0

나는 내 대답을 편집하고 그것을 확인했다. – ScarCode

+0

답장을 보내 주셔서 감사합니다. 어린이 위젯의 ​​이벤트 처리 메소드를 덮어 쓰거나 이벤트 필터가 설치할 수 있도록 설치하십시오. 하지만 주된 딜록에서는 많은 위젯이 있으므로 많은 코드가 작성되고 구조가 좋지 않습니다. 나는 모든 사건들이 파견 될 준비가되어있는 핵심 사건을 처리해야한다고 생각한다. – Royt