2014-09-11 53 views
1

我正在通過重載void keyPressEvent (QKeyEvent* eventPtr)方法來處理窗口小部件中的按鍵事件。按鍵事件僅由應用程序的一個實例處理

問題是,當我啓動我的應用程序的兩個實例(來自Qt Creator)時,只有其中一個實際處理按鍵事件。即使我專注於第二個窗口,它也不會收到事件。當我把重點放在第一個實際上確實收到事件。

當兩個應用程序啓動時,所有其他功能都可以正常工作。

這是一個預期的行爲或一個已知的問題,或者我錯過了什麼?

UPD:我發現一些按鍵(例如字母)實際上被兩個窗口接收。但只有一個窗口收到箭頭鍵按下。當我創建一個我的小部件的實例時,我會調用它的widget->setFocus()。這使小部件接收箭頭按鍵。但是,當這個應用程序的兩個實例啓動時,這不起作用。

也許我應該使用事件過濾器呢?

+0

你怎麼知道第二個應用程序沒有收到事件? – vahancho 2014-09-11 08:09:09

+0

@vahancho'keyPressEvent'中的代碼僅在應用程序的一個實例中執行。 – Kolyunya 2014-09-11 08:12:37

+0

@vahancho我也可以在調試器中看到,由於沒有達到斷點,控件沒有重新執行'keyPressEvent'。 – Kolyunya 2014-09-11 08:17:38

回答

1

由於您沒有提供我不是100%肯定這是你的問題的原因,但是如果你開始的QtCreator兩個實例,qDebug()不會產生在QtCreator二審任何輸出的任何代碼。
如果你使用那個(或者可能是cout/printf),那麼試着在keyPressEvent處理器中做一些你可以在應用中看到的東西,比如改變背景顏色或者顯示一個消息框。

除非您安裝了全局密鑰鉤子,並且您的keyPressEvent處理程序消耗了所有的關鍵事件,否則一個應用程序將無法消除具有焦點的應用程序的事件。

1

從Qt Creator運行程序時,您可以在Qt Creator的「應用程序輸出」窗口中看到來自qDebug的消息。但是,如果您以這種方式運行多個程序,同時只有一個程序將被附加在那裏輸出其消息。

你可以做的是從Qt Creator運行一個,第二個從命令行使用cmd.exe(Windows)或Terminal.app(OSX)運行。這樣,第二個程序將在命令或終端程序窗口中輸出其qDebug消息。

+0

應用程序的兩個實例確實有效地將調試信息打印到'qtcreator_process_stub'中,所以這不是問題。我還發現,兩個窗口都收到了一些按鍵。問題是隻能通過一個窗口接收箭頭按鍵。我已經更新了這個問題。 – Kolyunya 2014-09-11 08:56:52

+0

我假設你使用的是Windows。在OSX上,我從來沒有2個應用程序將調試信息打印到Qt的控制檯。至於你的問題,我認爲我們需要看到更多的代碼來確定問題。我懷疑這跟調用widget-> setFocus有什麼關係 – TheDarkKnight 2014-09-11 09:02:50

相關問題