2014-01-19 120 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的调用将为你完成所有工作。