2016-04-01 6 views
4

Ich habe eine Anwendung, die 3 Hauptwidgets hat. Ich habe auch eine Pop-out QDockWidget. Ich versuche, die QDockWidget in die rechte Hälfte des unteren Widgets anzudocken, aber wie Sie in der Abbildung unten sehen können, sind die einzigen Stellen, an denen ich das Fenster andocken kann, an den Rändern der Anwendung. Wie kann ich es so machen, dass das QDockWidget-Fenster die rechte Hälfte des unteren Widgets einnimmt?Wie docken Sie ein Pop-Out-Fenster an?

enter image description here

Auch ist es eine Möglichkeit, ein QDockWidget hat bereits beim Öffnen der Anwendung andocken anstatt sie separat in einem eigenen Fenster öffnen?

EDIT: Mit @ unter Bertrandsche Antwort, hier ist was ich tun liquidiert:

mainwindow.h

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 

namespace Ui { 
class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 


private: 
    Ui::MainWindow *ui; 
    void on_actionRestore_layout_triggered(); 
    QMainWindow* m_rightSideWindow; 
    QDockWidget* m_dockWidget1; 
    QDockWidget* m_dockWidget2; 
    QDockWidget* m_dockWidget3; 
}; 

#endif // MAINWINDOW_H 

mainwindow.cpp

#include "mainwindow.h" 
#include "ui_mainwindow.h" 

#include <QtWidgets> 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow), 
    m_rightSideWindow(NULL), 
    m_dockWidget1(NULL), 
    m_dockWidget2(NULL), 
    m_dockWidget3(NULL) 
{ 
    ui->setupUi(this); 
    QSplitter *splitter = new QSplitter(this); 
     splitter->setOrientation(Qt::Horizontal); 
     QTreeView* leftSideWidget = new QTreeView(this); 

     m_rightSideWindow = new QMainWindow(this); 
     m_rightSideWindow->setWindowFlags(Qt::Widget); 
     m_rightSideWindow->layout()->setContentsMargins(3, 3, 3, 3); 

     splitter->addWidget(leftSideWidget); 
     splitter->addWidget(m_rightSideWindow); 

     m_dockWidget1 = new QDockWidget("Dock 1", this); 
     m_rightSideWindow->addDockWidget(Qt::TopDockWidgetArea, m_dockWidget1); 
     m_dockWidget1->setTitleBarWidget(new QWidget()); // remove title bar 
     m_dockWidget1->setAllowedAreas(Qt::NoDockWidgetArea); // do not allow to dock 
     QTextEdit* textEdit1 = new QTextEdit(this); // put any QWidget derived class inside 
     m_dockWidget1->setWidget(textEdit1); 

     m_dockWidget2 = new QDockWidget("Dock 2", this); 
     m_rightSideWindow->addDockWidget(Qt::BottomDockWidgetArea, m_dockWidget2); 
     m_dockWidget2->setTitleBarWidget(new QWidget()); 
     m_dockWidget2->setAllowedAreas(Qt::NoDockWidgetArea); 
     QTextEdit* textEdit2 = new QTextEdit(this); 
     m_dockWidget2->setWidget(textEdit2); 

     m_dockWidget3 = new QDockWidget("Dock 3", this); 
     m_rightSideWindow->addDockWidget(Qt::BottomDockWidgetArea, m_dockWidget3); 
     QTextEdit* textEdit3 = new QTextEdit(this); 
     m_dockWidget3->setWidget(textEdit3); 

     setCentralWidget(splitter); 
} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 

void MainWindow::on_actionRestore_layout_triggered() 
{ 
    QList<QDockWidget*> list = findChildren<QDockWidget*>(); 
    foreach(QDockWidget* dock, list) 
    { 
     if(dock->isFloating()) 
      dock->setFloating(false); 
     m_rightSideWindow->removeDockWidget(dock); 
     if (dock == m_dockWidget1) 
      m_rightSideWindow->addDockWidget(Qt::TopDockWidgetArea, m_dockWidget1); 
     else 
      m_rightSideWindow->addDockWidget(Qt::BottomDockWidgetArea, dock); 
     dock->setVisible(true); 
    } 
    m_rightSideWindow->splitDockWidget(m_dockWidget2, m_dockWidget3, Qt::Horizontal); 
} 

