私のアプリケーションでは、私はmouseReleaseEvent()
を確認してから、マウスがイベントを処理する位置にアイテムを伝えています。QGraphicsView
を再実装しました。Qtアプリケーションに奇妙なバグがあります
私の見解ではQGraphicsItems
の2つのうちどれがクリックされているか(またはボタンがリリースされているか)を確認し、それぞれのイベントを処理します。
私のウィジェットのコンストラクタでは、項目がリリースを検出したときと同じ方法を使用して、デフォルトで選択された項目の1つを設定します。
私がデバッグしたとき、LabelItem
の場合、selectはコンストラクタで問題なく呼び出されました(そして、アプリケーションを最初に起動したときの結果は明らかです)。しかし、アイテムをクリックすると、アプリケーションは終了します。私はselect関数に入っているのを見ましたが、それを残していませんでした。だから問題はここにある。
これは非常に奇妙です。なぜなら、select関数は単なる1行のセッターであるからです。
void LabelItem::select()
{
selected = true;
}
これはです。
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);
}
}
}
私が関数内でラインをコメントアウトしたとき、私はエラーを起こさなかった。他のQGraphicsItem
、CheckBoxItemのデバッグはしていませんが、アプリケーションはそのイベントに対しても終了します。問題は関連していると思われるので、今はselect
に集中しています。
私はこれを引き起こした可能性があり、なぜこれが起こっているのかについては何の手がかりもありません。私の過去の経験から、私はそれが私が馬鹿げた考えをしていない単純なものだとはかなり確信していますが、私は何が分かりません。
ヘルプは本当に感謝します。
'mouseReleaseEvent()'関数のコードを表示できますか? – alexisdm
nullまたは無効な 'this'ポインタを逆参照しようとすると、この動作は起こります。つまり、ヌルまたは無効なオブジェクトに対して 'select'を呼び出すことができ、代入で' this'を逆参照することができます。 – Lol4t0