向类添加新功能
Adding new functionality to a class
我正在研究Qt4库,我想为项目中QWidget
的所有子级添加一些功能。我需要覆盖所有小部件mousePressEvent
。显然,我不需要在我使用的每个特定小部件中覆盖它(我使用其中的许多,我遵循 DRY 规则),而是创建一个Foo
类:
class Foo : public QWidget
{
Q_OBJECT
protected:
/* implementation is just a test */
virtual void mousePressEvent(QMouseEvent*) { this->move(0,0); }
};
并从中派生我的按钮:
class FooButton : public QPushButton , public Foo
{
public:
FooButton (QWidget* parent) : QPushButton(parent) { };
};
但该事件似乎并未被覆盖...我做错了什么? 提前谢谢。
对于 mousePressEvent 访问,请尝试 QObject::installEventFilter()。
http://doc.qt.digia.com/stable/qobject.html
你现在从QWidget继承了两次。这是有问题的(参见钻石问题)。
相反,请删除Foo
类并将自定义鼠标按下事件处理程序移动到FooButton
类:
class FooButton : public QPushButton
{
Q_OBJECT
protected:
/* implementation is just a test */
virtual void mousePressEvent(QMouseEvent*) { this->move(0,0); }
public:
FooButton (QWidget* parent) : QPushButton(parent) { };
};
如果这不适合应用程序的设计,请尝试改用虚拟继承。也就是说,将Foo
更改为:
class Foo : public virtual QWidget
如果这没有帮助,您应该遵循其他答案的建议并安装事件处理程序。
(您可以在其维基百科文章中阅读有关虚拟继承的信息。
我怀疑问题是你从QWidget
继承了两次,一次通过QPushButton
,一次通过Foo。
从你表达问题的方式来看,我假设你想为不同类型的小部件这样做,因此不想对QPushButton,QLabel,QCheckBox等进行子类化。如果不是这种情况,那么您应该使用Nikos的答案。
如果没有,最好的办法可能是使用事件过滤器。
class MousePressFilter : public QObject {
Q_OBJECT
public:
MousePressFilter(QObject *parent) : QObject(parent) { }
protected:
bool eventFilter(QObject *watched, QEvent *event) {
QWidget *widget = dynamic_cast<QWidget*>(watched);
widget->move(0,0);
return false;
}
};
然后在你的Foo类构造函数中:
class Foo {
Foo() {
installEventFilter( new MousePressFilter(this) );
}
};
相关文章:
- c++20[[no.unique_address]]中的新功能是什么
- 如果我想在没有更新编译器的情况下使用新功能,该怎么办?
- 重载算子新功能的限制
- 设计模式,以避免不必要地添加抽象函数以适应新功能
- 将新元素添加到列表中,并返回对该元素的引用?
- 如何组织 git 工作流以修复错误并同时引入新功能
- 新功能"synchronized"块在C++中提供了什么优势?
- C++17 'inline variable' vs 'extern' 关键字继承自 C 的新功能
- 将新值添加到链表中
- 如何将搜索功能添加到数组中
- QML ListView将新行添加到模型中的子向量
- 将新元素添加到动态数组C
- 推送功能(将新节点添加到列表顶部)C
- 如何防止 clang 格式向新行添加单个分号
- 将功能添加到默认复制构造函数中
- 如何制作新功能并将其传递到另一个功能
- 我不能在函数中使用新功能C++构建
- C 将类成员功能添加到地图中
- 如何将搜索功能添加到WXWIDGET C 中的TextCtrl
- 向类添加新功能