【问题标题】:Qt Layered Widget Switch FocusQt 分层小部件切换焦点
【发布时间】:2019-01-16 03:59:05
【问题描述】:

我正在处理一个项目,该项目由一个包含一组子小部件的大小部件组成。其中两个子小部件名为“文件资源管理器”和“项目资源管理器”。

由于项目的性质,小部件可以相互叠加,导致 Qt 自动标记小部件,让用户有机会选择任一小部件。

例子:

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

我试过了:

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

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

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

我仍然无法将文件资源管理器带到顶部。这是否可以在 Qt 中实现?如果可以,如何实现?

【问题讨论】:

  • 你在寻找QStackedWidget吗?
  • 很遗憾没有。我正在处理遗留代码,所以我无法切换任何主要的东西,并且小部件不是 QStackedWidget 类的一部分,它们只是独立的小部件。
  • QStackedWidget 已经存在了很长时间,所以我不相信“遗留”的说法。为什么不能用它来解决你的问题?
  • QStackedWidget 是一个类,它由一组小部件组成,并且只允许一个在任何给定时间成为焦点。由于这个项目的性质,如果用户以这种方式定位它们,这里列出的两个子小部件(文件资源管理器和项目资源管理器)可以同时可见是完全可行的。
  • 那么也许您正在寻找QDockWidget?不知道,只是在这里猜测;)不太确定你真正想要什么。

标签: c++ qt widget


【解决方案1】:

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

给定一个函数,例如 [1] ...

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

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

if (auto *dock_widget = find_dock_widget_for(mFileExplorer)) {
  dock_widget->raise();
  dock_widget->setFocus();
}

[1] 请注意,find_dock_widget_for 在这里可能有点矫枉过正。我所做的测试表明QDockWidget 始终是它管理的QWidget 的直接父级,但我找不到任何可以保证这一点的文档。

【讨论】:

  • 我想你已经明白了我所缺少的东西:我试图影响指向子小部件的指针,而我应该试图影响已创建的停靠小部件。我对这个答案的唯一担心是,当我从另一个方法(即“tabFileExplorer”)逐字调用它时,我得到一个“未定义的 MainWindow::find_dock_widget_for(QWidget*) 引用”。它在 header 和 cpp 中的声明是可以接受的,但显然我的程序在使用时不喜欢它
  • 如所介绍的find_dock_widget_for 只是一个免费功能——不一定是MainWindow 或任何其他类的成员。不确定这是否有帮助。
猜你喜欢
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 2019-05-31
  • 2010-12-08
  • 2013-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多