以编程方式取消制表三个 QDockWidgets

Un-tabify three QDockWidgets programmatically

我有一个包含三个停靠小部件的应用程序。这些是由以下代码创建的:

dock = new QDockWidget(tr("Some title"));
dock->setWidget(some_widget);
dock->setContextMenuPolicy(Qt::PreventContextMenu);
dock->setFeatures(QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetFloatable);
addDockWidget(Qt::TopDockWidgetArea, dock);

dock2dock3 然后由

制表
tabifyDockWidget(dock1, dock2);
tabifyDockWidget(dock2, dock3);

然后 window 看起来像这样:

我可以通过拖放来并排排列停靠栏,这样 window 看起来像这样:

我想以编程方式执行此操作,但不知道如何操作。当做 a

splitDockWidget(dock1, dock2, Qt::Horizontal);

没有任何反应。做的时候

splitDockWidget(dock1, dock2, Qt::Vertical);

dock1dock2 消失了,只有 dock3 仍然可见:

手动将其拖出主 window 并返回后,window 如下所示:

那么我做错了什么?

我找到了解决方案。问题是码头连接到哪个码头区域。我加了

setDockNestingEnabled(true);

和以下函数,如果需要,它们通过首先更改停靠区域来完成工作:

void MainWindow::attachDocks(Qt::DockWidgetArea area)
{
    m_playersDock->setFloating(false);
    m_scoreDock->setFloating(false);
    m_rankingDock->setFloating(false);
    addDockWidget(area, m_playersDock);
    addDockWidget(area, m_scoreDock);
    addDockWidget(area, m_rankingDock);
}

void MainWindow::arrangeTabified()
{
    attachDocks(Qt::TopDockWidgetArea);
    tabifyDockWidget(m_playersDock, m_scoreDock);
    tabifyDockWidget(m_scoreDock, m_rankingDock);
}

void MainWindow::arrangeHorizontally()
{
    attachDocks(Qt::TopDockWidgetArea);
    splitDockWidget(m_playersDock, m_scoreDock, Qt::Horizontal);
    splitDockWidget(m_scoreDock, m_rankingDock, Qt::Horizontal);
}

void MainWindow::arrangeVertically()
{
    attachDocks(Qt::LeftDockWidgetArea);
    splitDockWidget(m_playersDock, m_scoreDock, Qt::Vertical);
    splitDockWidget(m_scoreDock, m_rankingDock, Qt::Vertical);
}

void MainWindow::arrangeOwnWindow()
{
    m_playersDock->setFloating(true);
    m_scoreDock->setFloating(true);
    m_rankingDock->setFloating(true);
}