2016-04-01 48 views
4

3 ana widget'a sahip bir uygulamanız var. Ayrıca bir pop-out QDockWidget var. QDockWidget'u alt parçacığın sağ yarısına yerleştirmeye çalışıyorum, ancak aşağıdaki resimde gördüğünüz gibi, pencereyi yerleştirebileceğim tek yer uygulamanın kenarlarında. QDockWidget penceresinin alt parçacığın sağ yarısını kaplaması için nasıl yapabilirim?Açılır pencere nasıl yerleştirilir?

enter image description here

Ayrıca, QDockWidget zaten uygulamayı açma yerine kendi penceresinde ayrı açmak zorunda üzerine yerleştirilebilen için bir yol var?

DÜZENLEME: Aşağıda Bertrand'ın cevap @ kullanarak, burada oynamak zorunda kalırdı ne:

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

cevap

6

Sen bir QDockWidget'i QMainWindow veya başka bir Q'ya yerleştirebilir DockWidget.

istenen düzen ana pencerenin sağ tarafında bir alt QMainWindow gömmek olsun ve setWindowFlags ile QWidget (Qt :: Widget) olarak kullanmak için: Bu

#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

fantastik bir cevap. Yazmaya zaman ayırdığınız için teşekkür ederim. Bir soru: m_rightSideWindow ifadesinin hangi tür olması gerektiği ('error:' m_rightSideWindow 'bu kapsamda açıklanmadı)? – orbit

+0

Nevermind. Bunu anladım. Tüm ayrıntılar için orijinal yanıtın EDIT bölümüne bakın. – orbit

+1

@orbit Üzgünüm, #include dosyasını vermedim. Sen yaptın! :-) – Bertrand

İlgili konular