2010-12-15 38 views
30

私は複数の子を含むQWidgetを持っています。究極の目標は、あるウィジェットから別のウィジェットにドラッグアンドドロップし、ウィジェット間で何かを動かすことです。親ウィジェットのコントローラーに信号が発せられ、ドラッグがいつ開始して正しく終了するかを判断できます。私の現在の問題は、マウスが上向きのときにターゲットウィジェットの上にマウスがあるかどうかを判断することです。Qt - 絶対ウィジェットとカーソル位置を決定する

ドキュメント内でunderMouseを見たときに興奮しましたが、ドラッグアンドドロップイベント(テストしたときに間違った値を返したようです)では機能しません。これに失敗した私の目標は、ターゲットウィジェットを含む矩形を見つけ、マウス上にマウス座標が含まれているかどうかを調べることでした。 contentsRectを単に使うことはできません。なぜなら、呼び出されているウィジェットに相対的な位置を返すからです。私はmapToGlobalが私に絶対画面のピクセル値を与えるだろうと思ったが、それでも失敗する。親ウィジェットのウィンドウでmapToを呼び出そうとしましたが、それも失敗したようです。

以下は、さまざまな方法で得られたさまざまなQRectとQPointを示すコードです。たぶん、そのうちの1つに単純なエラーがあるので、それらをすべて提供しました。

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ターゲットウィジェットが実際に最上位の親の子が親にされているので、私の目的のために動作しません。

更新ここで、作業が終了したコードがあります。私のトップレベルのウィジェットでは(つまり、ソースとターゲットの両方のウィジェットの祖先だった)、私はこれを追加しました:たぶん、あなたはQWidgetの中geometry()またはframeGeometry()ため

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

答えて

32

この特殊なケースでは、contentsRect()ではなく、targetWidget->geometry()を使用するべきです。

次の投稿コードがどのクラスに属しているのだろうか。メソッドQWidget::mapToGlobal()は、座標が相対的なQWidgetから呼び出される必要があります。私は右のあなたを得た場合、それはこのようなもののようになります。

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

EDIT:多分それはだ

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

その後QCursor::pos()はすでに、ここに何かをマップするので、必要にグローバル画面座標を返しません注意してください矩形をグローバルにマップするのではなく、グローバルカーソルの位置をウィジェットにマップする方が良いでしょう:

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

アハあるとして例を含め、ありがとうございました!私は私の問題を解決したコードで私の質問を更新しました。 –

2

探しています。詳細は、hereを参照してください。

0

このPyQtメソッドは、マウスの位置がウィジェット内にある場合にTrueを返しますトンのRECT - 例えば、マウスコンボビュー上内部ウィジェット

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