C++ 如何删除QSplitter中的所有子项,但保留第一个子项?
我有一个自定义类,我在其中创建了一个C++ 如何删除QSplitter中的所有子项,但保留第一个子项?,c++,qt,copy,C++,Qt,Copy,我有一个自定义类,我在其中创建了一个QFrame,带有QGrid布局,它有一个QMainWindow,其中有一个QDockWidget,它拥有一个OpenGLWidget。现在我已经解决了所有这些问题,我可以向您展示创建类的过程 std::unique_ptr<QFrame, std::default_delete<QFrame>> MyProgram::createNewRenderWindow(bool hasFeatures) { QGridLayout *
QFrame
,带有QGrid布局
,它有一个QMainWindow
,其中有一个QDockWidget
,它拥有一个OpenGLWidget
。现在我已经解决了所有这些问题,我可以向您展示创建类的过程
std::unique_ptr<QFrame, std::default_delete<QFrame>> MyProgram::createNewRenderWindow(bool hasFeatures)
{
QGridLayout *baseLayout = new QGridLayout();
auto newBaseFrame = std::make_unique<QFrame>(new QFrame);
auto newRenderView = std::make_unique<RenderView>(hasFeatures);
newBaseFrame->setFrameStyle(QFrame::StyledPanel);
newBaseFrame->setFrameShadow(QFrame::Sunken);
baseLayout->addWidget(newRenderView.release());
newBaseFrame->setLayout(baseLayout);
return newBaseFrame;
}
在本例中,我传递false的原因是,我的主渲染视图在其dock小部件中不应启用任何功能。所以我将这个设置为false,因为它是我的主渲染窗口。当我创建一个新的渲染视图时,我将这个参数设置为true,这样我就拥有了dock小部件的所有功能
在我的程序中,我创建了一种创建多个渲染视图的方法,本质上是将渲染视图拆分为4个不同窗口的能力。但是,主渲染视图始终相同。因此,如果用户想要添加两个以上的窗口,他们可以。我这样做的原因如下:
std::unique_ptr<QSplitter, std::default_delete<QSplitter>> MyProgram::createNewSplitter(Qt::Orientation orientation)
{
auto newSplitter = std::make_unique<QSplitter>(new QSplitter);
auto newTopWindow = createNewRenderWindow(true);
auto newBottomWindow = createNewRenderWindow(true);
newSplitter->setOrientation(orientation);
newSplitter->addWidget(newTopWindow.release());
newSplitter->addWidget(newBottomWindow.release());
newSplitter->setSizes(QList<int>({HALFRENDERVIEWSIZE, HALFRENDERVIEWSIZE}));
return newSplitter;
}
第一个print语句将输出2,它告诉我我已经成功地提取了我想要的小部件。然后,我打印出ui->splitter
拥有的子项总数。这告诉我它有4个孩子。然后我删除所有QSplitters
,并打印出数字,剩下QFrames
,报告剩下两个QFrames
。然后我删除QFrames
,它报告ui->splitter
中剩下的0个子项。但是,我随后打印出子视图mainRenderView
has,它返回0。然后它尝试将提取的小部件插入到ui->splitter
中,由于没有可插入的内容,因此程序崩溃
最好的方法是什么?我曾经玩弄过创建我自己的复制方法的想法,但是我读到你只是不这样做。是否仍要删除所有子项并返回程序启动时的开始状态 我本人从未使用Qt执行过此操作,但我希望您需要对第一个孩子使用
setParent
,将其从拆分器移动到另一个家长(不要删除您的第一个孩子)。我本人从未使用Qt执行过此操作,但我希望您需要对第一个孩子使用setParent
,将其从拆分器移动到另一个家长(不要删除您的第一个孩子)。
std::unique_ptr<QSplitter, std::default_delete<QSplitter>> MyProgram::createNewSplitter(Qt::Orientation orientation)
{
auto newSplitter = std::make_unique<QSplitter>(new QSplitter);
auto newTopWindow = createNewRenderWindow(true);
auto newBottomWindow = createNewRenderWindow(true);
newSplitter->setOrientation(orientation);
newSplitter->addWidget(newTopWindow.release());
newSplitter->addWidget(newBottomWindow.release());
newSplitter->setSizes(QList<int>({HALFRENDERVIEWSIZE, HALFRENDERVIEWSIZE}));
return newSplitter;
}
auto newWindows = createNewSplitter(Qt::Vertical);
ui->splitter->setOrientation(Qt::Horizontal);
ui->splitter->addWidget(newWindows.release());
ui->splitter->setSizes(QList<int>({HALFRENDERVIEWSIZE, HALFRENDERVIEWSIZE}));
void MyProgram::on_actionOne_View_triggered()
{
auto mainRenderView = std::move(ui->splitter->widget(MAINRENDERINDEX));
std::cout << mainRenderView.children().count() << " extracted children" << std::endl;
std::cout << ui->splitter->children().count() << std::endl;
qDeleteAll(ui->splitter->findChildren<QSplitter*>());
std::cout << ui->splitter->children().count() << std::endl;
qDeleteAll(ui->splitter->findChildren<QFrame*>());
std::cout << ui->splitter->children().count() <<std::endl;
std::cout << mainRenderView.children().count() << " extracted children" << std::endl;
ui->splitter->addWidget(mainRenderView.release());
}