2011-08-11 55 views
2

我有一個QPushButton與圖像有兩個區域,我想單擊時處理不同。由於圖像上的位置,我無法真正爲兩幅圖像使用單獨的按鈕。訪問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); 
    } 
}