专注于未捕获的GtkGlArea

时间:2019-01-12 07:01:27

标签: c++ gtk3

我的应用程序包含一个树形视图,其中包含用户可以单击的文件。基于文件,预览区域将显示相应的控件以显示该文件。对于某些GtkGlArea呈现内容的文件。它包括一个可以使用键盘和鼠标移动的相机。

点击文件后,会发生以下情况(在changed的{​​{1}}事件的事件处理程序中)

GtkTreeView

if (mActiveView->needsOpenGL()) { gtk_widget_show(mGlControl); gtk_widget_grab_focus(mGlControl); } else { gtk_widget_hide(mGlControl); } 是使用mGlControl创建的,它读取了我的Glade UI模板。该控件具有标志GtkBuilderVisibleCan focusApplication paintableDouble Buffered和事件SensitivePointer Motion,{ {1}},Button PressButton ReleaseKey PressKey Release

但是,当在树状视图中单击某个元素时,焦点将停留在该项目上,而当我使用键盘时,该焦点将反映在树状视图中(例如,使用向上箭头选择下一个项目)。

是否可以将重点放在GtkGlArea上?

1 个答案:

答案 0 :(得分:0)

事实证明,重新阅读我的问题后我的直觉是正确的。似乎在树形视图更改事件的事件处理程序内切换焦点无效。我认为事件链可能是这样的:

  • 点击了项目
  • 已更改的事件得到处理和委托->将焦点设置在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});
}

并且应该在处理click事件之后将其延迟,现在树状视图项已适当散焦。