我的应用程序包含一个树形视图,其中包含用户可以单击的文件。基于文件,预览区域将显示相应的控件以显示该文件。对于某些GtkGlArea
呈现内容的文件。它包括一个可以使用键盘和鼠标移动的相机。
点击文件后,会发生以下情况(在changed
的{{1}}事件的事件处理程序中)
GtkTreeView
if (mActiveView->needsOpenGL()) {
gtk_widget_show(mGlControl);
gtk_widget_grab_focus(mGlControl);
} else {
gtk_widget_hide(mGlControl);
}
是使用mGlControl
创建的,它读取了我的Glade UI模板。该控件具有标志GtkBuilder
,Visible
,Can focus
,Application paintable
,Double Buffered
和事件Sensitive
,Pointer Motion
,{ {1}},Button Press
,Button Release
,Key Press
,Key Release
但是,当在树状视图中单击某个元素时,焦点将停留在该项目上,而当我使用键盘时,该焦点将反映在树状视图中(例如,使用向上箭头选择下一个项目)。
是否可以将重点放在GtkGlArea上?
答案 0 :(得分:0)
事实证明,重新阅读我的问题后我的直觉是正确的。似乎在树形视图更改事件的事件处理程序内切换焦点无效。我认为事件链可能是这样的:
发布更改事件后,似乎完成了单击项目的焦点逻辑。
我修改了代码,使其看起来像这样:
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});
}
并且应该在处理click事件之后将其延迟,现在树状视图项已适当散焦。