如何避免QMainWindow中太多dockwidgets的丑陋重叠?

时间:2012-07-18 10:53:42

标签: c++ qt qdockwidget

在我们的应用程序中,我们有一个可变数量的dockwidgets,因为其中一些是由在运行时加载的插件添加的。并非所有dockwidgets都必须同时可见。这在很大程度上取决于用户正在处理什么以及哪些插件处于活动状态。

但是,如果使用addDockWidget(...)以编程方式添加了太多的dockwidgets,它们会开始相互重叠(不是在标签方面,而是根据在另一个区域上绘制的内容的内容)显然看起来很破碎)。

Overlapping dockwidgets

用户可以将dockwidgets移动到仍然留有空间的dockareas ,但布局/主窗口成功阻止(未攻击)重新添加到“拥挤”的dockarea。

我们允许标签式底座允许用户安排所需的dockwidgets,但我们不希望启用QMainWindow::ForceTabbedDocks,因为这会过多地限制同时可见的dockwidgets的数量(每个底座区域一个)

如何防止这种情况或更好地控制如何添加dockwidgets?

3 个答案:

答案 0 :(得分:5)

不直接回答你的问题,但实际上忘记Qt可能是值得的,并且实际上想一想整个互动应该如何运作。用户的期望是什么?如果10个不同的插件变为活动状态,应该会发生什么?它们应该停靠还是它们应该是浮动的,还是它们应该成为具有初始状态的可固定对接窗口,作为MainWindow边缘上的一个小按钮?我认为,一旦你做了这个基础工作并提出用户界面模型,你就可以开始查看Qt并弄清楚Qt是否提供了开发该界面的直接方法,如果不是你需要开发的其他组件让界面有效。

根据我自己的经验,我在MFC中开发了类似的界面。我们这样做的方式是,一些停靠的窗户被认为是必须的,并且它们会像停靠一样出现。然后有一组窗口不需要始终可见但应该快速可用,它们的初始状态是隐藏的可固定停靠窗口,这意味着它们在MainWindow边缘上显示为按钮。最后,用户不需要第三组,可以从File-> View Menu调用。一旦用户将其显示,用户通常会将其分配给前两组中的一组或保持其状态。整个配置保存在配置文件中,每当插件加载/变为活动状态时,就会使用相关停靠窗口的最后使用状态。它虽然涉及了相当多的额外工作,但最终结果是让所有用户满意。

答案 1 :(得分:2)

你试过setDockOptions(QMainWindow::AllowNestedDocks)吗?我现在无法测试它,但它可能有所帮助。 默认情况下,QMainWindow::dockOptions设置为AnimatedDocks | AllowTabbedDocks,因此您需要类似

的内容
setDockOptions(QMainWindow::AllowNestedDocks | QMainWindow::AnimatedDocks | QMainWindow::AllowTabbedDocks)

编辑: 如果你遇到太多问题,你可能会采取错误的方式。您可能希望尝试将QMdiArea与QMdiWindow一起使用,而不是使用Dock。这可能不适用于您的程序,但需要考虑的事情。

答案 2 :(得分:1)

这是我尝试的解决方案:

  1. 我在QTCreator中创建了一个带有窗口的空项目,标有“New Dock”的简约菜单和名为dockWidget的DockWidget

  2. 这是我的菜单项的triggered()处理程序:

      void MainWindow::on_actionNew_Dock_triggered()
     {    
         QDockWidget* w = new QDockWidget("Demo", ui->dockWidget);
         this->addDockWidget(Qt::LeftDockWidgetArea,w);
         this->tabifyDockWidget(ui->dockWidget,w);
     }
    
  3. tabifyDockWidget(QDockWidget* first, QDockWidget* second)是一个QMainWindow方法,它将第二个dockwidget堆叠在第一个上。希望它有所帮助...