/*!
@~chinese
@file DEnhancedWidget.h
@class Dtk::Widget::DEnhancedWidget
@brief 对目标控件进行监听，并发射相应的信号
@details QWidget 中只有少量的信号用于通知和窗口相关的属性变化，常用的如 x y width height等属性
的改变只能通过继承重写对应的事件才能知晓。DEnhancedWidget 中通过使用事件过滤器监听目标控件的事件，
收到对应事件之后转换为自身的信号发射出来，以此来实现对 QWidget 对象的信号扩展。
### 示例代码
#### main.cpp
```cpp
#include <DApplication>
#include <DMainWindow>
#include <DWidget>
#include "denhancedwidget.h"

DWIDGET_USE_NAMESPACE

int main(int argc, char *argv[])
{
    DApplication app(argc, argv);

    // 创建第一个基本的 DWidget 控件 w1
    DWidget *w1 = new DWidget;
    w1->show();

    // 创建第二个基本的 DWidget 控件 w2
    DWidget *w2 = new DWidget();
    w2->show();
    // 创建一个 DEnhancedWidget 的实例 ew ，并将 w1 作为其父控件
    DEnhancedWidget *ew = new DEnhancedWidget(w1);

    // 连接 DEnhancedWidget 的 xChanged 信号到一个 lambda 表达式槽函数，用于输出 x 的值
    DWidget::connect(ew, &DEnhancedWidget::xChanged, [] (int x) {qDebug() << x;});

    // 设置 DEnhancedWidget 的目标控件为 w2
    ew->setTarget(w2);

    // 移动 w1 控件，并不会有输出
    w1->move(100, 0);
    // 移动 w2 控件，有输出
    w2->move(200, 0);
    w2->move(300, 0);
    w2->move(400, 0);
}
```

@property Dtk::Widget::DEnhancedWidget::target
@brief 要监听的目标控件，每一个 DEnhancedWidget 对象只能关联到一个 QWidget 对象。
当 target 改变后，所有的信号和旧的 target 都不再有任何关系。
@note 可读可写

@property Dtk::Widget::DEnhancedWidget::enabled
@brief 值为 true 时过滤 target 控件的事件发送信号。否则卸载事件过滤器，控件属性改变时也不会发出信号。
@note 可读可写

@fn void DEnhancedWidget::xChanged(int x)
@brief 这个信号在目标控件的 x 坐标改变后被发送
@param[in] x 改变的 x 轴坐标

@fn void DEnhancedWidget::yChanged(int y)
@brief 这个信号在目标控件的 y 坐标改变后被发送
@param[in] y 改变的 y 轴坐标
  
@fn void DEnhancedWidget::positionChanged(const QPoint &point)
@brief 这个信号在目标控件的坐标改变后被发送
@param[in] point 改变的位置坐标

@fn void DEnhancedWidget::widthChanged(int width)
@brief 这个信号在目标控件的宽度改变后被发送
@param[in] width 改变的宽度大小

@fn void DEnhancedWidget::heightChanged(int height)
@brief 这个信号在目标控件的高度改变后被发送
@param[in] height 改变的高度大小

@fn void DEnhancedWidget::sizeChanged(const QSize &size)
@brief 这个信号在目标控件的大小改变后被发送
@param[in] size 改变的大小

@fn void DEnhancedWidget::targetChanged(QWidget *target)
@brief 这个信号在属性 DEnhancedWidget::target 被改变后发送
@param[in] target 目标控件

@fn void DEnhancedWidget::enabledChanged(bool enabled)
@brief 这个信号在属性 DEnhancedWidget::enabled 被改变后发送
@param[in] enabled 是否可用

@fn void DEnhancedWidget::showed()
@brief 这个信号在目标控件显示后发送

@fn DEnhancedWidget::DEnhancedWidget(QWidget *w, QObject *parent):
@brief DEnhancedWidget::DEnhancedWidget 构造函数
@param[in] w 初始时指定的 target 控件
@param[in] parent 父对象，直接传递给基类
@sa DEnhancedWidget::target
@sa QObject::parent

@fn void DEnhancedWidget::setTarget(QWidget *target)
@brief 设置目标控件，并且在目标控件发生改变时更新事件过滤器
@param[in] target
@sa DEnhancedWidget::target

@fn void DEnhancedWidget::setEnabled(bool enabled)
@brief 设置控件是否可用，并根据情况进行事件过滤器的安装或卸载
@param[in] enabled
@sa DEnhancedWidget::enabled

 */

