2017-08-09 4 views
1

J'ai une application avec trois widgets de quai. Ceux-ci sont créés par le code suivant:Déchiffrer trois QDockWidgets par programme

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 et dock3 sont ensuite tabified par

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

La fenêtre ressemble alors à ceci: Tabbed docks

Je peux arranger le côté des docks côte à côte en les faisant glisser et en les faisant glisser, de sorte que la fenêtre ressemble à ceci: side-by-side docks

Je voudrais faire cela par programme, mais je ne peux pas comprendre comment. Lorsque vous effectuez un

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

rien ne se passe. Quand vous faites

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

dock1 et dock2 disparaissent, et seulement dock3 est encore visible: dock1 and dock2 invisible

Après avoir fait glisser manuellement hors de la fenêtre principale et à l'arrière, la fenêtre ressemble à ceci: wrongly arranged docks

Alors qu'est-ce que je fais mal ici?

Répondre

0

J'ai trouvé la solution. Le problème est à quel dockarea les docks sont attachés. J'ai ajouté

setDockNestingEnabled(true); 

et les fuctions suivantes, qui font le travail en changeant d'abord le dockarea si nécessaire:

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); 
} 
0

Vous devez créer le splitDockWidget droit de la chaîne(), 1-> 2 Vertical, 1-> 3 Horizontal, 2-> 3 Horizontal, exemple

dock1 = new QDockWidget(tr("dock1")); 
dock2 = new QDockWidget(tr("dock2")); 
dock3 = new QDockWidget(tr("dock3")); 

dock1->setWidget(some_widget1); 
dock2->setWidget(some_widget2); 
dock3->setWidget(some_widget3); 

dock1->setContextMenuPolicy(Qt::PreventContextMenu); 

addDockWidget(Qt::LeftDockWidgetArea, dock1); 
addDockWidget(Qt::LeftDockWidgetArea, dock2); 
addDockWidget(Qt::RightDockWidgetArea, dock3); 

splitDockWidget(dock1, dock2, Qt::Vertical); 
splitDockWidget(dock1, dock3, Qt::Horizontal); 
splitDockWidget(dock2, dock3, Qt::Horizontal); 
+0

Cela me donne même résultat avec la différence que je ne vois dock3 au lieu de DOCK1, mais les deux autres docks ne sont toujours pas visibles ... de plus, les quais ne peuvent plus être alignés de gauche à droite à la main. –