/*!
@~chinese
@file dfilechooseredit.h
@ingroup edit
@class Dtk::Widget::DFileChooserEdit
@brief 带有选择文件按钮的文本编辑框
@details
本控件基本与 DLineEdit 相同，但同时在编辑框的右侧提供了一个按钮，点击按钮将会出现一个选择文件的对话框，当在对话框中选择完毕点击确定之后，选择的结果将会出现在文本编辑框中。
另外还提供了设置对话框出现的位置，选择文件的类型，或设置文件名过滤器的方法以定制控件的功能。

下面提供DFileChooserEdit的例子:

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

## 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 <QWidget>
#include <QHBoxLayout>
#include <DFileChooserEdit>

DWIDGET_USE_NAMESPACE

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

    // 创建一个widget容器
    QWidget widget;
    // 创建DFileChooserEdit对象
    DFileChooserEdit dialog;

    // 给widget设置水平布局
    QHBoxLayout hLayout(&widget);

    dialog.setFileMode(QFileDialog::Directory);  // 指定选择的模式，选择目录。
    dialog.setDirectoryUrl(QUrl("file:///home"));  // 设置文件选择器打开路径为home目录

    // 将dialogn放入到widget中
    hLayout.addWidget(&dialog);
    // widget放入主窗口
    win.setCentralWidget(&widget);

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

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

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

@sa DLineEdit QFileDialog

@enum Dtk::Widget::DFileChooserEdit::DialogDisplayPosition
@brief 这个枚举保存了对话框可以出现的位置
@var Dtk::Widget::DFileChooserEdit::DialogDisplayPosition Dtk::Widget::DFileChooserEdit::FollowParentWindow
@brief 跟随父窗口
@var Dtk::Widget::DFileChooserEdit::DialogDisplayPosition Dtk::Widget::DFileChooserEdit::CurrentMonitorCenter
@brief 鼠标所在的显示器的中心

@fn void Dtk::Widget::DFileChooserEdit::fileChoosed(const QString &fileName)
@brief 这个信号在文件被选择且点击了对话框的确认按钮之后被调用
@param fileName 被选中的文件名，包含其绝对路径。

@fn void Dtk::Widget::DFileChooserEdit::dialogOpened()
@brief 这个信号在对话框即将显示时被调用
@note 注意，此时对话框并没有显示

@fn void Dtk::Widget::DFileChooserEdit::dialogClosed(int code)
@brief 这信号在对话框关闭时被调用，无论对话框是被点击了确认还是取消，都会调用本信号
@param code 对话框的返回码，返回码表示了对话框是因为点击了取消还是确认而关闭的
@sa QDialog::DialogCode

@fn Dtk::Widget::DFileChooserEdit::DFileChooserEdit(QWidget *parent = nullptr)
@brief 获取 DFileChooserEdit 的一个实例
@param parent 作为实例的父控件

@fn DFileChooserEdit::DialogDisplayPosition Dtk::Widget::DFileChooserEdit::dialogDisplayPosition() const
@brief 这个属性保存文件选择对话框将会出现的位置
@details
可选值为枚举 DFileChooserEdit::DialogDisplayPosition 中的值
Getter: DFileChooserEdit::dialogDisplayPosition , Setter: DFileChooserEdit::setDialogDisplayPosition
@sa DFileChooserEdit::DialogDisplayPosition

@fn void Dtk::Widget::DFileChooserEdit::setDialogDisplayPosition(DialogDisplayPosition dialogDisplayPosition)
@brief 设置对话框显示位置
@param dialogDisplayPosition 对话框的显示位置
@sa DFileChooserEdit::dialogDisplayPosition

@fn void Dtk::Widget::DFileChooserEdit::setFileDialog(QFileDialog *fileDialog)
@brief 设置 fileDialog

@fn QFileDialog* Dtk::Widget::DFileChooserEdit::fileDialog() const
@brief 返回 fileDialog

@fn void Dtk::Widget::DFileChooserEdit::initDialog()
@brief 初始化对话框

@fn void Dtk::Widget::DFileChooserEdit::setFileMode(QFileDialog::FileMode mode)
@brief 设置文件选择模式
@param mode 要使用的模式
@sa DFileChooserEdit::fileMode

@fn QFileDialog::FileMode Dtk::Widget::DFileChooserEdit::fileMode() const
@brief 获取对话框选择文件模式
@details 有多种类型的选择模式，也就是说对话框可以有多种显示或行为，例如选择单个文件，选择多个文件亦或选择一个目录等，详细可以查阅：QFileDialog::FileMode
@return 返回当前的选择模式
@sa QFileDialog::FileMode
@note 目前本控件只支持选择单个文件，即便调用 DFileChooserEdit::setFileMode 设置了选择模式，当有多个文件在对话框中被选中时，取其第一个作为选择结果

@fn void Dtk::Widget::DFileChooserEdit::setNameFilters(const QStringList &filters)
@brief 设置文件名过滤器
@param filters 要使用的文件名过滤器组成的列表
@sa DFileChooserEdit::nameFilters

@fn QStringList Dtk::Widget::DFileChooserEdit::nameFilters() const
@brief 文件名过滤器
@details
默认此选项为空，即所有文件都可以被选择，当文件名过滤器被设置后，则只有文件名与过滤器匹配的文件可以被选择，
例如：设置了"*.txt"，则表示只有后缀名为"txt"的文件可以被选择，
或者同时设置了多个过滤器：QStringList() << "text file (*.txt)" << "picture file (*.png);
则会在文件选择对话框的下方出现设置的多个过滤选项，只是需要注意，一次只能使用一个过滤选项，也就是说不能同时即允许选择txt文件又允许选择png文件
@return 返回当前的文件名过滤器组成的列表
@sa DFileChooserEdit::setNameFilters

@fn void Dtk::Widget::DFileChooserEdit::setDirectoryUrl(const QUrl &directory)
@brief 设置文件对话框打开时的路径

@fn QUrl Dtk::Widget::DFileChooserEdit::directoryUrl()
@brief 返回文件对话框打开时的路径

*/
