我有一个WidgetA
小部件,它是一个所有者绘制的小部件。它目前位于QMainWindow
的{{1}}。点击按钮后,我想从此QVBoxLayout
“分离”WidgetA
,将QVBoxLayout
插入此QSplitter
并“读取”QVBoxLayout
至此WidgetA
。所有这些都没有破坏QSplitter
,所以它将保留其绘图上下文等。
所以,目前我有这个(窗口中只有一个小部件):
我想在WidgetA
和QSplitter
之间添加WidgetA
,并创建一个新的小部件QMainWindow
,所以我最终得到:
稍后我希望它进一步拆分,因此WidgetB
和WidgetA
仍然允许自己分离并放置在新的WidgetB
中,这样就有可能创造铁这个层次结构:
而且,要完成,还有一步:
我在Qt方面不是很有经验,所以我想做的事情看起来很明显,但我找不到如何“重新定位”小部件。这可能在Qt吗?
答案 0 :(得分: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 :(得分:1)
当您使用作为布局一部分的小部件进行操作时,您需要使用QLayout(QVBoxLayout的父级)的适当方法从布局中分离项目:
QLayout :: removeWidget(如果它不是小部件,则为removeItem,但是间隔项或其他布局) QLayout :: addWidget(addItem - / - )
顺便说一句:即使小部件在布局之间移动,其父级甚至可能保持不变。我猜你没有必要调用QWidget :: setParent(),因为addWidget / removeWidget的调用将为你完成所有工作。