在QGraphicsScene上删除QGraphicsLinearLayout中的QGraphics项目

时间:2012-12-03 02:32:54

标签: c++ qt qgraphicsview qgraphicsitem disconnect

我遇到了一个非常令人沮丧的问题,试图在我的应用程序中删除qgraphicsitems。我有一个菜单控制器,负责向布局添加按钮并将它们添加到场景中。这些按钮都与自定义信号和插槽相连。当我改变状态时,我想删除这个控制器并删除所有这些qgraphicsitems。

以下是我在menu_controller.cpp中添加它们的方法:

QGraphicsWidget * temp;//this is used during iteration to add to the layout

    this->layout = new QGraphicsLinearLayout(Qt::Vertical);//q graphics view layout
    this->menu = new QGraphicsWidget;//holds the layout


    // initialize the proper buttons
    (this->game_state->is_logged_in()) ? (this->logged_in()) : (this->not_logged_in());//test whether or not the user is logged in to generate the correct menu

    // now iterate through each button and add to the layout
    for (int i = 0, z = this->buttons.size(); i < z; i++) {

        temp = this->scene->addWidget(this->buttons[i]);//add widget to the scene
        this->layout->addItem(temp);//add this widget to the layou
        connect(this->buttons[i], SIGNAL(menu_selection(QString)), this, SLOT(set_menu_option(QString)));//connect the button to this
    }

    // set menu layout as the layout and then add the menu to the scene
    this->menu->setLayout(this->layout);
    this->position();
    this->scene->addItem(this->menu);

最后,我的析构函数看起来像这样:

QGraphicsScene * scene = this->game_state->get_scene();

    QList<QGraphicsItem *> list = scene->items();
    QList<QGraphicsItem *>::Iterator it = list.begin();

    for (; it != list.end(); ++it)
        if (*it)
            scene->removeItem(*it);

    for (int i = 0, z = this->buttons.size(); i < z; i++)
        disconnect(this->buttons[i], 0, 0, 0);//button not connected to anything

    // for each deletes each place in memory
    for_each(this->buttons.begin(), this->buttons.end(), utilities::delete_ptr());

    delete this->layout;//delete the layout container
    delete this->menu;//delete the menu

我从场景中删除了每个按钮,断开连接的按钮,然后尝试对它们进行删除。

我每次都会遇到分段错误。场景项目删除正常,断开连接正常,但由于某些原因,当我删除项目时,它会引发分段错误并导致程序崩溃。

2 个答案:

答案 0 :(得分:1)

我的猜测是utilities::delete_ptr()中出现了问题。

但无论如何。如果要删除发送方或接收方,则无需断开信号。当其中一个被删除时,它会自动完成。

也无需浏览场景中的整个项目列表并删除它们。拨打QGraphicsScene::clear()即可。即使你没有必要删除场景。

答案 1 :(得分:0)

感谢您的帮助。

导致分段错误的原因是小部件与信号连接,因此需要使用deleteLater()方法删除。

似乎删除一个元素会发出其他小部件的信号,当发生这种情况时,它无法找到一个存储器,从而称为seg故障。