2014-01-19 164 views
2

我有一個WidgetA部件,它是一個所有者繪製的部件。目前放置在QMainWindowQVBoxLayout。點擊一個按鈕後,我想從這QVBoxLayoutWidgetA」,插入QSplitterQVBoxLayout和「讀」WidgetA到這個QSplitter。所有這一切都在不破壞WidgetA,所以它將保留其繪圖上下文等重新裝載Qt部件

所以,目前我有這個(在一個窗口中只有一個窗口小部件):

only one widget in a window

我想放WidgetAQMainWindow,並創建一個新的小部件,WidgetB之間的QSplitter,所以我結束了:

two widgets, split by QSplitter

後來我希望它進一步拆分,因此WidgetAWidgetB仍然會允許它們自己分離並放置在新的QSplitter中,因此可以創建f.e.該層次結構:

three widgets, split by two QSplitters

而且,是完整的,一個步驟:

four widgets, split by three QSplitters

我不是很在Qt的經驗,所以我想要做的似乎很明顯,但我無法找到如何「重新」的小部件。這在Qt中可能嗎?

回答

2

請參閱重新設置父級例子,可能是它可以幫助你:

//MyMainWindow.h 
#include <QWidget> 
#include <QPainter> 
#include <QVBoxLayout> 
#include <QHBoxLayout> 
#include <QPushButton> 
#include <QSplitter> 

class MyWidget: public QWidget 
{ 
public: 
    MyWidget(QWidget* parent, int number) 
    : QWidget(parent), 
     m_number(number) 
    { 

    } 

private: 
    virtual void paintEvent(QPaintEvent* e) 
    { 
    QWidget::paintEvent(e); 

    QPainter p(this); 
    p.fillRect(rect(), Qt::red); 
    p.drawText(rect(), Qt::AlignCenter, QString::number(m_number)); 
    } 

private: 
    int m_number; 
}; 

class MyMainWindow: public QWidget 
{ 
    Q_OBJECT 

public: 
    MyMainWindow() 
    { 
    setFixedSize(300, 200); 

    m_mainLayout = new QVBoxLayout(this); 
    QHBoxLayout* buttonLayout = new QHBoxLayout; 
    m_mainLayout->addLayout(buttonLayout); 

    m_button = new QPushButton("Button", this); 
    buttonLayout->addWidget(m_button); 

    connect(m_button, SIGNAL(clicked()), this, SLOT(onButtonClickedOnce())); 

    m_initWidget = new MyWidget(this, 1); 
    m_mainLayout->addWidget(m_initWidget); 
    } 

private slots: 
    void onButtonClickedOnce() 
    { 
    m_button->disconnect(this); 

    m_mainLayout->removeWidget(m_initWidget); 
    QSplitter* splitter = new QSplitter(Qt::Horizontal, this); 
    m_mainLayout->addWidget(splitter); 

    splitter->addWidget(m_initWidget); 
    MyWidget* newWidget = new MyWidget(splitter, 2); 
    splitter->addWidget(newWidget); 
    } 

private: 
    QVBoxLayout* m_mainLayout; 
    QWidget* m_initWidget; 
    QPushButton* m_button; 
}; 

//main.cpp 

#include <QtWidgets/QApplication> 
#include "MyMainWindow.h" 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    MyMainWindow mainWindow; 
    mainWindow.show(); 

    return a.exec(); 
} 
1

當你與小部件操作是佈局的一部分,那麼你需要使用QLayout(QVBoxLayout的母公司)的適當的方法來從佈局分離的項目:

QLayout :: removeWidget(的removeItem如果不是小部件,但間隔項或其他佈局) QLayout :: addWidget(addItem -/- )

順便說一句:即使小部件在佈局之間移動,其父可能甚至保持不變。我想你不需要調用QWidget :: setParent(),因爲addWidget/removeWidget的調用將爲你完成所有工作。