访问QPushbutton单击插槽中的坐标

时间:2011-08-11 15:21:25

标签: c++ qt

我有一个QPushButton,其图像有两个区域,我想在点击时以不同的方式处理。由于图像上的定位,我无法为这两个图像使用单独的按钮。

我想要做的是,在我处理点击的插槽中,检查点击的坐标以确定点击了哪个区域。

有没有办法访问它?

3 个答案:

答案 0 :(得分:3)

这是首先想到的。它应该有效,尽管可能有一种更简单的方法:

  • 创建自己的类,该类派生自QPushButton
  • 覆盖必要的鼠标事件(mousePressEventmouseReleaseEvent),并在调用基类实现之前,使用setProperty在鼠标单击位置设置对象中的属性。 (该位置可从事件参数中获得。)
  • 在处理事件的插槽中,使用sender()获取按钮,然后使用property()读取属性。

如果您不需要将对象视为基类(QPushButton*),则可以创建一个包含鼠标事件的新信号并将其附加到您的插槽中。那你根本不需要这个属性。

答案 1 :(得分:1)

您可以使用QCursor :: pos()获取当前鼠标位置,该位置返回全局屏幕坐标中光标(热点)的位置。

现在屏幕坐标不易使用,可能不是你想要的。幸运的是,有一种方法可以将屏幕坐标转换为相对于小部件的坐标。

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

这应该告诉您用户点击鼠标时按钮的位置。你可以从那里拿走它。

答案 2 :(得分:0)

基于@Liz的简单机制,这就是我所做的;这是在slot()上调用的slot方法,但是推广到其他情况。请注意,使用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);
    }
}