如何在没有子类化的情况下拦截 QWidget 上的鼠标释放事件?

阿拉斯泰尔

我正在编写一个具有 UI 管理器的应用程序,允许用户从主窗口添加和删除小部件并配置它们。当用户 ctrl-alt-right 单击小部件时,我需要打开小部件的配置对话框以允许用户更改各种属性。

我有一个从纯虚拟基类继承的类,以便可以使用通用接口管理所有托管小部件。我有一个检测 ctrl-alt-右键单击的子类。然后小部件管理器从该子类继承。

Managed widget virtual base class (ViewElement)
                     |
                     V
    Clickable sub-class (ClickableElement)
   /                 |                    \
  V                  V                     V
Label widget     Button widget         etc. etc.

每个小部件管理器都包含一个或多个某种类型的 Qt 小部件。

因为被管理的widget可以由多个Qt Widget组成,并且因为ClickableElement类是widget manager的一个基类,它实际上知道它正在管理什么样的Qt Widget,所以ClickableElement类不能从QWidget继承。

我需要 ClickableElement 类才能检测 Qt 小部件上何时有鼠标释放事件。由于以下原因,ClickableElement 无法从托管 QWidget 实例继承,因此我无法实现virtual mouseReleaseEvent().

我不想实现数百个子类,每个 Qt 小部件类型一个,这样我就可以实现virtual mouseReleaseEvent()并让它发送自定义信号。

因此,我需要将一个插槽连接()到来自 QWidget 实例的相关信号。

当鼠标释放事件发生在 QWidget 上时,它会发送什么信号?

阿拉斯泰尔

在 ClickableElement 类标头中,声明eventFilter()如下:

bool eventFilter(QObject *obj, QEvent *event) override;

按照以下方式实现该功能:

bool ClickableElement::eventFilter(QObject *obj, QEvent *event)
{
    bool result = false;

    if (QEvent::MouseButtonRelease == event->type()) {
        QMouseEvent *mouse_event = dynamic_cast<QMouseEvent *>(event);

        ...

    }

    if (!result) {
        result = QObject::eventFilter(obj, event);
    }

    return result;
}

在每个小部件类型的子类中,进行以下调用:

m_widget->installEventFilter(this);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在QWidget中的matplot画布上跟踪鼠标?

如何在没有QWidget的情况下使用TabWidget启动项目

如何在Graphics View上移动qwidget?

默认情况下如何在没有任何鼠标事件的情况下显示标记内容?

如何在没有鼠标/拖动/等的情况下切换到新场景。事件?

如何在 QWidget 内的所有组件上安装事件过滤器

如何在Qwidget中插入Qwidget

macos 上的 qemu:如何释放鼠标?

反应如何在没有事件的情况下防止 setState 上的默认值

如何在 QWidzard 上添加 QFrame 或 QWidget 作为 QWizardPage

如何在没有绝对鼠标移动的情况下将鼠标移动到屏幕上的任何位置?

将QWidget的蒙版区域上的鼠标事件传输到其父级

如何正确读取触摸事件并在QWidget Qt上获得位置

QWidget关闭后如何打开QWidget?

带有“无法在没有 QApplication 的情况下创建 QWidget”的 QmlPluginDump 错误

anylogic:检测鼠标点击按下和释放事件

如何在没有返回空列表的情况下对 Python 列表进行子类化?

QML-当我不接受鼠标按下事件时,无法获得鼠标释放事件

如何过滤掉鼠标单击释放事件?

在WPF中释放鼠标左键时如何触发事件?

在所有子 QWidget 上检测拖放

C#如何在没有bool的情况下最终进行尝试捕获以释放资源?

如何在没有 docker restart 的情况下释放 docker 容器使用的空间?

带有双击的QWidget

如何设计QWidget?

如何更新QWidget的内容?

如何在没有jQuery的情况下制作幻灯片(上/下)?

如何在没有鼠标的情况下通过终端卸载“USB Overdrive”?

如何在没有鼠标滚轮的情况下缩放netbeans中的文本?