簡體   English   中英

專注於 GtkGlArea 未被捕獲

[英]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模板。 該控件具有標志VisibleCan focusApplication paintableDouble BufferedSensitive和事件Pointer MotionButton PressButton ReleaseKey PressKey ReleaseFocus ChangeStructure

但是,當在樹視圖中單擊一個元素時,焦點會停留在該項目上,當我使用鍵盤時,它會反映在樹視圖中(例如,使用向上箭頭選擇下一個項目)。

是否可以將重點放在 GtkGlArea 上?

事實證明,我在重新閱讀我發布的問題后的直覺是正確的。 似乎在樹視圖更改事件的事件處理程序中切換焦點不起作用。 事件鏈大概是這樣的:

  • 項目被點擊
  • 更改的事件被處理和委托 -> 焦點設置在 gl 控件上
  • 處理項目上的“單擊”事件 -> 將焦點設置在樹視圖項目上

單擊項目的焦點邏輯似乎是在發出更改事件后完成的。

我修改了我的代碼,如下所示:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM