我正在编写一个具有 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] 删除。
我来说两句