如何在不进行子类化的情况下拦截QWidget上的鼠标释放事件



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

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

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

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

因为托管小部件可以由多个Qt小部件组成,而且ClickableElement类是小部件管理器的基类,它实际上知道自己在管理什么类型的Qt小组件,所以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);

最新更新