使两个QDockWidget在同一位置互斥

时间:2013-09-17 14:17:25

标签: qt qmainwindow qdockwidget

我有两个QDockWidget,当时只能看到其中一个,我通过toggleViewAction()管理它。

我需要做的是我希望两个QDockWidget位于相同的位置,具有相同的大小并停靠在相同的dockWidgetArea,相对于其他QDockWidgets具有相同的方向和顺序。

我通过这段代码做了大部分工作:

void myMainWindow::slotToggleDocks(QAction* action) {
    if(action == viewDock1) {
    Dock1->setFloating(Dock2->isFloating());
    Dock1->resize(Dock2->size());
    Dock1->restoreGeometry(Dock2->saveGeometry());
    Dock1->move(Dock2->pos());
    addDockWidget(dockWidgetArea(Dock2), Dock1);
    ...
        Dock2->hide();

    } else if(action == viewDock2) {
    Dock2->setFloating(Dock1->isFloating());
    Dock2->resize(Dock1->size());
    Dock2->restoreGeometry(Dock1->saveGeometry());
    Dock2->move(Dock1->pos());
    addDockWidget(dockWidgetArea(Dock2), Dock1);
    ...
        Dock1->hide();
    }
}

此代码使两者具有相同的位置和大小并停靠在同一区域(左,右,......)但不保证Docks将与其他QDockWidget具有相同的布局dockWidgetArea。

这意味着如果这是之前的布局:

Layout before http://holmez.net/qdockwidget/1.png

这是在切换之后:

Layout after toggling http://holmez.net/qdockwidget/2.png

这就是我想要的:

Expected result http://holmez.net/qdockwidget/3.png

3 个答案:

答案 0 :(得分:2)

我设法通过一个简单的技巧来做到这一点,添加这行代码:

splitDockWidget(Dock1,Dock2,Qt::Horizontal);
隐藏Dock1之前

,这一行:

splitDockWidget(Dock2,Dock1,Qt::Horizontal);

隐藏Dock2之前。

这解决了停靠小部件排列的问题,不确定这是否是最佳方式,但它对我有用。

答案 1 :(得分:1)

如何只使用2个QDockWidgets,但可以使用QStackedWidgets INSIDE来交换视图?这就是我目前正在做的事情,而且效果很好。

另一个优点是交换视图非常简单:

    stackedWidget->setCurrentIndex(index);

答案 2 :(得分:1)

使用QTabWidget怎么样? 这两个小部件必须位于相同的Qt::DockWidgetAreas