Antwort

6

Sie kann ein QDockWidget auf einem QMainWindow oder einem anderen Q andocken DockWidget.

Um das gewünschte Layout einen Unter QMainWindow auf der rechten Seite des Hauptfensters einbetten, und als QWidget verwendet mit setWindowFlags (Qt :: Widget):

#include "mainwindow.h" 
#include "ui_mainwindow.h" 

#include <QtWidgets> 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    QSplitter *splitter = new QSplitter(this); 
    splitter->setOrientation(Qt::Horizontal); 
    QTreeView* leftSideWidget = new QTreeView(this); 

    m_rightSideWindow = new QMainWindow(this); 
    m_rightSideWindow->setWindowFlags(Qt::Widget); 
    m_rightSideWindow->layout()->setContentsMargins(3, 3, 3, 3); 

    splitter->addWidget(leftSideWidget); 
    splitter->addWidget(m_rightSideWindow); 

    m_dockWidget1 = new QDockWidget("Dock 1", this); 
    m_rightSideWindow->addDockWidget(Qt::TopDockWidgetArea, m_dockWidget1); 
    m_dockWidget1->setTitleBarWidget(new QWidget()); // remove title bar 
    m_dockWidget1->setAllowedAreas(Qt::NoDockWidgetArea); // do not allow to dock 
    QTextEdit* textEdit1 = new QTextEdit(this); // put any QWidget derived class inside 
    m_dockWidget1->setWidget(textEdit1); 

    m_dockWidget2 = new QDockWidget("Dock 2", this); 
    m_rightSideWindow->addDockWidget(Qt::BottomDockWidgetArea, m_dockWidget2); 
    m_dockWidget2->setTitleBarWidget(new QWidget()); 
    m_dockWidget2->setAllowedAreas(Qt::NoDockWidgetArea); 
    QTextEdit* textEdit2 = new QTextEdit(this); 
    m_dockWidget2->setWidget(textEdit2); 

    m_dockWidget3 = new QDockWidget("Dock 3", this); 
    m_rightSideWindow->addDockWidget(Qt::BottomDockWidgetArea, m_dockWidget3); 
    QTextEdit* textEdit3 = new QTextEdit(this); 
    m_dockWidget3->setWidget(textEdit3); 

    setCentralWidget(splitter); 

} 
MainWindow::~MainWindow() 
{ 
    delete ui; 
} 
void MainWindow::on_actionRestore_layout_triggered() 
{ 
    QList<QDockWidget*> list = findChildren<QDockWidget*>(); 
    foreach(QDockWidget* dock, list) 
    { 
     if(dock->isFloating()) 
      dock->setFloating(false); 
     m_rightSideWindow->removeDockWidget(dock); 
     if (dock == m_dockWidget1) 
      m_rightSideWindow->addDockWidget(Qt::TopDockWidgetArea, m_dockWidget1); 
     else 
      m_rightSideWindow->addDockWidget(Qt::BottomDockWidgetArea, dock); 
     dock->setVisible(true); 
    } 
    m_rightSideWindow->splitDockWidget(m_dockWidget2, m_dockWidget3, Qt::Horizontal); 
} 

enter image description here

+0

Dies ist eine fantastische Antwort. Danke, dass Sie sich die Zeit genommen haben, es zu schreiben. Eine Frage: Welcher Typ sollte 'm_rightSideWindow' als deklariert werden ('error: 'm_rightSideWindow' wurde in diesem Bereich nicht deklariert?)? – orbit

+0

Niemals. Ich habe es herausgefunden. Siehe den Abschnitt EDIT meiner ursprünglichen Antwort für alle Details. – orbit

+1

@orbit Sorry, ich habe die #include-Datei nicht angegeben. Du hast es geschafft! :-) – Bertrand

Verwandte Themen