根据wikipedia,我需要
在Decorator类中,将所有“Component”方法重定向到 “组件”指针;
但是QWidget
有太多方法可以重定向。
例如,我想创建一个可移动的小部件装饰器:
class Moveable : public QWidget
{
Q_OBJECT
public:
explicit Moveable(QWidget * widgetToBeDecorated){
this->widgetToBeDecorated = widgetToBeDecorated;
}
~Moveable();
protected:
void mousePressEvent(QMouseEvent* e) override {
lastPoint = e->pos();
widgetToBeDecorated->mousePressEvent(e);
}
void mouseMoveEvent(QMouseEvent* e) override {
auto offset = e->pos()-lastPoint;
lastPoint = e->pos();
widgetToBeDecorated->move(widgetToBeDecorated->pos()+offset);
widgetToBeDecorated->mouseMoveEvent(e);
}
void mouseReleaseEvent(QMouseEvent* e) override {
widgetToBeDecorated->mouseReleaseEvent(e);
}
private:
QWidget* widgetToBeDecorated;
QPoint lastPoint;
};
我是否需要重定向其他方法,例如show()
,paintEvent(QPaintEvent*)
?
答案 0 :(得分:1)
装饰者模式是一个指导原则,而不是规则。您完全可以修改不适合您目的的模式。在这种情况下,您只需要关注与定位有关的QWidget
部分,因此覆盖其他任何方法都没有优势。
您似乎只想修改QWidget
中某些事件的行为。幸运的是,QObject
中已经存在一种机制来做这样的事情,它被称为事件过滤器。
有一个很好的示例,说明如何在Qt documentation中使用它,并且上面改进的一个好处是你可以使用同一个对象来过滤许多QWidget
s每个小部件都有一个过滤器。