/*!
@~chinese
@file dboxwidget.h
@ingroup dtkwidget
@class Dtk::Widget::DBoxWidget
@brief DBoxWidget提供了一个自适应子控件大小的Widget
@details
在Qt编程中，使用QBoxLayout设置控件是很常见的，DBoxWidget提供了方便的封装，会根据需要的大小自动
设置DBoxWidget的宽高。

下面提供DBoxWidget的例子：

项目目录结构在同一目录下

## CMakeLists.txt

```cmake
cmake_minimum_required(VERSION 3.1.0)                # 指定cmake最低版本

project(example VERSION 1.0.0 LANGUAGES CXX) # 指定项目名称, 版本, 语言 cxx就是c++

set(CMAKE_CXX_STANDARD 11)                           # 指定c++标准
set(CMAKE_CXX_STANDARD_REQUIRED ON)                  # 指定c++标准要求,至少为11以上

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)                # 支持 clangd

if (CMAKE_VERSION VERSION_LESS "3.7.0")              # 如果cmake版本小于3.7.0
    set(CMAKE_INCLUDE_CURRENT_DIR ON)                # 设置包含当前目录
endif()

find_package(Qt5 REQUIRED COMPONENTS Widgets)        # 寻找Qt5组件Widgets
find_package(Dtk REQUIRED COMPONENTS Widget)         # 寻找Dtk组件Widget

add_executable(${PROJECT_NAME}                       # 生成可执行文件
    main.cpp
)

target_link_libraries(${PROJECT_NAME} PRIVATE        # 添加需要链接的共享库
    Qt5::Widgets
    ${DtkWidget_LIBRARIES}
)
```

## main.cpp

```cpp
#include <DApplication>
#include <DWidgetUtil>
#include <DMainWindow>
#include <QBoxLayout>
#include <dboxwidget.h>
#include <DLineEdit>
#include <DPushButton>

DWIDGET_USE_NAMESPACE

int main(int argc, char *argv[])
{
    DApplication a(argc, argv);
    DMainWindow win;

    // 设置水平方向 从左到右排列
    QBoxLayout::Direction direction = QBoxLayout::LeftToRight;

    // 创建DBoxWidget对象
    DBoxWidget box(direction, &win);

    // 添加一个DLineEdit控件，和一个按钮，可以看到控件水平放置
    box.addWidget(new DLineEdit());
    box.addWidget(new DPushButton("按钮"));

    // 设置外边距为30px
    box.layout()->setMargin(30);

    // widget放入主窗口
    win.setCentralWidget(&box);

    win.resize(300,200);
    win.show();
    // 移动窗口到屏幕中心
    Dtk::Widget::moveToCenter(&win);
    return a.exec();
}
```

编译运行
```
cmake -Bbuild
cmake --build build
./build/example
```

结果如下图
![example](/docs/images/dboxwidget-example.png)

@sa DHBoxWidget
@sa DVBoxWidget

@property QBoxLayout::Direction Dtk::Widget::DBoxWidget::direction
@brief 当前QBoxLayout使用的方向的属性
@sa read方法 [direction](@ref Dtk::Widget::DBoxWidget::direction() const)
@sa write方法 [setDirection](@ref Dtk::Widget::DBoxWidget::setDirection(QBoxLayout::Direction direction))

@fn QBoxLayout::Direction DBoxWidget::direction() const
@brief 这个属性返回当前 QBoxLayout 使用的方向
@return QBoxLayout::Direction 当前的方向
@sa 属性 [direction](@ref Dtk::Widget::DBoxWidget::direction)

@fn void Dtk::Widget::DBoxWidget::setDirection(QBoxLayout::Direction direction)
@brief 设置 QBoxLayout 当前的方向
@param direction 方向
@sa 属性 [direction](@ref Dtk::Widget::DBoxWidget::direction)

@fn Dtk::Widget::DBoxWidget::DBoxWidget(QBoxLayout::Direction direction, QWidget *parent = 0)
@brief DBoxWidget的构造函数
@param direction 是设置内部QBoxLayout使用的方向
@param parent 传递给QFrame的构造函数

@fn QBoxLayout* Dtk::Widget::DBoxWidget::layout() const
@brief 这个属性会返回当前使用的布局对象
@details 这个属性可以用来获取内部布局，所以你可以设置布局上的一些额外属性来匹配自定义需求。
@return 返回 QBoxLayout 类型的指针

@fn void Dtk::Widget::DBoxWidget::addWidget(QWidget *widget)
@brief 调用QBoxLayout的addWidget方法将QWidget添加到布局中
@param widget 要添加的QWidget对象

@fn void Dtk::Widget::DBoxWidget::updateSize(const QSize &size)
@brief 当方向是 QBoxLayout::TopToBottom 或者 QBoxLayout::BottomToTop 时设置大小
@details 固定高度将使用传入的高度，并设置最小宽度为传入的宽度。否则将使用传入的宽度当做固定宽度，高度为最小高度。
@param size 传入的大小

@fn QSize Dtk::Widget::DBoxWidget::sizeHint() const Q_DECL_OVERRIDE
@brief DBoxWidget::sizeHint 重写 QWidget::sizeHint().
@return 该控件的推荐大小.

@fn void Dtk::Widget::DBoxWidget::sizeChanged(QSize size)
@brief DBoxWidget 大小发生变化时的信号

@fn void Dtk::Widget::DBoxWidget::directionChanged(QBoxLayout::Direction direction)
@brief DBoxWidget 方向发生变化时的信号

*/

/*!
@~chinese
@class Dtk::Widget::DHBoxWidget
@brief 设置成水平方向的DBoxWidget

@fn Dtk::Widget::DHBoxWidget::DHBoxWidget(QWidget *parent = 0)
@brief DHBoxWidget的构造函数
@param parent 被传递给DBoxWidget构造函数

*/

/*!
@~chinese
@class Dtk::Widget::DVBoxWidget
@brief 设置成垂直方向的DBoxWidget

@fn Dtk::Widget::DVBoxWidget::DVBoxWidget(QWidget *parent = 0)
@brief DVBoxWidget的构造函数
@param parent 被传递给DBoxWidget构造函数

*/
