0

私のアプリケーションでは、 のQGraphicsViewチェックを再実装mouseReleaseEvent()し、マウスの位置にあるアイテムにイベントを処理するように伝えています。

私のQGraphicsItemビューは他の 2 つの で構成されており、2 つのQGraphicsItemsうちどちらがクリックされているか (またはボタンが離されているか) を確認し、それぞれのイベントを処理します。

ウィジェットのコンストラクターで、アイテムがリリースを検出したときに使用したのと同じメソッドを使用して、アイテムの 1 つをデフォルトで選択済みとして設定します。

デバッグしたところLabelItem、コンストラクターから select が問題なく呼び出されることがわかりました (アプリケーションを最初に起動したときに結果が明確になります)。しかし、アイテムをクリックすると、アプリケーションが終了します。選択機能に入ったが、そこから離れていないことがわかりました。問題はここにあります。

select 関数は 1 行のセッターにすぎないため、これは非常に奇妙です。

void LabelItem::select()
{
    selected = true;
}

これはmouseReleaseEvent;

void LayerView::mouseReleaseEvent(QMouseEvent *event)
{
    LayerItem *l;

    if(event->button() == Qt::LeftButton)
    {           
        l = (LayerItem *) itemAt(event->pos());

        if(l->inLabel(event->pos()))     
        {                                 //No problem upto this point, if label is clicked on
            l->setSelection(true);        //in setSelection, I call select() or unselect() of LabelItem, 
                                          //which is a child of LayerItem, and the problem is there.
                                          //In the constructor for my main widget, I use setSelection
                                          //for the bottom most LayerItem, and have no issues.
            emit selected(l->getId());
        }
            else if(l->inCheckBox(event->pos()))
        {
            bool t = l->toggleCheckState();
            emit toggled(l->getId(), t);
        }
   }
}

関数内の行をコメントアウトすると、エラーは発生しませんでした。他の CheckBoxItem についてはデバッグしていませんQGraphicsItemが、アプリケーションはそのイベントでも終了します。問題が関連している可能性があると思うので、select今のところに集中しています。

何がこれを引き起こしたのか、なぜこれが起こっているのか、私にはまったく手がかりがありません。私の過去の経験から、それは私が愚かに考えていない単純なものであると確信していますが、何を理解することはできません.

助けていただければ幸いです。

4

2 に答える 2

1

LabelItemが の上にある場合、マウスの下の一番上のアイテムであるため、 はLayerItemおそらくitemAtを返します。が でマウス ボタンを受け入れないように設定されている場合を除きLabelItemます。LabelIteml->setAcceptedMouseButtons(0)

qgraphicsitem_castアイテムの種類をテストするために使用してみてください。各派生クラスはQGraphicsItem::type()、キャスト関数が型を識別できるように、個別の値を返すように再定義する必要があります。

メソッドを再定義することでアイテム自体のクリックを処理することもできます。これによりQGraphicsItem::mouseReleaseEvent()、邪悪なキャストの必要がなくなりますが、関数を削除するLayerView::mouseReleaseEvent()か、少なくとも基本クラスの実装を思い出す必要がQGraphicsView::mouseReleaseEvent()あります。イベントを受け取ります。

于 2012-04-16T00:52:45.903 に答える
0

私はこれらの奇妙な振る舞いを見てきました:それはほとんどバイナリの非互換性でした-c ++側は正しく見えます、そしてクラッシュはただ意味がありません。あなたが述べたように:あなたのコードでは、「選択された」変数が原因になることはありません。宣言を変更して、リンクされているすべてのオブジェクトを再コンパイルするのを忘れた可能性がありますか。すべてのオブジェクトファイルをクリーンアップして再コンパイルするだけです。99%のケースで私のために働いた。

于 2012-04-15T19:01:55.180 に答える