Pregunta

I'm having a really frustrating problem, trying to delete qgraphicsitems in my application. I have a menu controller which is responsible for adding buttons to a layout and adding them to the scene. These buttons are all connected with custom signals and slots. When I change states, I want to delete this controller and remove all of these qgraphicsitems.

Heres how I add them in my 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);

Finally, my destructor looks like this:

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

I remove each of the buttons from the scene, disconnect the connected buttons and then try to call delete on them.

I get a segmentation fault each time. The scene items remove fine, and the disconnects work properly, but for some reason when I delete the items, it throws a segmentation fault and crashes the program.

¿Fue útil?

Solución

My guess is there's something wrong in your utilities::delete_ptr().

But anyway. There's no need to disconnect the signal if you are deleting either the sender or receiver. That's automatically done when one of them is deleted.

There's also no need to go through the whole list of items in a scene and delete them. Calling QGraphicsScene::clear() will do. And even that is not necessary of you are deleting the scene anyway.

Otros consejos

Thanks for the assistance.

What was causing the segmentation fault was the fact that the widgets were connected with signals and therefore needed to be deleted with the deleteLater() method.

It seems that deleting an element signals other widgets and when this occurred, it could not find the place an memory and thus called a seg fault ..

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top