2011-05-13 2 views
4

주로 MacOS에서 개발 된 Qt 응용 프로그램에서 작동하지만 Linux에서도 빌드 및 테스트됩니다.위젯 포커스 탐색을 위해 화살표 키를 캡처하는 Linux에서 Qt의 동작을 비활성화하려면 어떻게합니까?

주 키보드 클래스에서 keyPressEvent() 메서드를 정의하여 특정 키보드 이벤트에 응답합니다. 그 중에서도 Qt :: Key_Left, Qt :: Key_Right 및 Qt :: Key_Space에 응답합니다. 이것은 MacOS에서 잘 작동합니다. 그러나 Linux에서는 이러한 이벤트가 발생하지 않습니다.

Google 검색 중 일부 (Linux에서 응용 프로그램의 동작과 함께 확인)를 사용하는 이유는 Qt가 이러한 키를 응용 프로그램의 GUI에서 단추 위젯의 키보드 탐색에 사용하기 때문인 것으로 보입니다. 리눅스에서 화살표 키를 누르면 모든 활성화 된 버튼 위젯을 순서대로 선택합니다. 스페이스 바를 클릭하면 현재 선택된 버튼이 눌러집니다.

내가 지금까지 검색 할 수 있었던 것은 단추를 이벤트를 무시하고 함께 전달함으로써이 동작을 피하기 위해 하위 단추를 지정하거나 특정 단추에 필터를 적용하는 방법에 대한 제안입니다. 그러나 나는 GUI에 넣은 버튼 위젯마다이 작업을 수행하고 싶지 않습니다. 그것은 절름발이입니다.

이 동작을 전역 적으로 사용하지 않도록 설정하고 내 앱 코드에서 실제로 모든 화살표 키 및 스페이스 바 이벤트를 가져올 수있는 방법이 있습니까?

+0

이것이 Qt의 경우에도 해당되는지 확인할 수 있습니까? Key_PageUp Qt :: Key_PageDown? – BrianTheLion

답변

2

이 이벤트를 잡기 위해 전역 이벤트 수신기 추가를 설정할 수 있습니다. 윈도우 생성자에서

:

QApplication::instance()->installEventFilter(this); 

윈도우의 eventFilter 방법에있어서 : 당신이 이벤트를 처리 한 경우

bool MainWindow::eventFilter(QObject *object, QEvent *event) { 
    if (event->type() == QEvent::KeyPress) { 
    QKeyEvent* key_event = static_cast<QKeyEvent*>(event); 
    qDebug() << "key" << key_event->key() << "object" << object; 
    //... 
    } 
    return false; 
} 

,이 기능에서 true를 반환해야합니다. 변수의 object을 사용하여 이벤트 소스를 찾을 수 있습니다. 예를 들어, QPushButton이 될 수 있습니다. 필요한 경우이 버튼이 기본 창의 하위 항목인지 확인할 수 있습니다 (여러 개의 상위 창이있는 경우).

또 다른 방법은 버튼의 초점을 완전히 비활성화하는 것입니다. 버튼 'focusPolicyNoFocus으로 설정하십시오. 그런 다음 핵심 이벤트를 포착하지 않습니다.

또한 QPushButton을 서브 클래스 화하고 keyPressEvent을 빈 구현으로 다시 구현할 수 있습니다.