Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何删除QSplitter中的所有子项,但保留第一个子项?_C++_Qt_Copy - Fatal编程技术网

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());


}