以编程方式取消制表三个 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);
dock2
和 dock3
然后由
制表
tabifyDockWidget(dock1, dock2);
tabifyDockWidget(dock2, dock3);
然后 window 看起来像这样:
我可以通过拖放来并排排列停靠栏,这样 window 看起来像这样:
我想以编程方式执行此操作,但不知道如何操作。当做 a
splitDockWidget(dock1, dock2, Qt::Horizontal);
没有任何反应。做的时候
splitDockWidget(dock1, dock2, Qt::Vertical);
dock1
和 dock2
消失了,只有 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);
}
我有一个包含三个停靠小部件的应用程序。这些是由以下代码创建的:
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);
然后 window 看起来像这样:
我可以通过拖放来并排排列停靠栏,这样 window 看起来像这样:
我想以编程方式执行此操作,但不知道如何操作。当做 a
splitDockWidget(dock1, dock2, Qt::Horizontal);
没有任何反应。做的时候
splitDockWidget(dock1, dock2, Qt::Vertical);
dock1
和 dock2
消失了,只有 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);
}