0

アプリケーションで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

シーンから各ボタンを削除し、接続されているボタンを切断してから、それらに対してdeleteを呼び出してみます。

毎回セグメンテーション違反が発生します。シーンアイテムは正常に削除され、切断は正常に機能しますが、何らかの理由でアイテムを削除すると、セグメンテーション違反がスローされ、プログラムがクラッシュします。

4

2 に答える 2

1

私の推測では、あなたに何か問題がありますutilities::delete_ptr()

とにかく。送信者または受信者のいずれかを削除する場合は、信号を切断する必要はありません。それらの1つが削除されると、これは自動的に行われます。

また、シーン内のアイテムのリスト全体を調べて削除する必要もありません。呼び出してもかまいQGraphicsScene::clear()ません。とにかくシーンを削除しているので、それでも必要ありません。

于 2012-12-03T03:59:56.053 に答える
0

助けてくれてありがとう。

セグメンテーション違反の原因は、ウィジェットがシグナルに接続されていたため、deleteLater()メソッドで削除する必要があるという事実でした。

要素を削除すると他のウィジェットに信号が送られるようですが、これが発生すると、メモリの場所が見つからなかったため、セグメンテーション違反と呼ばれます。

于 2012-12-05T15:41:55.927 に答える