重新租用Qt小部件

重新租用Qt小部件,qt,widget,qsplitter,Qt,Widget,Qsplitter,我有一个WidgetA小部件,它是一个所有者绘制的小部件。它当前位于QMainWindow的QVBoxLayout中。点击一个按钮后,我想从这个QVBoxLayout中“分离”WidgetA,将QSplitter插入这个QVBoxLayout中,并将WidgetA读到这个QSplitter。所有这些都不会破坏WidgetA,因此它将保留其绘图上下文等 因此,目前我有这个(窗口中只有一个小部件): 我想在WidgetA和QMainWindow之间放置一个qspliter,并创建一个新的小部件Wi

我有一个
WidgetA
小部件,它是一个所有者绘制的小部件。它当前位于
QMainWindow
QVBoxLayout
中。点击一个按钮后,我想从这个
QVBoxLayout
中“分离”
WidgetA
,将
QSplitter
插入这个
QVBoxLayout
中,并将
WidgetA
读到这个
QSplitter
。所有这些都不会破坏WidgetA,因此它将保留其绘图上下文等

因此,目前我有这个(窗口中只有一个小部件):

我想在
WidgetA
QMainWindow
之间放置一个
qspliter
,并创建一个新的小部件
WidgetB
,因此我最终会得到:

稍后,我希望它进一步拆分,这样
WidgetA
WidgetB
仍允许将其分离并放置在新的
qspliter
中,因此可以创建f.e.此层次结构:

最后,还有一个步骤:


我在Qt方面不是很有经验,所以我试图做的事情看起来很明显,但我找不到如何“重新编写”小部件。这在Qt中是否可能?

当您使用作为布局一部分的小部件进行操作时,需要使用QLayout(QVBoxLayout的父项)的适当方法从布局中分离项目:

removeWidget(如果不是widget,而是间隔项或其他布局,则为removeItem) QLayout::addWidget(addItem-->)


顺便说一句:即使小部件在布局之间移动,它的父部件也可能保持不变。我想您不需要调用QWidget::setParent(),因为addWidget/removeWidget的调用将为您完成所有工作。

请参阅重新编写的示例,它可能会帮助您:

//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();
}
//MyMainWindow.h
#包括
#包括
#包括
#包括
#包括
#包括
类MyWidget:publicqwidget
{
公众:
MyWidget(QWidget*父项,整数)
:QWidget(父项),
m_编号(编号)
{
}
私人:
虚拟void paintEvent(QPaintEvent*e)
{
QWidget::paintEvent(e);
油漆工p(本);
p、 fillRect(rect(),Qt::red);
p、 drawText(rect(),Qt::AlignCenter,QString::number(m_number));
}
私人:
整数m_数;
};
类MyMainWindow:公共QWidget
{
Q_对象
公众:
MyMainWindow()
{
设置固定大小(300200);
m_mainLayout=新的QVBoxLayout(本);
QHBoxLayout*按钮布局=新的QHBoxLayout;
主布局->添加布局(按钮布局);
m_按钮=新的QPushButton(“按钮”,本);
按钮布局->添加小部件(m_按钮);
连接(m_按钮,信号(单击()),此,插槽(onButtonClickedOnce());
m_initWidget=newmywidget(这个,1);
m_mainLayout->addWidget(m_initWidget);
}
专用插槽:
void onButtonClickedOnce()
{
m_按钮->断开(此);
m_mainLayout->removeWidget(m_initWidget);
QSplitter*splitter=新的QSplitter(Qt::Horizontal,this);
m_mainLayout->addWidget(拆分器);
拆分器->添加小部件(m_initWidget);
MyWidget*newWidget=newmywidget(拆分器,2);
拆分器->添加小部件(newWidget);
}
私人:
QVBoxLayout*m_主布局;
QWidget*m_initWidget;
QPushButton*m_按钮;
};
//main.cpp
#包括
#包括“MyMainWindow.h”
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
我的主窗口;
mainWindow.show();
返回a.exec();
}