Удалите элементы QGraphics из QGraphicsLinearLayout в QGraphicsScene

У меня действительно неприятная проблема при попытке удалить 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

Я удаляю каждую из кнопок со сцены, отключаю подключенные кнопки, а затем пытаюсь вызвать для них удаление.

Каждый раз я получаю ошибку сегментации. Элементы сцены удаляются нормально, и отключения работают правильно, но по какой-то причине, когда я удаляю элементы, возникает ошибка сегментации и происходит сбой программы.


person JonMorehouse    schedule 03.12.2012    source источник


Ответы (2)


Я предполагаю, что что-то не так с вашим utilities::delete_ptr().

Но все таки. Нет необходимости отключать сигнал, если вы удаляете отправителя или получателя. Это происходит автоматически при удалении одного из них.

Также нет необходимости просматривать весь список элементов в сцене и удалять их. Подойдет вызов QGraphicsScene::clear(). И даже в этом нет необходимости, если вы все равно удаляете сцену.

person Stephen Chu    schedule 03.12.2012

Спасибо за помощь.

Ошибка сегментации вызывала тот факт, что виджеты были связаны с сигналами и, следовательно, их нужно было удалить с помощью метода deleteLater ().

Кажется, что удаление элемента сигнализирует другим виджетам, и когда это произошло, он не смог найти место в памяти и, таким образом, вызвал ошибку сегмента ..

person JonMorehouse    schedule 05.12.2012