3

我有一个带有图像的 QPushButton,该图像具有两个我想在单击时以不同方式处理的区域。由于图像上的定位,我不能真正为这两个图像使用单独的按钮。

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

有没有办法访问这个?

4

3 回答 3

4

这是首先想到的。它应该可以工作,尽管可能有更简单的方法:

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

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

于 2011-08-11T15:40:47.817 回答
2

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

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

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

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

于 2011-08-11T15:59:38.180 回答
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);
    }
}
于 2017-01-08T17:47:22.717 回答