C++ 如何根据Qt中的图形形状,仅使按钮的一部分对用户操作(单击/hower/etc)作出反应?

C++ 如何根据Qt中的图形形状,仅使按钮的一部分对用户操作(单击/hower/etc)作出反应?,c++,qt,user-interface,C++,Qt,User Interface,这个问题有点难解释,但我会试试看 我有一个按钮的图像: 我也有一些它的动画,比如(带有单个循环的gif,重新加载它以查看动画!): 还有,我有一种模式: 那么,现在的问题是:当鼠标位于图案的黑色部分时,如何使按钮做出反应(例如单击/显示/等等),并且当鼠标超出该图案的范围时,如何禁止此类反应?当然,不用修改图形文件。当然,模式本身应该是隐形的 我想借助C++和QT.< /P>来实现这一点。 请至少告诉我路径,我应该寻找哪些Qt函数/类!因为现在我完全迷路了。有一个简单的方法可以做到这一点:

这个问题有点难解释,但我会试试看

我有一个按钮的图像:

我也有一些它的动画,比如(带有单个循环的gif,重新加载它以查看动画!):

还有,我有一种模式:

那么,现在的问题是:当鼠标位于图案的黑色部分时,如何使按钮做出反应(例如单击/显示/等等),并且当鼠标超出该图案的范围时,如何禁止此类反应?当然,不用修改图形文件。当然,模式本身应该是隐形的

我想借助C++和QT.< /P>来实现这一点。
请至少告诉我路径,我应该寻找哪些Qt函数/类!因为现在我完全迷路了。

有一个简单的方法可以做到这一点:

屏蔽小部件仅在其可见部分接收鼠标事件

但是,这也会遮罩图形,因此您可能需要尝试其他布线:

  • 子类化QPushButton
  • 重写mousePressEvent,将其夹在面具上
  • 重写paintEvent
  • 我最后列出了重写绘制事件,因为没有它,您可能会获得所需的效果。但是,如果您希望具有动画,则可能需要


    我还建议使用多边形遮罩(通过QPolygon)而不是位遮罩和containsPoint(…)来确定遮罩区域内是否发生鼠标事件。根据我的经验,这样做不那么痛苦,也很容易调试:您可以添加代码在图形上绘制多边形,当您满意不再需要时删除该代码。

    有一种简单的方法可以做到这一点:

    屏蔽小部件仅在其可见部分接收鼠标事件

    但是,这也会遮罩图形,因此您可能需要尝试其他布线:

  • 子类化QPushButton
  • 重写mousePressEvent,将其夹在面具上
  • 重写paintEvent
  • 我最后列出了重写绘制事件,因为没有它,您可能会获得所需的效果。但是,如果您希望具有动画,则可能需要


    我还建议使用多边形遮罩(通过QPolygon)而不是位遮罩和containsPoint(…)来确定遮罩区域内是否发生鼠标事件。根据我的经验,这样做不那么痛苦,也很容易调试:您可以添加代码在图形上绘制多边形,当您满意不再需要时删除该代码。

    我可以考虑这样做的一种方法是,通过调用
    void QObject::installEventFilter,在特定按钮上安装事件过滤器(QObject*FilterObject)
    按钮的方法。可以找到文档

    归根结底,它是基于二进制图像创建一个专门用于过滤鼠标事件的QObject。您所要做的就是覆盖
    bool QObject::eventFilter(QObject*watched,QEvent*event)
    方法,然后将该对象安装为按钮的筛选器。作为此筛选器类的构造函数的一部分,将对二进制图像的引用传递给它。此二进制图像引用将作为筛选器对象中的成员变量,我们可以使用它来决定按钮的哪些像素响应鼠标事件

    eventFilter
    方法中:

    • 检查事件类型,如果它不是鼠标事件,不要自己处理该事件,将其传递给父类
    • 如果它是一个,那么你是在做生意
    • 使用相应的方法
      x()
      y()
    • 查看存储为成员变量的二进制图像。如果此时二进制图像为
      true
      ,则执行一项操作,否则执行其他操作
    这个过滤器类应该足够通用,您可以为不同的按钮/小部件创建多个具有不同二进制图像的实例


    希望这有帮助。

    我可以想到的一种方法是,通过调用按钮的
    void QObject::installEventFilter(QObject*filterObj)
    方法,在特定按钮上安装事件过滤器。可以找到文档

    归根结底,它是基于二进制图像创建一个专门用于过滤鼠标事件的QObject。您所要做的就是覆盖
    bool QObject::eventFilter(QObject*watched,QEvent*event)
    方法,然后将该对象安装为按钮的筛选器。作为此筛选器类的构造函数的一部分,将对二进制图像的引用传递给它。此二进制图像引用将作为筛选器对象中的成员变量,我们可以使用它来决定按钮的哪些像素响应鼠标事件

    eventFilter
    方法中:

    • 检查事件类型,如果它不是鼠标事件,不要自己处理该事件,将其传递给父类
    • 如果它是一个,那么你是在做生意
    • 使用相应的方法
      x()
      y()
    • 查看存储为成员变量的二进制图像。如果此时二进制图像为
      true
      ,则执行一项操作,否则执行其他操作
    这个过滤器类应该足够通用,您可以为不同的按钮/小部件创建多个具有不同二进制图像的实例


    希望这能有所帮助。

    我忘记了细节,但在Qt中,你可以使用一个掩码来选择要触摸的图像的“活动”部分。不过,你必须进入图像层。我忘记了细节,但在Qt中,你可以使用一个掩码来选择图像的“活动”部分触摸。你必须进入图像层的东西,但是。你能吗