重新租用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();
}