8

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

但是,如果使用 以编程方式添加了太多的dockwidgets addDockWidget(...),它们就会开始相互重叠(不是在选项卡方面,而是在一个被绘制在不同区域的内容方面,这显然看起来被破坏了)。

重叠的码头小部件

用户可以将dockwidgets 移动到仍有空间的dockareas,但布局/主窗口成功地防止(未选项卡)重新添加到“拥挤”的dockarea。

我们确实允许选项卡式停靠以允许用户安排所需的停靠小部件,但我们不想启用QMainWindow::ForceTabbedDocks,因为这会过多地限制同时可见的停靠小部件的数量(每个停靠区域一个)。

我怎样才能防止这种情况或更好地控制如何添加dockwidgets?

4

3 回答 3

6

不直接回答您的问题,但实际上忘记 Qt 并真正考虑整个交互应该如何工作可能是值得的。用户的期望是什么?如果 10 个不同的插件激活,实际会发生什么?它们应该停靠还是浮动,或者它们应该成为具有初始状态的可固定停靠窗口,作为 MainWindow 边缘上的一个小按钮?我认为,一旦您完成了基础工作并提出了用户界面模型,您就可以开始查看 Qt 并确定 Qt 是否提供了开发该界面的直接方法,如果没有,您需要开发哪些附加组件使该界面正常工作。

根据我自己的经验,我很久以前就在 MFC 中开发了一个类似的界面。我们这样做的方式是,一些停靠的窗户被认为是必须拥有的,它们会像停靠一样出现。然后有一组不需要总是可见但应该快速可用的窗口,它们的初始状态是隐藏的可固定停靠窗口,这意味着它们作为 MainWindow 边缘的按钮出现。最后还有一个用户并不总是需要的第三组,可以从文件->查看菜单中调用。一旦用户使其可见,用户通常会将其分配给前两个组之一或保持浮动。整个配置保存在配置文件中,并且从那里开始,每当插件加载/变为活动时,使用关联停靠窗口的最后使用状态。

于 2012-08-03T13:12:53.493 回答
2

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

setDockOptions(QMainWindow::AllowNestedDocks | QMainWindow::AnimatedDocks | QMainWindow::AllowTabbedDocks)

编辑:如果你有太多问题,你可能会以错误的方式解决这个问题。您可能想尝试将 QMdiArea 与 QMdiWindow 一起使用,而不是使用扩展坞。这可能不适用于您的程序,但需要考虑一下。

于 2012-07-31T18:47:06.693 回答
1

这是我尝试过的解决方案:

  1. 我在 QTCreator 中创建了一个带有窗口的空项目,一个标有“New Dock”的简约菜单和一个名为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);
     }
    

tabifyDockWidget(QDockWidget* first, QDockWidget* second)是一个 QMainWindow 方法,它将第二个 dockwidget 堆叠在第一个上。希望能帮助到你...

于 2012-08-02T12:25:22.503 回答