web-dev-qa-db-de.com

Qt - Bestimmt die absolute Widget- und Cursorposition

Ich habe ein QWidget, das mehrere Kinder enthält. Das ultimative Ziel ist, in der Lage zu sein, von einem Widget zum anderen zu ziehen und etwas zwischen Widgets zu verschieben. Ich habe ein Signal an den Controller meines übergeordneten Widgets ausgelöst und kann feststellen, wann das Ziehen korrekt beginnt und endet. Mein aktuelles Problem ist das Feststellen, ob sich die Maus beim Hochfahren mit der Maus über dem Ziel-Widget befindet.

Ich war aufgeregt, als ich underMouse in den Dokumenten sah, aber es funktioniert nicht während Drag & Drop-Ereignissen (beim Testen schien es falsche Werte zurückzugeben). Andernfalls war es mein Ziel, das Rechteck mit dem Ziel-Widget zu finden und herauszufinden, ob es die Mauskoordinaten auf einem Mauszeiger enthielt. Ich kann nicht einfach contentsRect verwenden, da es Positionen relativ zu dem Widget zurückgibt, für das es aufgerufen wird. Ich dachte, dass mapToGlobal mir absolute Pixelwerte geben würde, aber es versagt auch weiterhin. Ich habe versucht, mapTo im Fenster des übergeordneten Widgets aufzurufen, aber das schien auch zu scheitern.

Der folgende Code zeigt die verschiedenen QRects und QPoints, die ich mit den verschiedenen Methoden erhalten habe. Vielleicht gibt es einen einfachen Fehler bei einem von ihnen, also habe ich sie alle zur Verfügung gestellt.

QRect relativeWidgetRect = targetWidget->contentsRect();
QRect *absoluteWidgetRect = new QRect(QWidget::mapToGlobal(relativeWidgetRect.topLeft()), QWidget::mapToGlobal(relativeWidgetRect.bottomRight()));
QRect *widgetRect = new QRect(mapTo(window(), relativeWidgetRect.topLeft()), mapTo(window(), relativeWidgetRect.bottomRight()));
QPoint relativeMousePos = QCursor::pos();
QPoint absoluteMousePos = QWidget::mapToGlobal(relativeMousePos);
QPoint widgetMousePos = mapTo(window(), relativeMousePos);

mapToParent funktioniert für meine Zwecke nicht, da das Ziel-Widget tatsächlich von einem untergeordneten Element des übergeordneten Elements der obersten Ebene übergeordnet wird.

Update Hier ist der Code, der am Ende funktioniert hat. In meinem Widget der obersten Ebene (das war ein Vorfahre der Quell- und Ziel-Widgets), habe ich Folgendes hinzugefügt:

QRect widgetRect = targetWidget->Geometry();
QPoint mousePos = targetWidget->mapFromGlobal(QCursor::pos());
if(widgetRect.contains(mousePos))
{
// Logic
}
31
Dave McClelland

Wie bereits gesagt, sollten Sie in diesem speziellen Fall statt targetWidget->geometry()contentsRect() verwenden.

Als nächstes frage ich mich, zu welcher Klasse der von Ihnen gepostete Code gehört. Die Methode QWidget::mapToGlobal() sollte aus dem QWidget aufgerufen werden, zu dem Ihre Koordinaten relativ sind. Wenn ich dich richtig verstanden habe, sollte es ungefähr so ​​aussehen:

QRect widgetRect = targetWidget->geometry();
widgetRect.moveTopLeft(targetWidget->parentWidget()->mapToGlobal(widgetRect.topLeft()));

Beachten Sie, dass QCursor::pos() bereits globale Bildschirmkoordinaten zurückgibt, sodass Sie hier nichts zuordnen müssen:

if (widgetRect.contains(QCursor::pos())) {
    /* swap widgets */
}

BEARBEITEN: Wahrscheinlich ist es noch besser, das Rect nicht global zuzuordnen, sondern die globale Cursorposition dem Widget zuzuordnen:

if (targetWidget->rect().contains(targetWidget->mapFromGlobal(QCursor::pos()))) {
    /* do stuff */
}
33
Elrohir

Vielleicht suchen Sie nach geometry() oder frameGeometry() in QWidget. Siehe hier für weitere Details.

2
yasouser

Diese PyQt-Methode gibt "True" zurück, wenn sich die Mausposition innerhalb des Rect-include -Falls des Widgets befindet, z. B. wenn sich der Mauszeiger über einer Kombinationsansicht im Widget befindet

def underMouse(self):
    pos = QtGui.QCursor.pos()
    rect = self.rect()
    leftTop     = self.mapToGlobal(QtCore.QPoint(rect.left(),rect.top()))
    rightBottom = self.mapToGlobal(QtCore.QPoint(rect.right(),rect.bottom()))
    globalRect = QtCore.QRect(leftTop.x(), leftTop.y(), rightBottom.x(), rightBottom.y() )
    return globalRect.contains(self.mapToGlobal(pos))
0
flipthefrog