2016-04-22 9 views
2

親の領域をドラッグする目的でクリックしたQWidgetの親ウィジェットを変更しています。前の親のフレームが非常に限られているので、私はmousePressEvent()コールバックにいる間に親を変更する必要があります。mousePressEvent()でQWidgetの親を変更しても動作しません

これにより、マウスイベントが一見失われてしまい、再度クリックしてからmouseMoveEvent()への応答を開始するという意図しない結果が生じます。

このような場合には、次のようなことが起こります。

cardWidget->setParent(feltWidget); 
cardWidget->show(); 

は、私はそれが意図したとおりに動作setParent()呼び出しを削除した場合。どのように私はまだ親を変更することができるようにするが、現在のオブジェクトが私のマウスカーソルが破壊され、新しいが作成されるようには表示されません。

+0

親スイッチのハックの代わりにドラッグアンドドロップを使用するように思えます。 – thuga

答えて

2

mouseEventsの間にQDockWidgetの親を変更することに関連する同様の問題がありました。ここで私がQtのデバッグと私が思いついた解決策から学んだのは、私はとにかく取っていないことです。それをしないと、他の望ましくないQtの動作が起こります。

私がしたことは、 "再育成"の前にMouseMoveイベントを送信してから、再び "ドラッグ"メカニズムをトリガーすることでした。これはQDockWidgetsに固有のものでしたが、これがあなたの状況に当てはまるかどうかわかりません。しかし、ここに関連するコードは次のとおりです。

// end the drag before re-parenting 
    QMouseEvent endDrag(QEvent::NonClientAreaMouseMove, QCursor::pos(), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); 
    const bool handledEndDrag = QApplication::sendEvent(&dockWidget, &endDrag); 
    assert(handledEndDrag); 

    // set this attribute to avoid a hide()-event spoiling the drag-and-drop 
    dockWidget.setAttribute(Qt::WA_WState_Hidden, true); 

    // ... do re-parenting 

    dockWidget.setAttribute(Qt::WA_WState_Hidden, false); 

    // trigger start drag again 
    QMouseEvent* startDrag = 
     new QMouseEvent(QEvent::NonClientAreaMouseButtonPress, dockWidget.mapFromGlobal(QCursor::pos()), 
         Qt::LeftButton, Qt::LeftButton, QApplication::keyboardModifiers()); 
    QApplication::postEvent(&dockWidget, startDrag); 

    // fake this mouse move event to continue dragging 
    QMouseEvent mouseMove(QEvent::MouseMove, current->pos(), current->pos(), Qt::NoButton, 
       QApplication::mouseButtons(), QApplication::keyboardModifiers()); 
    const bool handledMouseMove = QApplication::sendEvent(m_dock, &mouseMove); 
    assert(handledMouseMove); 

あなたはあなたの特定のケースで何が起こっているかを完全に理解するために、いくつかのQtのコードをデバッグする必要があります。そして、これでは不十分であるかのように、異なるQtのバージョンも異なって動作するかもしれません。

わかりますように、私はこれをやって "楽しい"をたくさん持っていました。だから幸運とQForceはあなたと一緒にいるかもしれません。

+0

これは他のプラットフォームと比べると非常に扱いにくいようです。それは狂気です...答えてくれてありがとう! –

+0

さて、あなたはsetParent(...)呼び出しをデバッグし、そこに何が起こっているのかを見なければなりません。あなたの望ましくない影響を避けることができる解決策があるかもしれませんが、それはあなたの状況に非常に特有の可能性があります。ただし、マウスイベント中に親を変更すると、前述の副作用が発生するため、問題の解決方法が異なるかどうかを確認したい場合があります。 – CppChris

関連する問題