向类添加新功能

Adding new functionality to a class

本文关键字:新功能 添加      更新时间:2023-10-16

我正在研究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) );
}
};