Qt分层小部件开关焦点

时间:2019-01-15 17:58:01

标签: c++ qt widget

我正在处理一个项目,该项目由一个大的小部件组成,该小部件具有子级小部件的集合。这些子小部件中的两个名为“文件资源管理器”和“项目资源管理器”。

由于项目的性质,这些小部件可以彼此层叠,从而使Qt自动标记这些小部件,使用户有机会选择其中一个小部件。

示例:

Layered Widgets

我想要一段代码来切换这两个小部件中的哪一个在顶部。由于我主要从事工作,因此每个对象都被声明为指向相关小部件的指针。

我尝试过:

mFileExplorer->setFocus();
mFileExplorer->raise();
mFileExplorer->show();
mFileExplorer->setFocus();

即使我用隐藏第一个小部件

mProjectExploerer->hide();
mProjectExplorer->close();

我仍然无法将文件浏览器带到顶部。在Qt中可以做到吗?如果可以,怎么办?

1 个答案:

答案 0 :(得分:0)

如果两个QWidgetmFileExplorer都已经与它们自己的mProjectExplorer相关联,那么我怀疑您需要执行QDockWidget raise本身的操作。

给出诸如 [1] ...

之类的功能
QDockWidget

您应该能够做到,例如...

QDockWidget *find_dock_widget_for (QWidget *w)
{
  while (w) {
    if (auto *dw = dynamic_cast<QDockWidget *>(w))
      return dw;
    w = w->parentWidget();
  }
  return nullptr;
}

[1]请注意,if (auto *dock_widget = find_dock_widget_for(mFileExplorer)) { dock_widget->raise(); dock_widget->setFocus(); } 在这里可能会过大。我所做的测试表明,find_dock_widget_for始终是它管理的QDockWidget的直接父级,但是我找不到任何可以保证这一点的文档。