2016-04-22 7 views
2

Ich ändere das übergeordnete Widget eines QWidget, dass ich für das Ziehen dieses Widget um den Bereich des übergeordneten Elements klicke. Ich muss den Eltern ändern, während ich im mousePressEvent() Rückruf bin, weil der Rahmen des vorherigen Elternteils sehr begrenzt ist.Ändern der QWidget übergeordnetes während einer MausPressEvent() funktioniert nicht

Dies erzeugt das unbeabsichtigte Ergebnis scheinbar das Mausereignis zu verlieren und muss erneut klicken, bevor ich auf mouseMoveEvent() reagieren kann.

Alles, was ich in dem Fall habe, wenn dies passiert, ist folgendes.

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

Wenn ich entfernen Sie den setParent() nennen es wie vorgesehen funktioniert. Wie mache ich es so, dass ich immer noch die Eltern ändern kann, aber es scheint nicht, als ob das aktuelle Objekt mein Mauszeiger zerstört und ein neues erstellt wird.

+0

Es scheint, als ob Sie Drag & Drop anstelle des Eltern-Switch-Hacks verwenden sollten. – thuga

Antwort

2

Ich hatte ein ähnliches Problem mit dem Ändern einer QDockWidget Eltern während MausEreignisse. Hier ist, was ich aus dem Debuggen von Qt und der Lösung gelernt habe, die ich mir ausgedacht habe, und am Ende habe ich es trotzdem nicht genommen: Tu es nicht, es wird anderes unerwünschtes Qt-Verhalten verursachen.

Was ich tat, war MouseMove-Ereignisse vor dem "Erneutes Elternteil" zu senden und danach, um den "Ziehen" -Mechanismus erneut auszulösen (weil das erneute Erziehen es aufhörte). Dies war spezifisch für QDockWidgets, ich bin mir nicht sicher, ob dies auf Ihre Situation zutrifft. Allerdings ist hier der entsprechende Code:

// 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); 

Sie haben einige Qt-Code, um zu debuggen, vollständig zu verstehen, was in Ihrem speziellen Fall vor sich geht. Und als ob das nicht genug wäre: Verschiedene Qt-Versionen könnten sich auch anders verhalten.

Wie Sie sehen können, hatte ich eine Menge "Spaß" dabei. Also viel Glück und möge die QForce bei dir sein.

+0

Das scheint so peinlich, wenn man es mit anderen Plattformen vergleicht, es ist verrückt ... Danke für die Antwort tho! –

+0

Nun, Sie müssen den SetParent (...) Aufruf debuggen und sehen, was dort vor sich geht. Es kann eine Lösung geben, die unerwünschte Effekte vermeiden kann, die jedoch sehr spezifisch für Ihre Situation sein können. Möglicherweise möchten Sie jedoch überprüfen, ob für Ihr Problem eine völlig andere Lösung vorhanden ist, da das Ändern von Eltern während Mausereignissen die genannten Nebenwirkungen verursacht. – CppChris

Verwandte Themen