У меня действительно очень неприятная проблема, я пытаюсь удалить qgraphicsitems в моем приложении. У меня есть контроллер меню, который отвечает за добавление кнопок в макет и добавление их в сцену. Эти кнопки все связаны с пользовательскими сигналами и слотами. Когда я меняю состояние, я хочу удалить этот контроллер и удалить все эти элементы qgraphics.
Вот как я добавляю их в мой 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
Я удаляю каждую из кнопок со сцены, отсоединяю подключенные кнопки и затем пытаюсь вызвать удаление на них.
Я получаю ошибку сегментации каждый раз. Элементы сцены удаляются нормально, и разъединения работают нормально, но по какой-то причине, когда я удаляю элементы, он вызывает ошибку сегментации и вылетает из программы.
Я думаю, что-то не так в вашем utilities::delete_ptr()
,
Но в любом случае. Нет необходимости отключать сигнал, если вы удаляете отправителя или получателя. Это автоматически делается, когда один из них удаляется.
Также нет необходимости просматривать весь список элементов в сцене и удалять их. призвание QGraphicsScene::clear()
Сделаю. И даже это не обязательно, если вы все равно удаляете сцену.
Спасибо за помощь.
Причиной ошибки сегментации было то, что виджеты были связаны с сигналами и поэтому должны были быть удалены с помощью метода deleteLater ().
Кажется, что удаление элемента сигнализирует другим виджетам, и когда это произошло, он не смог найти место в памяти и, таким образом, вызвал ошибку сегмента.