使用QWidget的装饰模式是否可行?

时间:2015-12-18 03:06:41

标签: qt design-patterns

根据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*)

1 个答案:

答案 0 :(得分:1)

装饰者模式是一个指导原则,而不是规则。您完全可以修改不适合您目的的模式。在这种情况下,您只需要关注与定位有关的QWidget部分,因此覆盖其他任何方法都没有优势。

您似乎只想修改QWidget中某些事件的行为。幸运的是,QObject中已经存在一种机制来做这样的事情,它被称为事件过滤器。

有一个很好的示例,说明如何在Qt documentation中使用它,并且上面改进的一个好处是你可以使用同一个对象来过滤许多QWidget s每个小部件都有一个过滤器。