2016-04-01 2 views
4

私は3つの主要ウィジェットを持つアプリケーションを持っています。私はまた、ポップアウトQDockWidgetを持っています。 QDockWidgetを下のウィジェットの右半分にドッキングさせようとしていますが、下の図に示すように、ウィンドウをドッキングできる場所はアプリケーションの端にあります。 QDockWidgetウィンドウが下部ウィジェットの右半分を占めるようにするにはどうすればよいですか?ポップアウトウィンドウをドッキングする方法は?

enter image description here

また、QDockWidgetはすでにアプリケーションを開く代わりに、それは独自のウィンドウで別々に開いた時にドッキングされていする方法は何ですか?

EDIT:以下ベルトランの答え@使用するには、ここで私がやって巻き取るものです:

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

答えて

6

ますQMainWindowまたは別のQにQDockWidgetをドッキングすることができますDockWidget。目的のレイアウトを取得するには

は、メインウィンドウの右側にあるサブQMainWindowを埋め込み、そしてsetWindowFlags(Qtの::ウィジェット)とQWidgetのようにそれを使用します。

#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

これは、素晴らしい答え。それを書く時間をとっていただきありがとう、ありがとうございます。 1つの質問: '' m_rightSideWindow''は '' m_rightSideWindow 'はこのスコープで宣言されていませんでした。 – orbit

+0

私はそれを考え出した。詳細については私の元の答えのEDITセクションを参照してください。 – orbit

+1

@orbit申し訳ありませんが、私は#includeファイルを指定していません。できたね! :-) – Bertrand

関連する問題