2014-09-11 10 views
1

void keyPressEvent (QKeyEvent* eventPtr) 메서드를 오버로드하여 위젯에서 키 눌림 이벤트를 처리하고 있습니다.키 누름 이벤트는 응용 프로그램의 한 인스턴스에서만 처리됩니다.

문제는 Qt Creator에서 내 응용 프로그램의 두 인스턴스를 시작하면 그 중 하나만 효과적으로 키 눌림 이벤트를 처리한다는 것입니다. 두 번째 창에 초점을 맞춘 경우에도 이벤트가 수신되지 않습니다. 처음에 초점을 맞추면 실제로 이벤트가 수신됩니다.

두 개의 응용 프로그램이 시작될 때 다른 모든 기능이 정상적으로 작동합니다.

예상되는 동작입니까? 알려진 문제입니까? 아니면 뭔가 빠졌습니까?

UPD : 일부 키 누름 (예 : 글자)이 실제로 두 창에서 모두 수신됨을 알았습니다. 그러나 하나의 창만 화살표 키를 누릅니다. 위젯의 인스턴스를 만들 때 widget->setFocus()을 호출합니다. 그러면 위젯이 화살표 키를 누를 수 있습니다. 그러나 응용 프로그램의 두 인스턴스가 시작될 때 작동하지 않습니다.

아마 대신 이벤트 필터를 사용해야합니까?

+0

두 번째 응용 프로그램이 이벤트를받지 못한다는 것을 어떻게 알 수 있습니까? – vahancho

+0

@vahancho'keyPressEvent' 내부의 코드는 애플리케이션의 한 인스턴스에서만 실행됩니다. – Kolyunya

+0

@vahancho 또한 중단 점에 도달하지 않았기 때문에 컨트롤이'keyPressEvent'를 다시 얻지 않는다는 것을 디버거에서 볼 수 있습니다. – Kolyunya

답변

1

당신은 내가이 문제의 원인이지만 QtCreator의 두 인스턴스를 시작하는 경우, qDebug()QtCreator의 두 번째 인스턴스의 모든 출력을 생성하지 않습니다 100 % 확실하지 않다 코드를 제공하지 않은 것처럼.
이것을 사용하는 경우 (또는 아마도 cout/printf), 배경색을 변경하거나 메시지 상자를 표시하는 것과 같이 응용 프로그램에서 볼 수있는 keyPressEvent 처리기에서 처리하십시오.

전역 키 후크를 설치하고 keyPressEvent 처리기가 모든 키 이벤트를 가져 오지 않는 한 한 응용 프로그램이 포커스가있는 응용 프로그램의 이벤트를 먹는 방법은 없습니다.

1

Qt Creator에서 프로그램을 실행하면 Qt Creator의 "Application Output"창에서 qDebug의 메시지를 볼 수 있습니다. 그러나이 방법으로 하나 이상의 프로그램을 실행하는 경우 동시에 하나의 메시지 만 첨부하여 메시지를 출력 할 수 있습니다.

Qt Creator에서 실행하고 cmd.exe (Windows) 또는 Terminal.app (OSX)를 사용하여 명령 줄에서 실행할 수 있습니다. 이렇게하면 두 번째 프로그램은 명령 또는 터미널 프로그램 창에서 qDebug 메시지를 출력합니다.

+0

입니다. 응용 프로그램의 두 인스턴스는'qtcreator_process_stub'에 디버그 정보를 효과적으로 출력하므로 문제가되지 않습니다. 또한 몇몇 키 누름이 두 창에서 모두 수신됨을 알았습니다.문제는 화살표 키 누름이 하나의 창에서만 수신된다는 것입니다. 질문을 업데이트했습니다. – Kolyunya

+0

Windows를 사용하고 있다고 가정합니다. OSX에서 Qt의 콘솔에 디버그 정보를 출력하는 응용 프로그램이 두 가지 없었습니다. 문제에 관해서는 문제를 식별하는 데 더 많은 코드가 필요하다고 생각합니다. 나는 widget-> setFocus를 호출하는 것과 아무 상관이 없다. – TheDarkKnight