[英]Focus on GtkGlArea not getting captured
我的應用程序包含一個樹視圖,其中包含用戶可以單擊的文件。 根據文件,預覽區域將顯示適當的控件以顯示該文件。 對於一些呈現內容的GtkGlArea
文件。 它包括一個可以使用鍵盤和鼠標移動的相機。
單擊文件時,會發生以下情況(在GtkTreeView
的已changed
事件的事件處理程序內)
if (mActiveView->needsOpenGL()) {
gtk_widget_show(mGlControl);
gtk_widget_grab_focus(mGlControl);
} else {
gtk_widget_hide(mGlControl);
}
該mGlControl
使用創建GtkBuilder
,上面寫着我的格萊德UI模板。 該控件具有標志Visible
、 Can focus
、 Application paintable
、 Double Buffered
、 Sensitive
和事件Pointer Motion
、 Button Press
、 Button Release
、 Key Press
、 Key Release
、 Focus Change
、 Structure
但是,當在樹視圖中單擊一個元素時,焦點會停留在該項目上,當我使用鍵盤時,它會反映在樹視圖中(例如,使用向上箭頭選擇下一個項目)。
是否可以將重點放在 GtkGlArea 上?
事實證明,我在重新閱讀我發布的問題后的直覺是正確的。 似乎在樹視圖更改事件的事件處理程序中切換焦點不起作用。 我想事件鏈大概是這樣的:
單擊項目的焦點邏輯似乎是在發出更改事件后完成的。
我修改了我的代碼,如下所示:
if (mActiveView->needsOpenGL()) {
gtk_widget_show(mGlControl);
runInMainThread([this]() { gtk_widget_grab_focus(mGlControl); });
} else {
gtk_widget_hide(mGlControl);
}
這是一個方便的方法:
void MainWindow::runInMainThread(const std::function<void()> &callback) {
g_idle_add(callbacks::mainThreadCallback, new callbacks::FunctionHolder{callback});
}
並且應該在單擊事件處理之后延遲它,現在樹視圖項正確散焦。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.