Программно отменить табуляцию трех QDockWidget

У меня есть приложение с тремя док-виджетами. Они создаются следующим кодом:

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

dock2 и dock3 затем табулируются

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

Затем окно выглядит следующим образом: Доки с вкладками

Я могу расположить доки рядом, перетащив их, чтобы окно выглядело так: параллельные доки

Я хотел бы сделать это программно, но я не могу понять, как это сделать. Делая

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

Ничего не произошло. При выполнении

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

dock1 и dock2 исчезают, и только dock3 остается видимым: dock1 и док2 невидимы

После ручного перетаскивания его из главного окна и обратно окно выглядит так: неправильно расположенные доки

Так что я делаю неправильно здесь?


person Tobias Leupold    schedule 09.08.2017    source источник


Ответы (1)


Я нашел решение. Проблема в том, к какой доке привязаны доки. я добавил

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);
}
person Tobias Leupold    schedule 10.08.2017
comment
setDockNestingEnabled(true); не требуется при программном выравнивании док-виджетов - person Skandix; 20.04.2018