访问QPushbutton点击槽中的坐标

Accessing the the coordinates in a QPushbutton clicked slot

本文关键字:坐标 QPushbutton 访问      更新时间:2023-10-16

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

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

有办法访问这个吗?

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

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

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

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

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

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

这应该告诉你当用户点击时鼠标在按钮上的位置。你可以从这里开始。

基于@Liz的简单机制,我所做的是:这是在pressed()时调用的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);
    }
}