c++ - QT 中 Qpushbutton 内的鼠标按下事件

标签 c++ qt qpushbutton

我正在使用 qt Creator 制作计算器。有一个带有 gui 的默认主窗口窗体。在 mainwindow.cpp 中,我设置了 setMouseTracking(true) ,以在单击时获取鼠标坐标。但只有在主窗口窗体中的任何按钮外部单击时,我才能获取鼠标坐标。我想这与以下事实有关:当单击按钮时,已经生成了某种鼠标事件来处理该单击。 我需要在按钮内单击时获取坐标。我该怎么做?

最佳答案

首先:这是一个坏主意:)

您想要做的是捕获发送到子对象的事件。实现此目的的一种方法是重新实现子对象的事件处理程序。但是当你使用设计器来构建你的界面时,这就变得有点困难了。您必须将所有小部件升级为它们的重新实现版本。

另一种方法是使用Qt的“偶数过滤器”功能。您实现一个基于 QObject 的类,该类实现通用事件处理程序函数。然后将此对象作为“事件过滤器”安装在目标对象上。一个简单的偶数过滤器类如下所示;

class Filter : public QObject
{
protected:
    bool eventFilter(QObject *obj, QEvent *ev)
    {
        // obj : original receiver of the event
        // ev : any event that is sent to 'obj'
        QObject::event(obj, ev);
    }
};

及其用法:

Filter filterObject;
targetObject.installEventFilter(filterObject);

通常,您必须将此事件过滤器安装到用户界面中的所有对象(小部件)。但是,如果您将此过滤器安装到 QApplication 实例中,而不是一一进行,它将捕获应用程序中的所有事件。捕获后,您可以按事件类型和发起者过滤事件。

这是一个更完整的示例,它将捕获应用程序中的所有鼠标按下事件;

class ClickFilter : public QObject
{
protected:
    bool eventFilter(QObject *obj, QEvent *ev)
    {
        if (ev->type() == QEvent::MouseButtonPress && obj->inherits("QWidgetWindow"))
        {
            QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(ev);
            qDebug() << "clicked:" << mouseEvent->pos();
        }
        return QObject::eventFilter(obj, ev);
    }
};

您应该在 QApplication 实例上安装此事件过滤器对象,大概在 main 函数中;

QApplication a(argc, argv);
ClickFilter cf;
a.installEventFilter(&cf);

这将捕获应用程序中的所有事件(包括所有窗口 - 如果您的应用程序有多个主窗口),然后按类型和发起者对象类型过滤它们。

但是这段代码有一个问题。我使用了 QWidgetWindow 类型来检查事件发起者。那是因为如果子部件不处理事件,它就会传播到其父部件。因此,在某些情况下,ClickFilter::eventFilter 会针对同一点击事件多次调用。我选择了 QWidgetWindow,因为它看起来是一种简单的方法。问题是; QWidgetWindow 是一种内部 Qt 类型。在您的应用程序中使用它不是一个好主意。我确信还有另一种方法可以防止重复。

更重要的是,在 QApplication 实例上安装事件过滤器并不是一个好主意,它可能会导致性能问题。但另一方面,在我的应用程序中,我使用此方法轻松地将工具栏按钮的键盘快捷键添加到整个应用程序的工具提示中。你可以看到它 here

关于c++ - QT 中 Qpushbutton 内的鼠标按下事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33671689/

相关文章:

c++ - QStyleOptionButton 没有图标

c++ directshow filter 私有(private)接口(interface)

c++ - 在另一个类的声明中将参数传递给类构造函数

c++ - 如何在Qt中的MouseReleaseEvent中获取释放的按钮

c++ - 如何验证条件变量是否已初始化?

c++ - 无法将 QPushButton 信号连接到 QGraphicsView 插槽

c++ - 当参数按值传递时抛出异常

c++/qt - 没有这样的插槽 - 继承

c++ - Qt 5.5.1 找不到 libQt5XcbQpa.so.5

c++ - QList中QPushButton的坐标