2011-08-11 7 views
2

私はクリックしたときに違った扱いをする2つの領域を持つ画像を持つQPushButtonを持っています。画像上での位置決めのために、私は実際には2つの画像に別々のボタンを使用することはできません。QPushbuttonのクリックされたスロットの座標にアクセスする

私がしたいのは、クリックを処理しているスロットで、クリックした座標を確認してクリックされた領域を特定することです。

これにアクセスする方法はありますか?

答えて

3

これは最初に気になるものです。

  • QPushButtonから派生する独自のクラスを作成してください。
  • 必要なマウスイベント(mousePressEventmouseReleaseEvent)をオーバーライドし、基本クラスの実装を呼び出す前に、オブジェクトのプロパティをsetPropertyを使用してマウスクリックの位置に設定します。 (位置はイベントパラメータから取得できます)
  • イベントを処理するスロットでは、sender()を使用してボタンを取得し、property()を使用してプロパティを読み取ります。

オブジェクトを基本クラス(QPushButton*)として扱う必要がない場合は、マウスイベントを含む新しい信号を作成してスロットに追加するだけです。それで、あなたはその財産をまったく必要としません。

1

QCursor :: pos()を使用すると、現在のマウスの位置を取得できます。グローバルな画面座標でのカーソルの位置(ホットスポット)を返します。

現在、画面の座標は使いにくく、おそらくあなたが望むものではありません。幸いにも、画面座標をウィジェットに相対的な座標に変換する方法があります。

QPoint _Position = _Button->mapFromGlobal(QCursor::pos()); 

これは、ユーザーがクリックしたときのマウスの位置を示します。そしてそこからそれを取ることができます。

0

@ Lizのシンプルなメカニズムを基にして、私がしたことはここにあります。これは、pressed()で呼び出されるが、他の状況に一般化されるスロットメソッドにあります。 pushButton-> geometry()を使用すると、既にグローバル空間にある座標が得られるので、mapFromGlobalを使用する必要はありません。

void MainWindow::handlePlanButtonPress() 
{ 
    int clickX = QCursor::pos().x(); 
    int middle = m_buttonPlan->geometry().center().x(); 

    if (clickX < middle) { 
     // left half of button was pressed 
     m_buttonPlan->setStyleSheet(sStyleLargeBlueLeft); 
    } else { 
     // right half of button was pressed 
     m_buttonPlan->setStyleSheet(sStyleLargeBlueRight); 
    } 
} 
関連する問題