2016-04-22 69 views
2

我改變了一個QWidget的父窗口部件,我點擊拖動周圍的家長的面積小部件的目的。我需要更改父母,而我在mousePressEvent()回調中,因爲之前父母的框架非常有限。更改QWidget的父母,同時在mousePressEvent()不工作

這將產生看似失去鼠標事件,不得不再次單擊之前,我可以開始響應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