Full Code of douzhongqiang/EasyCanvas for AI

master 84aad331afad cached
528 files
2.3 MB
638.2k tokens
1332 symbols
1 requests
Download .txt
Showing preview only (2,562K chars total). Download the full file or copy to clipboard to get everything.
Repository: douzhongqiang/EasyCanvas
Branch: master
Commit: 84aad331afad
Files: 528
Total size: 2.3 MB

Directory structure:
gitextract_u8hxl36n/

├── AudioVideoCore/
│   ├── AudioData.cpp
│   ├── AudioData.h
│   ├── AudioDecodec.cpp
│   ├── AudioDecodec.h
│   ├── AudioPlayer.cpp
│   ├── AudioPlayer.h
│   ├── AudioPlayerThread.cpp
│   ├── AudioPlayerThread.h
│   ├── AudioVideoCore.pro
│   └── audiovideocore_global.h
├── CustomControls/
│   ├── CustomCombineControl/
│   │   ├── UICustomColorControl.cpp
│   │   ├── UICustomColorControl.h
│   │   ├── UICustomCombineControlBase.cpp
│   │   ├── UICustomCombineControlBase.h
│   │   ├── UICustomComboBoxControl.cpp
│   │   ├── UICustomComboBoxControl.h
│   │   ├── UICustomDateEditControl.cpp
│   │   ├── UICustomDateEditControl.h
│   │   ├── UICustomDoubleControl.cpp
│   │   ├── UICustomDoubleControl.h
│   │   ├── UICustomFontComboBoxControl.cpp
│   │   ├── UICustomFontComboBoxControl.h
│   │   ├── UICustomGroupControl.cpp
│   │   ├── UICustomGroupControl.h
│   │   ├── UICustomIntControl.cpp
│   │   ├── UICustomIntControl.h
│   │   ├── UICustomLineEditControl.cpp
│   │   ├── UICustomLineEditControl.h
│   │   ├── UICustomOrientationControl.cpp
│   │   ├── UICustomOrientationControl.h
│   │   ├── UICustomPostionControl.cpp
│   │   ├── UICustomPostionControl.h
│   │   ├── UICustomSwitchControl.cpp
│   │   ├── UICustomSwitchControl.h
│   │   ├── UICustomTextEditTagControl.cpp
│   │   ├── UICustomTextEditTagControl.h
│   │   ├── UICustomTimeEditControl.cpp
│   │   └── UICustomTimeEditControl.h
│   ├── CustomControls.pro
│   ├── UICurtomLeftBarControl/
│   │   ├── UICustomLefTabsControl.h
│   │   ├── UICustomLeftItemWidget.cpp
│   │   ├── UICustomLeftItemWidget.h
│   │   ├── UICustomLeftTabsControl.cpp
│   │   ├── UICustomLeftWidget.cpp
│   │   └── UICustomLeftWidget.h
│   ├── UICustomColorControl/
│   │   ├── UICustomColorCircle.cpp
│   │   ├── UICustomColorCircle.h
│   │   ├── UICustomColorSlider.cpp
│   │   ├── UICustomColorSlider.h
│   │   ├── UICustomColorSliderItem.cpp
│   │   ├── UICustomColorSliderItem.h
│   │   ├── UICustomColorWidget.cpp
│   │   ├── UICustomColorWidget.h
│   │   ├── UICustomCustomColorOperator.cpp
│   │   ├── UICustomCustomColorOperator.h
│   │   ├── UICustonColorDialog.cpp
│   │   └── UICustonColorDialog.h
│   ├── UICustomSingleControl/
│   │   ├── UICustomCalendarWidget.cpp
│   │   ├── UICustomCalendarWidget.h
│   │   ├── UICustomColorViewWidget.cpp
│   │   ├── UICustomColorViewWidget.h
│   │   ├── UICustomComboBox.cpp
│   │   ├── UICustomComboBox.h
│   │   ├── UICustomDateEdit.cpp
│   │   ├── UICustomDateEdit.h
│   │   ├── UICustomDoubleSpinBox.cpp
│   │   ├── UICustomDoubleSpinBox.h
│   │   ├── UICustomImageViewer.cpp
│   │   ├── UICustomImageViewer.h
│   │   ├── UICustomIntSpinBox.cpp
│   │   ├── UICustomIntSpinBox.h
│   │   ├── UICustomLineEdit.cpp
│   │   ├── UICustomLineEdit.h
│   │   ├── UICustomPostionWidget.cpp
│   │   ├── UICustomPostionWidget.h
│   │   ├── UICustomSwitchWidget.cpp
│   │   ├── UICustomSwitchWidget.h
│   │   ├── UICustomTextEdit.cpp
│   │   ├── UICustomTextEdit.h
│   │   ├── UICustomTimeEdit.cpp
│   │   └── UICustomTimeEdit.h
│   └── customcontrols_global.h
├── CustomWidgets/
│   ├── CustomWidgets.pro
│   ├── UICustomCore/
│   │   ├── CustomStyleConfig.cpp
│   │   └── CustomStyleConfig.h
│   ├── UICustomWidgtes/
│   │   ├── CustomDialog.cpp
│   │   ├── CustomDialog.h
│   │   ├── CustomMainWindow.cpp
│   │   ├── CustomMainWindow.h
│   │   ├── CustomTestWidget.cpp
│   │   ├── CustomTestWidget.h
│   │   ├── CustomWidget.cpp
│   │   └── CustomWidget.h
│   ├── customwidgets_global.h
│   ├── qss/
│   │   └── light.css
│   └── qss.qrc
├── EasyCanvas/
│   ├── EasyCanvas.pro
│   ├── GlobalHotKey/
│   │   ├── GlobalHotKeyFilter.cpp
│   │   ├── GlobalHotKeyFilter.h
│   │   ├── GlobalHotKeyInfo.cpp
│   │   ├── GlobalHotKeyInfo.h
│   │   ├── GlobalHotKeyManager.cpp
│   │   └── GlobalHotKeyManager.h
│   ├── UICore/
│   │   ├── MainWindow.cpp
│   │   ├── MainWindow.h
│   │   ├── UIAboutMeDialog.cpp
│   │   ├── UIAboutMeDialog.h
│   │   ├── UIAttributWidget.cpp
│   │   └── UIAttributWidget.h
│   └── main.cpp
├── EasyCanvas.pro
├── EasyCanvasCore/
│   ├── EasyCanvasCore.pro
│   ├── Scheme/
│   │   ├── CanvasSchemeManager.cpp
│   │   ├── CanvasSchemeManager.h
│   │   ├── SQLCore.cpp
│   │   ├── SQLCore.h
│   │   ├── SchemeDataInfo.h
│   │   ├── UISchemeManagerDialog.cpp
│   │   ├── UISchemeManagerDialog.h
│   │   ├── UISchemeManagerWidget.cpp
│   │   └── UISchemeManagerWidget.h
│   ├── UICanvas/
│   │   ├── UICanvasAudioItem.cpp
│   │   ├── UICanvasAudioItem.h
│   │   ├── UICanvasEllipseItem.cpp
│   │   ├── UICanvasEllipseItem.h
│   │   ├── UICanvasImageItem.cpp
│   │   ├── UICanvasImageItem.h
│   │   ├── UICanvasItemBase.cpp
│   │   ├── UICanvasItemBase.h
│   │   ├── UICanvasItemManager.cpp
│   │   ├── UICanvasItemManager.h
│   │   ├── UICanvasOperators.cpp
│   │   ├── UICanvasOperators.h
│   │   ├── UICanvasPathItem.cpp
│   │   ├── UICanvasPathItem.h
│   │   ├── UICanvasRectItem.cpp
│   │   ├── UICanvasRectItem.h
│   │   ├── UICanvasScene.cpp
│   │   ├── UICanvasScene.h
│   │   ├── UICanvasTextItem.cpp
│   │   ├── UICanvasTextItem.h
│   │   ├── UICanvasView.cpp
│   │   └── UICanvasView.h
│   ├── UINodeTree/
│   │   ├── UINodeItem.cpp
│   │   ├── UINodeItem.h
│   │   ├── UINodeSortFilterProxyModel.cpp
│   │   ├── UINodeSortFilterProxyModel.h
│   │   ├── UINodeTreeDelegate.cpp
│   │   ├── UINodeTreeDelegate.h
│   │   ├── UINodeTreeView.cpp
│   │   ├── UINodeTreeView.h
│   │   ├── UINodeTreeViewModel.cpp
│   │   ├── UINodeTreeViewModel.h
│   │   ├── UINodeTreeWidget.cpp
│   │   └── UINodeTreeWidget.h
│   ├── UndoCmd/
│   │   ├── ItemAttributeChangedCmd.cpp
│   │   ├── ItemAttributeChangedCmd.h
│   │   ├── ItemChangeNameCmd.cpp
│   │   ├── ItemChangeNameCmd.h
│   │   ├── ItemCreateCmd.cpp
│   │   ├── ItemCreateCmd.h
│   │   ├── ItemDeleteCmd.cpp
│   │   ├── ItemDeleteCmd.h
│   │   ├── ItemPasteCmd.cpp
│   │   ├── ItemPasteCmd.h
│   │   ├── UndoCmdCore.cpp
│   │   └── UndoCmdCore.h
│   └── easycanvascore_global.h
├── EasyCanvas_zh_CH.ts
├── NDNodeAttribute/
│   ├── NDAttributeBase.cpp
│   ├── NDAttributeBase.h
│   ├── NDAttributeData.cpp
│   ├── NDAttributeData.h
│   ├── NDAttributeGroup.cpp
│   ├── NDAttributeGroup.h
│   ├── NDBoolAttribute.cpp
│   ├── NDBoolAttribute.h
│   ├── NDColorAttribute.cpp
│   ├── NDColorAttribute.h
│   ├── NDIntAttribute.cpp
│   ├── NDIntAttribute.h
│   ├── NDNodeAttribute.pro
│   ├── NDNodeBase.cpp
│   ├── NDNodeBase.h
│   ├── NDNodeManager.cpp
│   ├── NDNodeManager.h
│   ├── NDPostionAttribute.cpp
│   ├── NDPostionAttribute.h
│   ├── NDRealAttribute.cpp
│   ├── NDRealAttribute.h
│   ├── NDStringAttribute.cpp
│   ├── NDStringAttribute.h
│   ├── NDTextNode.cpp
│   ├── NDTextNode.h
│   └── ndnodeattribute_global.h
├── NodeAttributeControl/
│   ├── NodeAttributeControl.pro
│   ├── UIAttrBoolControl.cpp
│   ├── UIAttrBoolControl.h
│   ├── UIAttrColorControl.cpp
│   ├── UIAttrColorControl.h
│   ├── UIAttrFloatControl.cpp
│   ├── UIAttrFloatControl.h
│   ├── UIAttrIntControl.cpp
│   ├── UIAttrIntControl.h
│   ├── UIAttrTextControl.cpp
│   ├── UIAttrTextControl.h
│   ├── UINodeAttrControl.cpp
│   ├── UINodeAttrControl.h
│   └── nodeattributecontrol_global.h
├── PythonWrap/
│   ├── PythonWrap.pro
│   ├── PythonWrapCore.cpp
│   ├── PythonWrapCore.h
│   ├── pythonwrap.cpp
│   ├── pythonwrap.h
│   └── pythonwrap_global.h
├── Utils/
│   ├── RALLBlockSignal.cpp
│   ├── RALLBlockSignal.h
│   ├── Utils.cpp
│   ├── Utils.h
│   ├── Utils.pro
│   └── utils_global.h
├── bin/
│   ├── CustomColor.xml
│   └── Script/
│       └── SetColorAlphaScript.py
├── readme.md
└── thirdLibs/
    ├── PythonQt/
    │   ├── include/
    │   │   ├── PythonQt.h
    │   │   ├── PythonQtBoolResult.h
    │   │   ├── PythonQtClassInfo.h
    │   │   ├── PythonQtClassWrapper.h
    │   │   ├── PythonQtConversion.h
    │   │   ├── PythonQtCppWrapperFactory.h
    │   │   ├── PythonQtDoc.h
    │   │   ├── PythonQtImportFileInterface.h
    │   │   ├── PythonQtImporter.h
    │   │   ├── PythonQtInstanceWrapper.h
    │   │   ├── PythonQtMethodInfo.h
    │   │   ├── PythonQtMisc.h
    │   │   ├── PythonQtObjectPtr.h
    │   │   ├── PythonQtProperty.h
    │   │   ├── PythonQtPythonInclude.h
    │   │   ├── PythonQtQFileImporter.h
    │   │   ├── PythonQtSignal.h
    │   │   ├── PythonQtSignalReceiver.h
    │   │   ├── PythonQtSlot.h
    │   │   ├── PythonQtSlotDecorator.h
    │   │   ├── PythonQtStdDecorators.h
    │   │   ├── PythonQtStdIn.h
    │   │   ├── PythonQtStdOut.h
    │   │   ├── PythonQtSystem.h
    │   │   ├── PythonQtThreadSupport.h
    │   │   ├── PythonQtUtils.h
    │   │   ├── PythonQtVariants.h
    │   │   ├── PythonQt_QtAll.h
    │   │   └── gui/
    │   │       └── PythonQtScriptingConsole.h
    │   └── libs/
    │       ├── debug/
    │       │   ├── PythonQt-Qt5-Python38_d.lib
    │       │   └── PythonQt_QtAll-Qt5-Python38_d.lib
    │       └── release/
    │           ├── PythonQt-Qt5-Python38.lib
    │           └── PythonQt_QtAll-Qt5-Python38.lib
    ├── ffmpeg/
    │   ├── include/
    │   │   ├── libavcodec/
    │   │   │   ├── ac3_parser.h
    │   │   │   ├── adts_parser.h
    │   │   │   ├── avcodec.h
    │   │   │   ├── avdct.h
    │   │   │   ├── avfft.h
    │   │   │   ├── d3d11va.h
    │   │   │   ├── dirac.h
    │   │   │   ├── dv_profile.h
    │   │   │   ├── dxva2.h
    │   │   │   ├── jni.h
    │   │   │   ├── mediacodec.h
    │   │   │   ├── qsv.h
    │   │   │   ├── vaapi.h
    │   │   │   ├── vdpau.h
    │   │   │   ├── version.h
    │   │   │   ├── videotoolbox.h
    │   │   │   ├── vorbis_parser.h
    │   │   │   └── xvmc.h
    │   │   ├── libavdevice/
    │   │   │   ├── avdevice.h
    │   │   │   └── version.h
    │   │   ├── libavfilter/
    │   │   │   ├── avfilter.h
    │   │   │   ├── buffersink.h
    │   │   │   ├── buffersrc.h
    │   │   │   └── version.h
    │   │   ├── libavformat/
    │   │   │   ├── avformat.h
    │   │   │   ├── avio.h
    │   │   │   └── version.h
    │   │   ├── libavutil/
    │   │   │   ├── adler32.h
    │   │   │   ├── aes.h
    │   │   │   ├── aes_ctr.h
    │   │   │   ├── attributes.h
    │   │   │   ├── audio_fifo.h
    │   │   │   ├── avassert.h
    │   │   │   ├── avconfig.h
    │   │   │   ├── avstring.h
    │   │   │   ├── avutil.h
    │   │   │   ├── base64.h
    │   │   │   ├── blowfish.h
    │   │   │   ├── bprint.h
    │   │   │   ├── bswap.h
    │   │   │   ├── buffer.h
    │   │   │   ├── camellia.h
    │   │   │   ├── cast5.h
    │   │   │   ├── channel_layout.h
    │   │   │   ├── common.h
    │   │   │   ├── cpu.h
    │   │   │   ├── crc.h
    │   │   │   ├── des.h
    │   │   │   ├── dict.h
    │   │   │   ├── display.h
    │   │   │   ├── downmix_info.h
    │   │   │   ├── encryption_info.h
    │   │   │   ├── error.h
    │   │   │   ├── eval.h
    │   │   │   ├── ffversion.h
    │   │   │   ├── fifo.h
    │   │   │   ├── file.h
    │   │   │   ├── frame.h
    │   │   │   ├── hash.h
    │   │   │   ├── hdr_dynamic_metadata.h
    │   │   │   ├── hmac.h
    │   │   │   ├── hwcontext.h
    │   │   │   ├── hwcontext_cuda.h
    │   │   │   ├── hwcontext_d3d11va.h
    │   │   │   ├── hwcontext_drm.h
    │   │   │   ├── hwcontext_dxva2.h
    │   │   │   ├── hwcontext_mediacodec.h
    │   │   │   ├── hwcontext_qsv.h
    │   │   │   ├── hwcontext_vaapi.h
    │   │   │   ├── hwcontext_vdpau.h
    │   │   │   ├── hwcontext_videotoolbox.h
    │   │   │   ├── imgutils.h
    │   │   │   ├── intfloat.h
    │   │   │   ├── intreadwrite.h
    │   │   │   ├── lfg.h
    │   │   │   ├── log.h
    │   │   │   ├── lzo.h
    │   │   │   ├── macros.h
    │   │   │   ├── mastering_display_metadata.h
    │   │   │   ├── mathematics.h
    │   │   │   ├── md5.h
    │   │   │   ├── mem.h
    │   │   │   ├── motion_vector.h
    │   │   │   ├── murmur3.h
    │   │   │   ├── opt.h
    │   │   │   ├── parseutils.h
    │   │   │   ├── pixdesc.h
    │   │   │   ├── pixelutils.h
    │   │   │   ├── pixfmt.h
    │   │   │   ├── random_seed.h
    │   │   │   ├── rational.h
    │   │   │   ├── rc4.h
    │   │   │   ├── replaygain.h
    │   │   │   ├── ripemd.h
    │   │   │   ├── samplefmt.h
    │   │   │   ├── sha.h
    │   │   │   ├── sha512.h
    │   │   │   ├── spherical.h
    │   │   │   ├── stereo3d.h
    │   │   │   ├── tea.h
    │   │   │   ├── threadmessage.h
    │   │   │   ├── time.h
    │   │   │   ├── timecode.h
    │   │   │   ├── timestamp.h
    │   │   │   ├── tree.h
    │   │   │   ├── twofish.h
    │   │   │   ├── tx.h
    │   │   │   ├── version.h
    │   │   │   └── xtea.h
    │   │   ├── libpostproc/
    │   │   │   ├── postprocess.h
    │   │   │   └── version.h
    │   │   ├── libswresample/
    │   │   │   ├── swresample.h
    │   │   │   └── version.h
    │   │   └── libswscale/
    │   │       ├── swscale.h
    │   │       └── version.h
    │   └── libs/
    │       ├── avcodec-58.def
    │       ├── avcodec.lib
    │       ├── avdevice-58.def
    │       ├── avdevice.lib
    │       ├── avfilter-7.def
    │       ├── avfilter.lib
    │       ├── avformat-58.def
    │       ├── avformat.lib
    │       ├── avutil-56.def
    │       ├── avutil.lib
    │       ├── postproc-55.def
    │       ├── postproc.lib
    │       ├── swresample-3.def
    │       ├── swresample.lib
    │       ├── swscale-5.def
    │       └── swscale.lib
    └── python3_8/
        ├── include/
        │   ├── Python-ast.h
        │   ├── Python.h
        │   ├── abstract.h
        │   ├── asdl.h
        │   ├── ast.h
        │   ├── bitset.h
        │   ├── bltinmodule.h
        │   ├── boolobject.h
        │   ├── bytearrayobject.h
        │   ├── bytes_methods.h
        │   ├── bytesobject.h
        │   ├── cellobject.h
        │   ├── ceval.h
        │   ├── classobject.h
        │   ├── code.h
        │   ├── codecs.h
        │   ├── compile.h
        │   ├── complexobject.h
        │   ├── context.h
        │   ├── cpython/
        │   │   ├── abstract.h
        │   │   ├── dictobject.h
        │   │   ├── fileobject.h
        │   │   ├── initconfig.h
        │   │   ├── interpreteridobject.h
        │   │   ├── object.h
        │   │   ├── objimpl.h
        │   │   ├── pyerrors.h
        │   │   ├── pylifecycle.h
        │   │   ├── pymem.h
        │   │   ├── pystate.h
        │   │   ├── sysmodule.h
        │   │   ├── traceback.h
        │   │   ├── tupleobject.h
        │   │   └── unicodeobject.h
        │   ├── datetime.h
        │   ├── descrobject.h
        │   ├── dictobject.h
        │   ├── dtoa.h
        │   ├── dynamic_annotations.h
        │   ├── enumobject.h
        │   ├── errcode.h
        │   ├── eval.h
        │   ├── fileobject.h
        │   ├── fileutils.h
        │   ├── floatobject.h
        │   ├── frameobject.h
        │   ├── funcobject.h
        │   ├── genobject.h
        │   ├── graminit.h
        │   ├── grammar.h
        │   ├── import.h
        │   ├── internal/
        │   │   ├── pycore_accu.h
        │   │   ├── pycore_atomic.h
        │   │   ├── pycore_ceval.h
        │   │   ├── pycore_code.h
        │   │   ├── pycore_condvar.h
        │   │   ├── pycore_context.h
        │   │   ├── pycore_fileutils.h
        │   │   ├── pycore_getopt.h
        │   │   ├── pycore_gil.h
        │   │   ├── pycore_hamt.h
        │   │   ├── pycore_initconfig.h
        │   │   ├── pycore_object.h
        │   │   ├── pycore_pathconfig.h
        │   │   ├── pycore_pyerrors.h
        │   │   ├── pycore_pyhash.h
        │   │   ├── pycore_pylifecycle.h
        │   │   ├── pycore_pymem.h
        │   │   ├── pycore_pystate.h
        │   │   ├── pycore_traceback.h
        │   │   ├── pycore_tupleobject.h
        │   │   └── pycore_warnings.h
        │   ├── interpreteridobject.h
        │   ├── intrcheck.h
        │   ├── iterobject.h
        │   ├── listobject.h
        │   ├── longintrepr.h
        │   ├── longobject.h
        │   ├── marshal.h
        │   ├── memoryobject.h
        │   ├── methodobject.h
        │   ├── modsupport.h
        │   ├── moduleobject.h
        │   ├── namespaceobject.h
        │   ├── node.h
        │   ├── object.h
        │   ├── objimpl.h
        │   ├── odictobject.h
        │   ├── opcode.h
        │   ├── osdefs.h
        │   ├── osmodule.h
        │   ├── parsetok.h
        │   ├── patchlevel.h
        │   ├── picklebufobject.h
        │   ├── py_curses.h
        │   ├── pyarena.h
        │   ├── pycapsule.h
        │   ├── pyconfig.h
        │   ├── pyctype.h
        │   ├── pydebug.h
        │   ├── pydtrace.h
        │   ├── pyerrors.h
        │   ├── pyexpat.h
        │   ├── pyfpe.h
        │   ├── pyhash.h
        │   ├── pylifecycle.h
        │   ├── pymacconfig.h
        │   ├── pymacro.h
        │   ├── pymath.h
        │   ├── pymem.h
        │   ├── pyport.h
        │   ├── pystate.h
        │   ├── pystrcmp.h
        │   ├── pystrhex.h
        │   ├── pystrtod.h
        │   ├── pythonrun.h
        │   ├── pythread.h
        │   ├── pytime.h
        │   ├── rangeobject.h
        │   ├── setobject.h
        │   ├── sliceobject.h
        │   ├── structmember.h
        │   ├── structseq.h
        │   ├── symtable.h
        │   ├── sysmodule.h
        │   ├── token.h
        │   ├── traceback.h
        │   ├── tracemalloc.h
        │   ├── tupleobject.h
        │   ├── typeslots.h
        │   ├── ucnhash.h
        │   ├── unicodeobject.h
        │   ├── warnings.h
        │   └── weakrefobject.h
        └── libs/
            ├── _tkinter.lib
            ├── _tkinter_d.lib
            ├── python3.lib
            ├── python38.lib
            ├── python38_d.lib
            └── python3_d.lib

================================================
FILE CONTENTS
================================================

================================================
FILE: AudioVideoCore/AudioData.cpp
================================================
#include "AudioData.h"



================================================
FILE: AudioVideoCore/AudioData.h
================================================
#ifndef AUDIODATA_H
#define AUDIODATA_H

#include <QWaitCondition>
#include <QMutex>
#include <atomic>
#include <memory>
#include <QDebug>

struct AudioData
{
    QMutex m_audioPlayMutex;
    QWaitCondition m_audioPlayCondition;
    QWaitCondition m_audioDecodecCondition;

    std::atomic<int> m_nStartIndex;
    std::atomic<int> m_nEndIndex;
    std::atomic<int> m_nTotalCanUsed;

    AudioData()
        :m_nStartIndex(0)
        ,m_nEndIndex(0)
        ,m_nTotalCanUsed(0){}

    ~AudioData(){}
};

#endif


================================================
FILE: AudioVideoCore/AudioDecodec.cpp
================================================
#include "AudioDecodec.h"
#include <QWaitCondition>
#include <QDebug>

AudioDecodec::AudioDecodec(QObject* parent)
    :QThread(parent)
    ,m_isPlay(true)
    ,m_isDecodecFinsihed(true)
{
    av_register_all();

    m_pPlayThread = new AudioPlayerThread(m_audioData, this);
    QObject::connect(m_pPlayThread, &AudioPlayerThread::playFinished, this, &AudioDecodec::onPlayFinished);
}

AudioDecodec::~AudioDecodec()
{
    this->stop();

    m_isPlay = false;
    this->requestInterruption();
    m_audioData.m_audioDecodecCondition.wakeAll();

    this->wait();
    closeFile();

    delete m_pPlayThread;

    qDebug() << __FUNCTION__;
}

bool AudioDecodec::openAudioFile(const QString& filePath)
{
    m_pAvFrame = av_frame_alloc();

    // 打开文件
    int result = avformat_open_input(&m_pFormatContent, filePath.toLocal8Bit().data(), nullptr, nullptr);
    if (result != 0)
        qDebug() << "Result is Not Zero!";
    if (m_pFormatContent == nullptr)
        qDebug() << "FormtContent is Nullptr";

    if (result || !m_pFormatContent)
        return false;

    // 查找流信息
    result = avformat_find_stream_info(m_pFormatContent, nullptr);
    if (result < 0)
        return false;

    // 查找音频流
    int streamCount = m_pFormatContent->nb_streams;
    for (int i=0; i<streamCount; ++i)
    {
        if (m_pFormatContent->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO)
        {
            m_nAudioStreamIndex = i;
            break;
        }
    }

    if (m_nAudioStreamIndex < 0)
    {
        avformat_close_input(&m_pFormatContent);
        return false;
    }

    // 获取总时长
    m_nTotalTime = m_pFormatContent->duration * 1.0 / AV_TIME_BASE * 1000;

    // 查找解码器
    m_pCodecContent = m_pFormatContent->streams[m_nAudioStreamIndex]->codec;
    AVCodec* codec = avcodec_find_decoder(m_pCodecContent->codec_id);
    if (codec == nullptr)
    {
        avformat_close_input(&m_pFormatContent);
        return false;
    }

    // 打开解码器
    result = avcodec_open2(m_pCodecContent, codec, nullptr);
    if (result != 0)
    {
        avformat_close_input(&m_pFormatContent);
        return false;
    }

    // 设置采样率等信息
    m_nSampleRate = m_pCodecContent->sample_rate;
    m_nSampleFormat = m_pCodecContent->sample_fmt;
    m_pCodecContent->channel_layout = av_get_default_channel_layout(m_pCodecContent->channels);
    m_nChannelSize = m_pCodecContent->channels;

    m_isDecodecFinsihed = false;

    return true;
}

void AudioDecodec::run(void)
{
    while (!this->isInterruptionRequested())
    {
        // 缓冲区满了,挂起线程
        if (m_pPlayThread->isBufferFull() || !m_isPlay)
        {
            m_audioData.m_audioPlayMutex.lock();
            m_audioData.m_audioDecodecCondition.wait(&m_audioData.m_audioPlayMutex);
            m_audioData.m_audioPlayMutex.unlock();
        }

        AVPacket pkt;
        // 获取帧出错,可能是结束或者出错
        int result = av_read_frame(m_pFormatContent, &pkt);
        if (result != 0)
        {
            // 释放包的内存
            av_packet_unref(&pkt);

            m_isPlay = false;
            m_isDecodecFinsihed = true;
            continue;
        }

        // 只处理音频
        if (pkt.stream_index != m_nAudioStreamIndex)
            continue;

        // 解码音频帧, 发送音频包
        if (avcodec_send_packet(m_pCodecContent, &pkt))
            continue;

        // 解码音频帧,接收音频解码帧
        if (avcodec_receive_frame(m_pCodecContent, m_pAvFrame))
            continue;

        int writedSize = 0;
        // 获取解码后的PCM数据
        int size = m_pPlayThread->addAudioData((char*)m_pAvFrame->data[0], m_pAvFrame->linesize[0]);
        writedSize += size;
        while (writedSize < m_pAvFrame->linesize[0] && m_isPlay)
        {
            m_audioData.m_audioPlayMutex.lock();
            m_audioData.m_audioDecodecCondition.wait(&m_audioData.m_audioPlayMutex);
            m_audioData.m_audioPlayMutex.unlock();

            if (m_isPlay)
            {
                int size = m_pPlayThread->addAudioData((char*)m_pAvFrame->data[0] + writedSize, \
                        m_pAvFrame->linesize[0] - writedSize);
                writedSize += size;
            }
        }

        // 释放包的内存
        av_packet_unref(&pkt);
    }
}

void AudioDecodec::play(void)
{

    int sampleSize = 16;
    m_pPlayThread->setSampleInfo(m_nSampleRate, sampleSize, m_nChannelSize);

    // 播放
    m_pPlayThread->startPlay();

    // 解码
    m_isPlay = true;
    if (!this->isRunning())
        this->start();
    m_audioData.m_audioDecodecCondition.wakeAll();
}

void AudioDecodec::pause(void)
{
    m_pPlayThread->pausePlay();
}

void AudioDecodec::stop(void)
{
    m_isPlay = false;
    m_audioData.m_audioDecodecCondition.wakeAll();

    m_pPlayThread->stop();
    if (m_nAudioStreamIndex >= 0)
        av_seek_frame(m_pFormatContent, m_nAudioStreamIndex, 0, AVSEEK_FLAG_BACKWARD);
    m_isDecodecFinsihed = false;
}

// 关闭文件
void AudioDecodec::closeFile(void)
{
    av_frame_free(&m_pAvFrame);

    if (m_pFormatContent)
        avformat_close_input(&m_pFormatContent);
}

bool AudioDecodec::isDecodecFinished(void)
{
    bool result = m_isDecodecFinsihed;
    return result;
}

// 获取音频信息
int AudioDecodec::getTotalTime(void)
{
    return m_nTotalTime;
}

void AudioDecodec::getSampleInfos(int &sampleRate, int &sampleSize, int &channelCount)
{
    sampleRate = m_nSampleRate;
    sampleSize = 16;
    channelCount = m_nChannelSize;
}

void AudioDecodec::onPlayFinished(void)
{
    if (m_isDecodecFinsihed)
        emit playFinished();
}


================================================
FILE: AudioVideoCore/AudioDecodec.h
================================================
#ifndef AUDIODECODEC_H
#define AUDIODECODEC_H

extern "C" {
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavutil/avutil.h>
}
#include <QString>
#include <QThread>
#include "AudioData.h"
#include "AudioPlayerThread.h"
#include "audiovideocore_global.h"

class AUDIOVIDEOCORESHARED_EXPORT AudioDecodec : public QThread
{
    Q_OBJECT

public:
    AudioDecodec(QObject* parent = nullptr);
    ~AudioDecodec();

    // 打开音频文件
    bool openAudioFile(const QString& filePath);
    // 关闭文件
    void closeFile(void);

    // 获取是否结束
    bool isDecodecFinished(void);

    // 获取音频信息
    int getTotalTime(void);
    void getSampleInfos(int &sampleRate, int &sampleSize, int &channelCount);

    // 开始解码并播放
    void play(void);
    // 暂停
    void pause(void);
    // 结束播放
    void stop(void);

    void run(void) override;

private:
    AVFormatContext* m_pFormatContent = nullptr;
    AVCodecContext* m_pCodecContent = nullptr;

    int m_nAudioStreamIndex = -1;
    qreal m_nTotalTime = 0.0; // ms

    int m_nSampleRate = 0;      // 采样率
    AVSampleFormat m_nSampleFormat;     // 采样大小
    int m_nChannelSize = 2;     // 通道数

    AVFrame *m_pAvFrame = nullptr;
    AudioPlayerThread* m_pPlayThread= nullptr;

    std::atomic<bool> m_isPlay;
    std::atomic<bool> m_isDecodecFinsihed;

    // 音频相关数据
    AudioData m_audioData;
    friend AudioPlayerThread;

signals:
    void playFinished(void);

private slots:
    void onPlayFinished(void);
};

#endif


================================================
FILE: AudioVideoCore/AudioPlayer.cpp
================================================
#include "AudioPlayer.h"

AudioPlayer::AudioPlayer(QObject* parent)
    :QObject(parent)
{
    m_pAudioPlayer = new AudioDecodec(this);
    QObject::connect(m_pAudioPlayer, &AudioDecodec::playFinished, this, &AudioPlayer::onPlayFinished);
}

AudioPlayer::~AudioPlayer()
{

}

// 打开一个音频文件
bool AudioPlayer::openAudioFile(const QString& fileName)
{
    return m_pAudioPlayer->openAudioFile(fileName);
}

// 关闭文件
void AudioPlayer::close(void)
{
    m_pAudioPlayer->closeFile();
}

// 获取音频信息
AudioPlayer::AudioInfo AudioPlayer::getInfo(void)
{
    AudioInfo audioInfo;
    audioInfo.totalTime = m_pAudioPlayer->getTotalTime();
    m_pAudioPlayer->getSampleInfos(audioInfo.sampleRate, audioInfo.sampleSize, audioInfo.channelSize);

    return audioInfo;
}

// 开始播放
void AudioPlayer::play(void)
{
    m_pAudioPlayer->play();
    m_playerStatus = t_playing;
}

// 暂停播放
void AudioPlayer::pause(void)
{
    m_pAudioPlayer->pause();
    m_playerStatus = t_pause;
}
// 结束
void AudioPlayer::stop(void)
{
    m_pAudioPlayer->stop();
    m_playerStatus = t_normal;
}

AudioPlayer::PlayStatus AudioPlayer::getCurrentPlayStatus(void)
{
    return m_playerStatus;
}

void AudioPlayer::onPlayFinished(void)
{
    this->stop();
    emit playFinished();
}


================================================
FILE: AudioVideoCore/AudioPlayer.h
================================================
#ifndef AUDIOPLAYER_H
#define AUDIOPLAYER_H

#include <QObject>
#include "AudioDecodec.h"
#include "audiovideocore_global.h"

class AUDIOVIDEOCORESHARED_EXPORT AudioPlayer : public QObject
{
    Q_OBJECT

public:
    struct AudioInfo
    {
        int sampleRate;     // 采样率
        int sampleSize;     // 采样大小
        int channelSize;    // 通道数

        int totalTime;      // 总时长ms
    };

    enum PlayStatus
    {
        t_normal,
        t_playing,
        t_pause
    };

public:
    AudioPlayer(QObject* parent = nullptr);
    ~AudioPlayer();

    // 打开一个音频文件
    bool openAudioFile(const QString& fileName);
    // 关闭文件
    void close(void);
    // 获取音频信息
    AudioInfo getInfo(void);

    // 开始播放
    void play(void);
    // 暂停播放
    void pause(void);
    // 结束
    void stop(void);

    // 获取当前播放状态
    PlayStatus getCurrentPlayStatus(void);

private:
    AudioDecodec* m_pAudioPlayer = nullptr;
    PlayStatus m_playerStatus = t_normal;

private slots:
    void onPlayFinished(void);

signals:
    void playFinished(void);
};

#endif


================================================
FILE: AudioVideoCore/AudioPlayerThread.cpp
================================================
#include "AudioPlayerThread.h"
#include "AudioData.h"
#include <QMutexLocker>
#include <QDebug>

AudioPlayerThread::AudioPlayerThread(AudioData& audioData, QObject* parent)
    :QThread(parent)
    ,m_isPlay(true)
    ,m_audioData(audioData)
{
    initAudioBuffer();
}

AudioPlayerThread::~AudioPlayerThread()
{
    m_isPlay = false;
    this->requestInterruption();
    m_audioData.m_audioPlayCondition.wakeAll();
    this->wait();

    stop();

    delete[] m_pAudioBuffer;

    qDebug() << __FUNCTION__;
}

void AudioPlayerThread::initAudioBuffer(void)
{
    m_pAudioBuffer = new char[m_nMaxBufferSize];
    memset(m_pAudioBuffer, 0, m_nMaxBufferSize);
}

int AudioPlayerThread::addAudioData(const char* pAudioData, int length)
{
    int canAddedSize = m_nMaxBufferSize - m_audioData.m_nTotalCanUsed;
    int destSize = qMin(canAddedSize, length);
    destSize = destSize / 4 * 4;

    if (destSize == 0)
        return destSize;

    int nTempEndIndex = m_audioData.m_nEndIndex;
    if (m_nMaxBufferSize - nTempEndIndex >= destSize)
        memcpy(m_pAudioBuffer + m_audioData.m_nEndIndex, pAudioData, destSize);
    else
    {
        int size = m_nMaxBufferSize - m_audioData.m_nEndIndex;
        memcpy(m_pAudioBuffer + m_audioData.m_nEndIndex, pAudioData, size);
        memcpy(m_pAudioBuffer + 0, pAudioData + size, destSize - size);
    }

    // 重新设置结束标志
    m_audioData.m_nEndIndex += destSize;
    if (m_audioData.m_nEndIndex >= m_nMaxBufferSize)
        m_audioData.m_nEndIndex -= m_nMaxBufferSize;

    m_audioData.m_nTotalCanUsed += destSize;
    m_audioData.m_audioPlayCondition.wakeAll();
    return destSize;
}

// 判断缓存区是否已经满了
bool AudioPlayerThread::isBufferFull(void)
{
    if (m_audioData.m_nTotalCanUsed >= m_nMaxBufferSize)
        return true;

    return false;
}

void AudioPlayerThread::setSampleInfo(int sampleRate, int sampleSize, int channelCount)
{
    m_format.setSampleRate(sampleRate);
    m_format.setSampleSize(sampleSize);
    m_format.setChannelCount(channelCount);
    m_format.setCodec("audio/pcm");
    m_format.setByteOrder(QAudioFormat::LittleEndian);
    m_format.setSampleType(QAudioFormat::SignedInt);

    if (m_pAudioOutput)
        delete m_pAudioOutput;
    m_pAudioOutput = new QAudioOutput(m_format, this);
    m_pIODevice = m_pAudioOutput->start();
    qDebug() << m_pAudioOutput->state();

    if (m_pAudioOutput == nullptr)
        qDebug() << "AudioOutPut Is Nullptr";
    if (m_pIODevice == nullptr)
        qDebug() << "m_pIODevice Is Nullptr" << m_pAudioOutput->error();
}

// 开始播放
void AudioPlayerThread::startPlay(void)
{
    if (!this->isRunning())
        this->start();

    m_audioData.m_nStartIndex = 0;
    m_audioData.m_nEndIndex = 0;
    m_audioData.m_nTotalCanUsed = 0;

    memset(m_pAudioBuffer, 0, m_nMaxBufferSize);
    m_isPlay = true;
}

void AudioPlayerThread::pausePlay(void)
{
    m_isPlay = false;
}

void AudioPlayerThread::run(void)
{
    while (!this->isInterruptionRequested())
    {
        // 线程挂起,等待被唤醒
        if (m_audioData.m_nTotalCanUsed <= 0 || !m_isPlay)
        {
            // 发送播放结束
            if (m_audioData.m_nTotalCanUsed <= 0)
                emit playFinished();

            m_audioData.m_audioPlayMutex.lock();
            m_audioData.m_audioPlayCondition.wait(&m_audioData.m_audioPlayMutex);
            m_audioData.m_audioPlayMutex.unlock();
        }

        // 数据比较少,立即播放
        int nTotalCanUsed = m_audioData.m_nTotalCanUsed;
        if (m_pAudioOutput->bytesFree() >= nTotalCanUsed && m_isPlay)
        {
            if (nTotalCanUsed + m_audioData.m_nStartIndex <= m_nMaxBufferSize)
            {
                // 直接写入数据
                m_pIODevice->write(m_pAudioBuffer + m_audioData.m_nStartIndex, nTotalCanUsed);
            }
            else
            {
                int size = m_nMaxBufferSize - m_audioData.m_nStartIndex;
                m_pIODevice->write(m_pAudioBuffer + m_audioData.m_nStartIndex, size);
                m_pIODevice->write(m_pAudioBuffer + 0, nTotalCanUsed - size);
            }

            // 设置起始位置
            m_audioData.m_nStartIndex += nTotalCanUsed;
            if (m_audioData.m_nStartIndex >= m_nMaxBufferSize)
                m_audioData.m_nStartIndex -= m_nMaxBufferSize;

            m_audioData.m_nTotalCanUsed -= nTotalCanUsed;

            // 唤醒解码线程
            m_audioData.m_audioDecodecCondition.wakeAll();

            continue;
        }

        // 数据比较多,循环播放
        int perWriteSize = m_pAudioOutput->periodSize();
        if (m_pAudioOutput->bytesFree() >= perWriteSize && m_isPlay)
        {
            if (perWriteSize + m_audioData.m_nStartIndex <= m_nMaxBufferSize)
            {
                // 直接写入数据
                m_pIODevice->write(m_pAudioBuffer + m_audioData.m_nStartIndex, perWriteSize);
            }
            else
            {
                int size = m_nMaxBufferSize - m_audioData.m_nStartIndex;
                m_pIODevice->write(m_pAudioBuffer + m_audioData.m_nStartIndex, size);
                m_pIODevice->write(m_pAudioBuffer + 0, perWriteSize - size);
            }

            m_audioData.m_nStartIndex += perWriteSize;
            if (m_audioData.m_nStartIndex >= m_nMaxBufferSize)
                m_audioData.m_nStartIndex -= m_nMaxBufferSize;

            m_audioData.m_nTotalCanUsed -= perWriteSize;

            // 唤醒解码线程
            m_audioData.m_audioDecodecCondition.wakeAll();
        }

        QThread::msleep(10);
    }
}

void AudioPlayerThread::stop(void)
{
    m_isPlay = false;
    m_audioData.m_nStartIndex = 0;
    m_audioData.m_nEndIndex = 0;
    m_audioData.m_nTotalCanUsed = false;

    memset(m_pAudioBuffer, 0, m_nMaxBufferSize);
}


================================================
FILE: AudioVideoCore/AudioPlayerThread.h
================================================
#ifndef AUDIOPLAYERTHREAD_H
#define AUDIOPLAYERTHREAD_H

#include <QThread>
#include <QAudioFormat>
#include <QAudioOutput>
#include <QByteArray>
#include <QMutex>
#include <QWaitCondition>
#include <atomic>
#include <QIODevice>

class DecodecVideo;
class AudioData;

class AudioPlayDecice : QIODevice
{
    Q_OBJECT

public:
};

class AudioPlayerThread : public QThread
{
    Q_OBJECT

public:
    AudioPlayerThread(AudioData& audioData, QObject* parent = nullptr);
    ~AudioPlayerThread() override;

    void run(void) override;

    // set sample infos
    void setSampleInfo(int sampleRate, int sampleSize, int channelCount);
    // 添加数据
    int addAudioData(const char* pAudioData, int length);
    // 开始播放
    void startPlay(void);
    // 暂停
    void pausePlay(void);
    // 结束
    void stop(void);
    // 判断缓存区是否已经满了
    bool isBufferFull(void);

private:
    QAudioFormat m_format;
    QAudioOutput* m_pAudioOutput = nullptr;
    QIODevice* m_pIODevice = nullptr;

    // 音频数据Buffer
    char* m_pAudioBuffer = nullptr;
    const int m_nMaxBufferSize = 1 * 1024 * 1024;      // 1M的音频数据Buffer
    void initAudioBuffer(void);

    std::atomic<bool> m_isPlay;
    AudioData& m_audioData;

signals:
    void playFinished(void);
};
#endif


================================================
FILE: AudioVideoCore/AudioVideoCore.pro
================================================
#-------------------------------------------------
#
# Project created by QtCreator 2020-03-23T14:11:21
#
#-------------------------------------------------

QT       += widgets multimedia

TARGET = AudioVideoCore
TEMPLATE = lib

DEFINES += AUDIOVIDEOCORE_LIBRARY

# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

DESTDIR += $$PWD/../bin
MOC_DIR += $$PWD/../AudioVideoCore/temp
OBJECTS_DIR += $$PWD/../AudioVideoCore/temp
CONFIG += c++11

INCLUDEPATH += $$PWD/../thirdLibs/ffmpeg/include
LIBS += -L$$PWD/../thirdLibs/ffmpeg/libs/ -lavcodec -lavformat -lavutil

QMAKE_CXXFLAGS_RELEASE += /Zi
QMAKE_CXXFLAGS_RELEASE += /Od
QMAKE_LFLAGS_RELEASE += /DEBUG

SOURCES += \
        AudioData.cpp \
        AudioDecodec.cpp \
        AudioPlayer.cpp \
        AudioPlayerThread.cpp

HEADERS += \
        AudioData.h \
        AudioDecodec.h \
        AudioPlayer.h \
        AudioPlayerThread.h \
        audiovideocore_global.h 

unix {
    target.path = /usr/lib
    INSTALLS += target
}


================================================
FILE: AudioVideoCore/audiovideocore_global.h
================================================
#ifndef AUDIOVIDEOCORE_GLOBAL_H
#define AUDIOVIDEOCORE_GLOBAL_H

#include <QtCore/qglobal.h>

#if defined(AUDIOVIDEOCORE_LIBRARY)
#  define AUDIOVIDEOCORESHARED_EXPORT Q_DECL_EXPORT
#else
#  define AUDIOVIDEOCORESHARED_EXPORT Q_DECL_IMPORT
#endif

#endif // AUDIOVIDEOCORE_GLOBAL_H


================================================
FILE: CustomControls/CustomCombineControl/UICustomColorControl.cpp
================================================
#include "UICustomColorControl.h"
#include "UICustomColorControl/UICustomColorWidget.h"
#include "UICustomColorControl/UICustonColorDialog.h"

UICustomColorControl::UICustomColorControl(QWidget* parent)
    :UICustomCombineControlBase(parent)
{
    m_pColorViewWidget = new UICustomColorViewWidget;
    m_pMainLayout->addWidget(m_pColorViewWidget);

    // 添加Slider
    m_pSlider = new QSlider(Qt::Horizontal);
    m_pSlider->setMinimum(0);
    m_pSlider->setMaximum(255);
    m_pSlider->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
    m_pMainLayout->addWidget(m_pSlider);

    QObject::connect(m_pSlider, &QSlider::valueChanged, this, &UICustomColorControl::onSliderValueChanged);
    QObject::connect(m_pSlider, &QSlider::sliderPressed, this, &UICustomColorControl::onSliderPressed);
    QObject::connect(m_pSlider, &QSlider::sliderMoved, this, &UICustomColorControl::onSliderMoved);
    QObject::connect(m_pSlider, &QSlider::sliderReleased, this, &UICustomColorControl::onSliderReleased);

    QObject::connect(m_pColorViewWidget, &UICustomColorViewWidget::mousePressed, \
                     this, &UICustomColorControl::onColorViewClicked);

    this->setWidth(400);
    this->setHeight(30);
}

UICustomColorControl::~UICustomColorControl()
{

}

void UICustomColorControl::setCurrentColor(const QColor& color, bool cmd)
{
    if (color == m_pColorViewWidget->getCurrentColor())
        return;
    m_pColorViewWidget->setCurrentColor(color);

    int h,s,v;
    color.getHsv(&h, &s, &v);

    m_pSlider->blockSignals(true);
    m_pSlider->setValue(v);
    m_pSlider->blockSignals(false);

    // 发送颜色更改信号
    emit colorChanged(color, cmd);
}

const QColor& UICustomColorControl::getCurrentColor(void)
{
    return m_pColorViewWidget->getCurrentColor();
}

void UICustomColorControl::onSliderMoved(void)
{
    setColorByVValue(m_pSlider->value());
}

void UICustomColorControl::setColorByVValue(int vValue, bool cmd)
{
    QColor color = m_pColorViewWidget->getCurrentColor();

    int h,s,v;
    color.getHsv(&h, &s, &v);
    color.setHsv(h, s, vValue);

    if (color != m_pColorViewWidget->getCurrentColor() || cmd)
    {
        m_pColorViewWidget->setCurrentColor(color);
        emit colorDragChanged(color, cmd);
    }
}

void UICustomColorControl::onSliderPressed(void)
{
    m_tempColor = m_pColorViewWidget->getCurrentColor();
    setColorByVValue(m_pSlider->value());
}

void UICustomColorControl::onSliderReleased(void)
{
    int value = m_pSlider->value();

    setCurrentColor(m_tempColor);
    setColorByVValue(value, true);

    m_pSlider->blockSignals(true);
    m_pSlider->setValue(value);
    m_pSlider->blockSignals(false);
}

void UICustomColorControl::onSliderValueChanged(int value)
{
    setColorByVValue(value);
}

void UICustomColorControl::onColorViewClicked(void)
{
    UICustomColorDialog dialog;
    dialog.setCurrentColor(m_pColorViewWidget->getCurrentColor());
    if (UICustomColorDialog::Accepted != dialog.exec())
        return;

    QColor color = dialog.getCurrentColor();
    this->setCurrentColor(color, true);
}


================================================
FILE: CustomControls/CustomCombineControl/UICustomColorControl.h
================================================
/**
基本组合控件-颜色控件:
作者:Douzhq
日期:2020-01-22
个人博客:不会飞的纸飞机 http://www.douzhq.cn
*/
#ifndef UICUSTOMCOLORCONTROL_H
#define UICUSTOMCOLORCONTROL_H

#include "UICustomCombineControlBase.h"
#include "UICustomWidgtes/CustomWidget.h"
#include "UICustomSingleControl/UICustomColorViewWidget.h"
#include "customcontrols_global.h"
#include <QSlider>

class CUSTOMCONTROLSSHARED_EXPORT UICustomColorControl : public UICustomCombineControlBase
{
    Q_OBJECT

public:
    UICustomColorControl(QWidget* parent = nullptr);
    ~UICustomColorControl();

    // 设置/获取当前的颜色值
    void setCurrentColor(const QColor& color, bool cmd = false);
    const QColor& getCurrentColor(void);

private:
    // 预览控件
    UICustomColorViewWidget* m_pColorViewWidget = nullptr;
    // 滑条
    QSlider* m_pSlider = nullptr;

    QColor m_tempColor;

    // 设置颜色
    void setColorByVValue(int vValue, bool cmd = false);

private slots:
    void onSliderMoved(void);
    void onSliderPressed(void);
    void onSliderReleased(void);
    void onSliderValueChanged(int value);

    void onColorViewClicked(void);

signals:
    // 颜色更改发送信号(滑杆松开后发送该信号、通过点击更改颜色)
    void colorChanged(const QColor& color, bool cmd = false);
    // 颜色更改信号(滑动滑杆就触发)
    void colorDragChanged(const QColor& color, bool cmd = false);
};

#endif


================================================
FILE: CustomControls/CustomCombineControl/UICustomCombineControlBase.cpp
================================================
#include "UICustomCombineControlBase.h"
#include "UICustomCore/CustomStyleConfig.h"

UICustomCombineControlBase::UICustomCombineControlBase(QWidget* parent)
    :CustomWidget(parent)
{
    m_pMainLayout = new QHBoxLayout(this);
    m_pMainLayout->setSpacing(0);
    m_pMainLayout->setMargin(0);

    m_pTagLabel = new QLabel();
    m_pMainLayout->addWidget(m_pTagLabel);
    m_pTagLabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
    m_pTagLabel->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);

    this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
    // 设置默认第0列宽度
    setColumnWidth(0, 160);
    g_StyleConfig->setCurrentStyle(this, "DefaultWidget");
}

UICustomCombineControlBase::~UICustomCombineControlBase()
{

}

void UICustomCombineControlBase::setColumnWidth(int column, int width)
{
    int count = m_pMainLayout->count();
    int number = 0;
    for (int i=0; i<count; ++i)
    {
        QWidget* pWidget = m_pMainLayout->itemAt(i)->widget();
        if (pWidget == nullptr)
            continue;

        if (number == column)
        {
            pWidget->setFixedWidth(width);
            return;
        }
        number++;
    }
}

// 设置某一列显示/隐藏
void UICustomCombineControlBase::setColumnVisible(int column, bool visible)
{
    int count = m_pMainLayout->count();
    int number = 0;
    for (int i=0; i<count; ++i)
    {
        QWidget* pWidget = m_pMainLayout->itemAt(i)->widget();
        if (pWidget == nullptr)
            continue;

        if (number == column)
        {
            pWidget->setHidden(!visible);
            return;
        }
        number++;
    }
}

void UICustomCombineControlBase::setColumnExpingVisible(int column, bool isExping)
{
    int count = m_pMainLayout->count();
    int number = 0;
    for (int i=0; i<count; ++i)
    {
        QWidget* pWidget = m_pMainLayout->itemAt(i)->widget();
        if (pWidget == nullptr)
            continue;

        if (number == column)
        {
            if (isExping)
                pWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
            else
                pWidget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);

            return;
        }
        number++;
    }
}

void UICustomCombineControlBase::setTagText(const QString& tagText)
{
    m_pTagLabel->setText(tagText);
}

void UICustomCombineControlBase::setTextAlign(Qt::Alignment alignment)
{
    m_pTagLabel->setAlignment(alignment);
}

// 设置宽度和高度
void UICustomCombineControlBase::setWidth(int width)
{
    m_nWidth = width;
    this->setMinimumWidth(width);
}

void UICustomCombineControlBase::setHeight(int height)
{
    m_nHeight = height;
    this->setMinimumHeight(height);
}

QSize UICustomCombineControlBase::sizeHint() const
{
    QSize size(m_nWidth, m_nHeight);
    return size;
}


================================================
FILE: CustomControls/CustomCombineControl/UICustomCombineControlBase.h
================================================
/**
基本组合控件基类:
作者:Douzhq
日期:2020-01-22
个人博客:不会飞的纸飞机 www.douzhq.cn
*/
#ifndef UICUSTOMCOMBINECONTROLBASE_H
#define UICUSTOMCOMBINECONTROLBASE_H

#include "UICustomWidgtes/CustomWidget.h"
#include <QWidget>
#include <QHBoxLayout>
#include <QLabel>
#include "customcontrols_global.h"

class CUSTOMCONTROLSSHARED_EXPORT UICustomCombineControlBase : public CustomWidget
{
    Q_OBJECT

public:
    UICustomCombineControlBase(QWidget* parent = nullptr);
    ~UICustomCombineControlBase();

    // 设置某一列的宽度
    void setColumnWidth(int column, int width);
    // 设置某一列显示/隐藏
    void setColumnVisible(int column, bool visible);
    // 设置某一列伸缩性
    void setColumnExpingVisible(int column, bool isExping);

    // 设置文本内容
    void setTagText(const QString& tagText);

    // 设置文本的对齐方式
    void setTextAlign(Qt::Alignment alignment);

    // 设置宽度和高度
    void setWidth(int width);
    void setHeight(int height);

protected:
    QHBoxLayout *m_pMainLayout = nullptr;
    QLabel* m_pTagLabel = nullptr;

    QSize sizeHint() const override;

private:
    int m_nWidth = 400;
    int m_nHeight = 30;
};

#endif


================================================
FILE: CustomControls/CustomCombineControl/UICustomComboBoxControl.cpp
================================================
#include "UICustomComboBoxControl.h"

UICustomComboBoxControl::UICustomComboBoxControl(QWidget* parent)
    :UICustomCombineControlBase(parent)
{
    m_pCustomComboBox = new UICustomComboBox;
    m_pCustomComboBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);

    m_pMainLayout->addWidget(m_pCustomComboBox);

    QObject::connect(m_pCustomComboBox, SIGNAL(currentIndexChanged(int)), \
                     this, SIGNAL(currentIndexChanged(int)));
    QObject::connect(m_pCustomComboBox, SIGNAL(currentIndexChanged(const QString &)), \
                     this, SIGNAL(currentTextChanged(const QString&)));
}

UICustomComboBoxControl::~UICustomComboBoxControl()
{

}

// 添加元素
void UICustomComboBoxControl::addItem(const QString& item)
{
    m_pCustomComboBox->addItem(item);
}

void UICustomComboBoxControl::addItem(const QString& name, const QVariant& data)
{
    m_pCustomComboBox->addItem(name, data);
}

// 获取当前元素
QString UICustomComboBoxControl::getCurrentItem(void)
{
    return m_pCustomComboBox->currentText();
}

void UICustomComboBoxControl::setCurrentItem(const QString& text)
{
    m_pCustomComboBox->setCurrentText(text);
}

void UICustomComboBoxControl::setCurrentIndex(int index)
{
    m_pCustomComboBox->setCurrentIndex(index);
}

int UICustomComboBoxControl::getCurrentIndex(void)
{
    return m_pCustomComboBox->currentIndex();
}

QVariant UICustomComboBoxControl::getCurrentItemData(void)
{
    return m_pCustomComboBox->currentData();
}

int UICustomComboBoxControl::getItemCount(void)
{
    return m_pCustomComboBox->count();
}

void UICustomComboBoxControl::clearAllItems(void)
{
    m_pCustomComboBox->clear();
}


================================================
FILE: CustomControls/CustomCombineControl/UICustomComboBoxControl.h
================================================
#ifndef UICUSTOMCOMBOBOXCONTROL_H
#define UICUSTOMCOMBOBOXCONTROL_H

#include "UICustomCombineControlBase.h"
#include "UICustomSingleControl/UICustomComboBox.h"
#include "customcontrols_global.h"

class CUSTOMCONTROLSSHARED_EXPORT UICustomComboBoxControl : public UICustomCombineControlBase
{
    Q_OBJECT

public:
    UICustomComboBoxControl(QWidget* parent = nullptr);
    ~UICustomComboBoxControl();

    // 添加元素
    void addItem(const QString& item);
    void addItem(const QString& name, const QVariant& data);
    // 获取当前元素
    void setCurrentItem(const QString& text);
    QString getCurrentItem(void);
    void setCurrentIndex(int index);
    int getCurrentIndex(void);

    // 获取当前数据
    QVariant getCurrentItemData(void);
    // 获取当前个数
    int getItemCount(void);

    // 清除所有元素
    void clearAllItems(void);

private:
    UICustomComboBox* m_pCustomComboBox = nullptr;

signals:
    void currentTextChanged(const QString& str);
    void currentIndexChanged(int index);
};

#endif


================================================
FILE: CustomControls/CustomCombineControl/UICustomDateEditControl.cpp
================================================
#include "UICustomDateEditControl.h"

UICustomDateEditControl::UICustomDateEditControl(QWidget* parent)
    :UICustomCombineControlBase(parent)
{
    m_pDateEdit = new UICutomDateEdit;
    m_pDateEdit->setDisplayFormat("yyyy-MM-dd");

    m_pMainLayout->addWidget(m_pDateEdit);
}

UICustomDateEditControl::~UICustomDateEditControl()
{

}

void UICustomDateEditControl::setCurrentDate(const QDate& date)
{
    m_pDateEdit->setDate(date);
}

QDate UICustomDateEditControl::getCurrentDate(void)
{
    return m_pDateEdit->date();
}


================================================
FILE: CustomControls/CustomCombineControl/UICustomDateEditControl.h
================================================
#ifndef UICUSTOMDATEEDITCONTROL_H
#define UICUSTOMDATEEDITCONTROL_H

#include "UICustomCombineControlBase.h"
#include "UICustomSingleControl/UICustomDateEdit.h"
#include "customcontrols_global.h"

class CUSTOMCONTROLSSHARED_EXPORT UICustomDateEditControl : public UICustomCombineControlBase
{
    Q_OBJECT

public:
    UICustomDateEditControl(QWidget* parent = nullptr);
    ~UICustomDateEditControl();

    // 设置/获取日期
    void setCurrentDate(const QDate& date);
    QDate getCurrentDate(void);

private:
    UICutomDateEdit* m_pDateEdit = nullptr;
};

#endif


================================================
FILE: CustomControls/CustomCombineControl/UICustomDoubleControl.cpp
================================================
#include "UICustomDoubleControl.h"
#include "UICustomSingleControl/UICustomDoubleSpinBox.h"

UICustomDoubleControl::UICustomDoubleControl(QWidget* parent)
    :UICustomCombineControlBase(parent)
{
    // Double
    m_pDoubleSpinBox = new UICustomDoubleSpinBox;
    m_pMainLayout->addWidget(m_pDoubleSpinBox);

    m_pSlider = new QSlider(Qt::Horizontal);
    m_pSlider->setMinimum(0);
    m_pSlider->setMaximum(100);
    m_pMainLayout->addWidget(m_pSlider);

    setRangeValue(0, 1.0);
    m_pSlider->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);

    QObject::connect(m_pDoubleSpinBox, &UICustomDoubleSpinBox::editingFinished, \
                     this, &UICustomDoubleControl::onDoubleValueChanged);

    QObject::connect(m_pSlider, &QSlider::valueChanged, this, &UICustomDoubleControl::onSliderValueChanged);
    QObject::connect(m_pSlider, &QSlider::sliderPressed, this, &UICustomDoubleControl::onSliderPressed);
    QObject::connect(m_pSlider, &QSlider::sliderMoved, this, &UICustomDoubleControl::onSliderMoved);
    QObject::connect(m_pSlider, &QSlider::sliderReleased, this, &UICustomDoubleControl::onSliderReleased);

    this->setWidth(400);
    this->setHeight(30);
}

UICustomDoubleControl::~UICustomDoubleControl()
{

}

void UICustomDoubleControl::setCurrentValue(qreal value)
{
    if (value < m_qMinValue || value > m_qMaxValue)
        return;

    m_pDoubleSpinBox->setValue(value);
    int val = (value - m_qMinValue) * 1.0 / (m_qMaxValue - m_qMinValue) * 100;

    m_pSlider->blockSignals(true);
    m_pSlider->setValue(val);
    m_pSlider->blockSignals(false);
}

qreal UICustomDoubleControl::getCurrentValue(void)
{
    return m_pDoubleSpinBox->value();
}

void UICustomDoubleControl::setRangeValue(qreal minValue, qreal maxValue)
{
    m_qMinValue = minValue;
    m_qMaxValue = maxValue;

    m_pDoubleSpinBox->setMinimum(m_qMinValue);
    m_pDoubleSpinBox->setMaximum(m_qMaxValue);
}

void UICustomDoubleControl::onSliderPressed(void)
{
    m_beforeValue = m_pDoubleSpinBox->value();

    qreal valus = getValuesBySlider();
    m_pDoubleSpinBox->setValue(valus);

    emit valueChanged(valus);
}

void UICustomDoubleControl::onSliderMoved(void)
{
    qreal valus = getValuesBySlider();
    m_pDoubleSpinBox->setValue(valus);

    emit valueChanged(valus);
}

void UICustomDoubleControl::onSliderReleased(void)
{
    qreal valus = getValuesBySlider();
    m_pDoubleSpinBox->setValue(valus);

    emit valueChanged(m_beforeValue);
    emit valueChanged(valus, true);
}

void UICustomDoubleControl::onSliderValueChanged(int value)
{
    qreal valus = getValuesBySlider();
    m_pDoubleSpinBox->setValue(valus);

    emit valueChanged(valus);
}

qreal UICustomDoubleControl::getValuesBySlider(void)
{
    int value = m_pSlider->value();
    return m_qMinValue + (m_qMaxValue - m_qMinValue) * value * 1.0 / 100;
}

void UICustomDoubleControl::onDoubleValueChanged(void)
{
    qreal value = m_pDoubleSpinBox->value();
    int val = (value - m_qMinValue) * 1.0 / (m_qMaxValue - m_qMinValue) * 100;

    m_pSlider->blockSignals(true);
    m_pSlider->setValue(val);
    m_pSlider->blockSignals(false);

    emit valueChanged(value, true);
}


================================================
FILE: CustomControls/CustomCombineControl/UICustomDoubleControl.h
================================================
/**
基本组合控件-浮点值控件:
作者:Douzhq
日期:2020-01-22
个人博客:不会飞的纸飞机 www.douzhq.cn
*/
#ifndef UICUSTOMDOUBLECONTROL_H
#define UICUSTOMDOUBLECONTROL_H

#include "UICustomWidgtes/CustomWidget.h"
#include "UICustomCombineControlBase.h"
#include "customcontrols_global.h"
#include <QWidget>
#include <QDoubleSpinBox>
#include <QSlider>

class UICustomDoubleSpinBox;
class CUSTOMCONTROLSSHARED_EXPORT UICustomDoubleControl : public UICustomCombineControlBase
{
    Q_OBJECT

public:
    UICustomDoubleControl(QWidget* parent = nullptr);
    ~UICustomDoubleControl();

    // 设置/获取当前值
    void setCurrentValue(qreal value);
    qreal getCurrentValue(void);

    // 设置范围
    void setRangeValue(qreal minValue, qreal maxValue);

private:
    UICustomDoubleSpinBox* m_pDoubleSpinBox = nullptr;
    QSlider* m_pSlider = nullptr;

    qreal m_beforeValue = 0;
    qreal m_qMaxValue = 0;
    qreal m_qMinValue = 1;

    qreal getValuesBySlider(void);

private slots:
    void onSliderPressed(void);
    void onSliderMoved(void);
    void onSliderReleased(void);
    void onSliderValueChanged(int value);

    void onDoubleValueChanged(void);

signals:
    void valueChanged(qreal value, bool cmd = false);
};

#endif


================================================
FILE: CustomControls/CustomCombineControl/UICustomFontComboBoxControl.cpp
================================================
#include "UICustomFontComboBoxControl.h"
#include <QFontComboBox>

UICustomFontComboBoxControl::UICustomFontComboBoxControl(QWidget* parent)
    :UICustomCombineControlBase(parent)
{
    m_pComboBox = new QFontComboBox;
    m_pComboBox->setEditable(false);
    m_pComboBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);

    m_pMainLayout->addWidget(m_pComboBox);

    this->setWidth(400);
    this->setHeight(30);
}

UICustomFontComboBoxControl::~UICustomFontComboBoxControl()
{

}


================================================
FILE: CustomControls/CustomCombineControl/UICustomFontComboBoxControl.h
================================================
#ifndef UICUSTOMFONTCOMBOBOXCONTROL_H
#define UICUSTOMFONTCOMBOBOXCONTROL_H

#include "UICustomCombineControlBase.h"
#include "customwidgets_global.h"
#include <QWidget>

class QFontComboBox;
class CUSTOMCONTROLSSHARED_EXPORT UICustomFontComboBoxControl : public UICustomCombineControlBase
{
    Q_OBJECT

public:
    UICustomFontComboBoxControl(QWidget* parent = nullptr);
    ~UICustomFontComboBoxControl();

private:
    QFontComboBox* m_pComboBox = nullptr;
};

#endif


================================================
FILE: CustomControls/CustomCombineControl/UICustomGroupControl.cpp
================================================
#include "UICustomGroupControl.h"
#include "UICustomCore/CustomStyleConfig.h"
#include <QMouseEvent>
#include <QPainter>
#include <QDebug>

UICustomGroupTitleItem::UICustomGroupTitleItem(QWidget* parent)
    :CustomWidget(parent)
{
    g_StyleConfig->setCurrentStyle(this, "GroupTitle");
    this->setMinimumHeight(30);
}

UICustomGroupTitleItem::~UICustomGroupTitleItem()
{

}

void UICustomGroupTitleItem::mousePressEvent(QMouseEvent* event)
{
    m_isExpanding = !m_isExpanding;
    this->update();
    event->accept();
    emit clickedTitle(m_isExpanding);
}

void UICustomGroupTitleItem::customPaint(QPainter* painter)
{
    QTextOption o;
    o.setAlignment(Qt::AlignLeft | Qt::AlignVCenter);

    QPen pen;
    pen.setColor(QColor(230, 230, 230));
    painter->setPen(pen);

    int leftSpacing = 4;
    int drawMargin = 2;
    int expandWidth = 12;

    // 绘制展开
    qreal topHeight = (this->rect().height() - expandWidth) / 2.0;
    QRectF spandRect(leftSpacing + drawMargin, topHeight, expandWidth, expandWidth);
    painter->drawRect(spandRect);
    QLineF line1(spandRect.x(), spandRect.center().y(), spandRect.right(), spandRect.center().y());
    QLineF line2(spandRect.center().x(), spandRect.top(), spandRect.center().x(), spandRect.bottom());
    painter->drawLine(line1);
    if (!m_isExpanding)
        painter->drawLine(line2);


    // 绘制Title
    qreal leftWidth = spandRect.x() + leftSpacing + drawMargin * 2 + expandWidth;
    QRectF rect(leftWidth, 0, this->width() - leftWidth, this->height());
    painter->drawText(rect, m_cTitleName, o);
}

void UICustomGroupTitleItem::setTitleText(const QString& titleNameString)
{
    m_cTitleName = titleNameString;
    this->update();
}

QSize UICustomGroupTitleItem::sizeHint() const
{
    QSize size(400, 30);
    return size;
}

// -----------------------------------------------------------------------------
// 组件内容
UICustomGroupContentItem::UICustomGroupContentItem(QWidget* parent)
    :CustomWidget(parent)
{
    m_pLayout = new QVBoxLayout(this);
    m_pLayout->setMargin(2);
    m_pLayout->setSpacing(2);

    g_StyleConfig->setCurrentStyle(this, "GroupContent");
}

UICustomGroupContentItem::~UICustomGroupContentItem()
{

}

void UICustomGroupContentItem::addWidget(QWidget* widget)
{
    m_pLayout->addWidget(widget);
}

void UICustomGroupContentItem::insertWidget(int index, QWidget* widget)
{
    m_pLayout->insertWidget(index, widget);
}

QSize UICustomGroupContentItem::sizeHint() const
{
    int count = m_pLayout->count();

    // 高度
    int height = 0;
    for (int i=0; i<count; ++i)
    {
        QWidget* pWidget = m_pLayout->itemAt(i)->widget();
        if (pWidget == nullptr)
            continue;

        height += pWidget->sizeHint().height();
    }

    height += 4 + 2 * count;
    QSize size(400, height);
    return size;
}

// -----------------------------------------------------------------------------
UICustomGroupControl::UICustomGroupControl(QWidget* parent)
    :CustomWidget(parent)
{
    m_pMainLayout = new QVBoxLayout(this);
    m_pMainLayout->setMargin(2);
    m_pMainLayout->setSpacing(0);

    m_pTitleItemWidget = new UICustomGroupTitleItem;
    m_pContentItemWidget = new UICustomGroupContentItem;

    m_pMainLayout->addWidget(m_pTitleItemWidget);
    m_pMainLayout->addWidget(m_pContentItemWidget);

    g_StyleConfig->setCurrentStyle(this, "GroupWidget");

    QObject::connect(m_pTitleItemWidget, &UICustomGroupTitleItem::clickedTitle, \
                     this, &UICustomGroupControl::onClickedGroupTitleItem);
}

UICustomGroupControl::~UICustomGroupControl()
{

}

void UICustomGroupControl::addContentWidget(QWidget* widget)
{
    m_pContentItemWidget->addWidget(widget);
}

void UICustomGroupControl::insertContentWidget(int index, QWidget* widget)
{
    m_pContentItemWidget->insertWidget(index, widget);
}

void UICustomGroupControl::setTitleText(const QString& string)
{
    m_pTitleItemWidget->setTitleText(string);
}

void UICustomGroupControl::onClickedGroupTitleItem(bool isExpanded)
{
    m_pContentItemWidget->setVisible(isExpanded);
}

QSize UICustomGroupControl::sizeHint() const
{
    int height = 4;
    height += m_pTitleItemWidget->sizeHint().height();

    if (m_pContentItemWidget->isVisible())
        height += m_pContentItemWidget->sizeHint().height();

    return QSize(400, height);
}


================================================
FILE: CustomControls/CustomCombineControl/UICustomGroupControl.h
================================================
#ifndef UICUSTOMGROUPCONTROL_H
#define UICUSTOMGROUPCONTROL_H

#include <QWidget>
#include <QVBoxLayout>
#include "UICustomWidgtes/CustomWidget.h"
#include "customcontrols_global.h"

class UICustomGroupTitleItem;
class UICustomGroupContentItem;

// 组控件
class CUSTOMCONTROLSSHARED_EXPORT UICustomGroupControl : public CustomWidget
{
    Q_OBJECT

public:
    UICustomGroupControl(QWidget* parent = nullptr);
    ~UICustomGroupControl();

    // 添加内容
    void addContentWidget(QWidget* widget);
    void insertContentWidget(int index, QWidget* widget);

    // 设置标题文本
    void setTitleText(const QString& string);

protected:
    virtual QSize sizeHint() const override;

private:
    QVBoxLayout* m_pMainLayout = nullptr;
    UICustomGroupTitleItem* m_pTitleItemWidget = nullptr;
    UICustomGroupContentItem* m_pContentItemWidget = nullptr;

private slots:
    void onClickedGroupTitleItem(bool isExpanded);
};

// -----------------------------------------------------------------------------
// 标题
class UICustomGroupTitleItem : public CustomWidget
{
    Q_OBJECT

public:
    UICustomGroupTitleItem(QWidget* parent = nullptr);
    ~UICustomGroupTitleItem();

    // 设置Title内容
    void setTitleText(const QString& titleNameString);

    friend class UICustomGroupControl;
protected:
    virtual void mousePressEvent(QMouseEvent* event) override;
    virtual void customPaint(QPainter* painter) override;
    virtual QSize sizeHint() const override;

private:
    QString m_cTitleName;

    bool m_isExpanding = true;

signals:
    void clickedTitle(bool isExpanded);
};

// -----------------------------------------------------------------------------
// 组件内容
class UICustomGroupContentItem : public CustomWidget
{
    Q_OBJECT

public:
    UICustomGroupContentItem(QWidget* parent = nullptr);
    ~UICustomGroupContentItem();

    void addWidget(QWidget* widget);
    void insertWidget(int index, QWidget* widget);

    friend class UICustomGroupControl;
protected:
    virtual QSize sizeHint() const override;

private:
    QVBoxLayout* m_pLayout = nullptr;
};

#endif


================================================
FILE: CustomControls/CustomCombineControl/UICustomIntControl.cpp
================================================
#include "UICustomIntControl.h"
#include "UICustomSingleControl/UICustomIntSpinBox.h"
#include <QDebug>

UICustomIntControl::UICustomIntControl(QWidget* parent)
    :UICustomCombineControlBase(parent)
{
    m_pIntValue = new UICustomIntSpinBox;
    m_pMainLayout->addWidget(m_pIntValue);

    m_pSlider = new QSlider(Qt::Horizontal);
    m_pMainLayout->addWidget(m_pSlider);
    m_pSlider->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);

    setRangeValue(0, 100);
    m_pSlider->setMinimum(0);
    m_pSlider->setMaximum(100);

    QObject::connect(m_pIntValue, &UICustomIntSpinBox::editingFinished, \
                     this, &UICustomIntControl::onIntValueChanged);

    QObject::connect(m_pSlider, &QSlider::valueChanged, this, &UICustomIntControl::onSliderValueChanged);
    QObject::connect(m_pSlider, &QSlider::sliderPressed, this, &UICustomIntControl::onSliderPressed);
    QObject::connect(m_pSlider, &QSlider::sliderMoved, this, &UICustomIntControl::onSliderMoved);
    QObject::connect(m_pSlider, &QSlider::sliderReleased, this, &UICustomIntControl::onSliderReleased);

    this->setWidth(400);
    this->setHeight(30);
}

UICustomIntControl::~UICustomIntControl()
{

}

void UICustomIntControl::setRangeValue(int minValue, int maxValue)
{
    m_nMaxValue = maxValue;
    m_nMinValue = minValue;

    m_pIntValue->setMinimum(m_nMinValue);
    m_pIntValue->setMaximum(m_nMaxValue);
}


void UICustomIntControl::setCurrentValue(int value)
{
    if (value < m_nMinValue || value > m_nMaxValue)
        return;

    m_pIntValue->setValue(value);

    int val = (value - m_nMinValue) * 1.0 / (m_nMaxValue - m_nMinValue) * 100;

    m_pSlider->blockSignals(true);
    m_pSlider->setValue(val);
    m_pSlider->blockSignals(false);
}

int UICustomIntControl::getCurrentValue(void)
{
    return m_pIntValue->value();
}

int UICustomIntControl::getValuesBySlider(void)
{
    int value = m_pSlider->value();
    return m_nMinValue + value * 1.0 / 100 * (m_nMaxValue - m_nMinValue);
}

void UICustomIntControl::onSliderPressed(void)
{
    m_tempValue = m_pIntValue->value();

    int value = getValuesBySlider();
    m_pIntValue->setValue(value);

    emit valueChanged(value);
}

void UICustomIntControl::onSliderMoved(void)
{
    int value = getValuesBySlider();
    m_pIntValue->setValue(value);

    emit valueChanged(value);
}

void UICustomIntControl::onSliderReleased(void)
{
    int value = getValuesBySlider();
    m_pIntValue->setValue(value);

    emit valueChanged(m_tempValue);
    emit valueChanged(value, true);
}

void UICustomIntControl::onSliderValueChanged(int val)
{
    int value = getValuesBySlider();
    m_pIntValue->setValue(value);

    emit valueChanged(value);
}

void UICustomIntControl::onIntValueChanged(void)
{
    int value = m_pIntValue->value();
    m_pSlider->blockSignals(true);
    m_pSlider->setValue(value * 1.0 / (m_nMaxValue - m_nMinValue) * 100);
    m_pSlider->blockSignals(false);

    emit valueChanged(value, true);
}


================================================
FILE: CustomControls/CustomCombineControl/UICustomIntControl.h
================================================
/**
基本组合控件-整形值控件:
作者:Douzhq
日期:2020-01-22
个人博客:不会飞的纸飞机 www.douzhq.cn
*/
#ifndef UICUSTOMINTCONTROL_H
#define UICUSTOMINTCONTROL_H

#include "UICustomCombineControlBase.h"
#include <QWidget>
#include <QSpinBox>
#include <QSlider>
#include "customcontrols_global.h"

class UICustomIntSpinBox;
class CUSTOMCONTROLSSHARED_EXPORT UICustomIntControl : public UICustomCombineControlBase
{
    Q_OBJECT

public:
    UICustomIntControl(QWidget* parent = nullptr);
    ~UICustomIntControl();

    // 设置/获取当前的值
    void setCurrentValue(int value);
    int getCurrentValue(void);

    // 设置范围
    void setRangeValue(int minValue, int maxValue);

private:
    UICustomIntSpinBox* m_pIntValue = nullptr;
    QSlider* m_pSlider = nullptr;

    int m_nMaxValue = 100;
    int m_nMinValue = 0;
    int m_tempValue = 0;

    int getValuesBySlider(void);

private slots:
    void onSliderPressed(void);
    void onSliderMoved(void);
    void onSliderReleased(void);
    void onSliderValueChanged(int);

    void onIntValueChanged(void);

signals:
    void valueChanged(int value, bool cmd = false);
};

#endif


================================================
FILE: CustomControls/CustomCombineControl/UICustomLineEditControl.cpp
================================================
#include "UICustomLineEditControl.h"

UICustomLineEditControl::UICustomLineEditControl(QWidget* parent)
    :UICustomCombineControlBase(parent)
{
    m_pLineEdit = new UICustomLineEdit;
    m_pMainLayout->addWidget(m_pLineEdit);
    m_pLineEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);

    m_pToolButton = new QToolButton;
    m_pMainLayout->addWidget(m_pToolButton);

    // 转发信后
    QObject::connect(m_pLineEdit, &QLineEdit::textChanged, this, &UICustomLineEditControl::textChanged);
    QObject::connect(m_pLineEdit, &QLineEdit::editingFinished, this, &UICustomLineEditControl::editingFinished);
    QObject::connect(m_pToolButton, &QToolButton::clicked, this, &UICustomLineEditControl::clickedToolButton);

    this->setWidth(400);
    this->setHeight(30);
}

UICustomLineEditControl::~UICustomLineEditControl()
{

}

// 设置按钮相关
void UICustomLineEditControl::setToolButtonVisible(bool isVisible)
{
    m_pToolButton->setVisible(isVisible);
}

void UICustomLineEditControl::setToolButtonText(const QString& text)
{
    m_pToolButton->setText(text);
}

void UICustomLineEditControl::setToolButtonIcon(const QIcon& icon)
{
    m_pToolButton->setIcon(icon);
}

// 设置文本
void UICustomLineEditControl::setText(const QString& string)
{
    m_pLineEdit->setText(string);
}

QString UICustomLineEditControl::getText(void)
{
    return m_pLineEdit->text();
}


================================================
FILE: CustomControls/CustomCombineControl/UICustomLineEditControl.h
================================================
#ifndef UICUSTOMLINEEDITCONTROL_H
#define UICUSTOMLINEEDITCONTROL_H

#include "UICustomCombineControlBase.h"
#include "customcontrols_global.h"
#include "UICustomSingleControl/UICustomLineEdit.h"
#include <QLineEdit>
#include <QToolButton>
#include <QWidget>

class CUSTOMCONTROLSSHARED_EXPORT UICustomLineEditControl : public UICustomCombineControlBase
{
    Q_OBJECT

public:
    UICustomLineEditControl(QWidget* parent = nullptr);
    ~UICustomLineEditControl();

    // 设置按钮相关
    void setToolButtonVisible(bool isVisible);
    void setToolButtonText(const QString& text);
    void setToolButtonIcon(const QIcon& icon);

    // 设置文本
    void setText(const QString& string);
    QString getText(void);

private:
    UICustomLineEdit* m_pLineEdit = nullptr;
    QToolButton* m_pToolButton = nullptr;

signals:
    void clickedToolButton(void);
    void textChanged(const QString &text);
    void editingFinished(void);
};

#endif


================================================
FILE: CustomControls/CustomCombineControl/UICustomOrientationControl.cpp
================================================
#include "UICustomOrientationControl.h"
#include "UICustomCore/CustomStyleConfig.h"
#include <QPainter>
#include <QMouseEvent>
#include <QGridLayout>

UICustomOrientationItemWidget::UICustomOrientationItemWidget()
{
    m_color = QColor(80, 80, 80);
    this->setFixedSize(30, 30);
    this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
}

UICustomOrientationItemWidget::~UICustomOrientationItemWidget()
{

}

void UICustomOrientationItemWidget::customPaint(QPainter* painter)
{
    painter->setRenderHint(QPainter::Antialiasing);
    painter->fillRect(this->rect(), QBrush(m_color));

    QPen nPen;
    nPen.setColor(QColor(230, 230, 230));
    painter->setPen(nPen);

    if (m_isPressed)
        painter->drawEllipse(this->rect().adjusted(2, 2, -2, -2));
}

void UICustomOrientationItemWidget::mousePressEvent(QMouseEvent* event)
{
    m_isPressed = true;
    emit clickedItem();

    event->accept();
}

void UICustomOrientationItemWidget::setPressedStatus(bool status)
{
    m_isPressed = status;
    m_color = QColor(60, 60, 60);

    this->update();
}

QSize UICustomOrientationItemWidget::sizeHint() const
{
    return CustomWidget::sizeHint();

    QSize size(20, 20);

    return size;
}

// -----------------------------------------------------------------
UICustomOrientationWidget::UICustomOrientationWidget(QWidget* parent)
    :CustomWidget(parent)
{
    QGridLayout* layout = new QGridLayout(this);
    layout->setSpacing(0);
    layout->setMargin(0);

    for (int i=0; i<9; ++i)
    {
        UICustomOrientationItemWidget* itemWidget = new UICustomOrientationItemWidget;
        m_items << itemWidget;

        layout->addWidget(itemWidget, i / 3, i % 3);
        if (i + 1 % 3 == 0)
        {
            QSpacerItem *spacerItem = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Fixed);
            layout->addItem(spacerItem, i / 3, 3);
        }
        //itemWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
        QObject::connect(itemWidget, &UICustomOrientationItemWidget::clickedItem, \
                         this, &UICustomOrientationWidget::onClickedItem);
    }

}

UICustomOrientationWidget::~UICustomOrientationWidget()
{

}

void UICustomOrientationWidget::onClickedItem(void)
{
    UICustomOrientationItemWidget* pW = dynamic_cast<UICustomOrientationItemWidget*>(sender());
    if (pW == nullptr)
        return;

    cleanAllItemsStatus();
    pW->setPressedStatus(true);
}

void UICustomOrientationWidget::cleanAllItemsStatus(void)
{
    for (auto iter = m_items.begin(); iter != m_items.end(); ++iter)
        (*iter)->setPressedStatus(false);
}
// -----------------------------------------------------------------
UICustomOrientationControl::UICustomOrientationControl(QWidget* parent)
    :UICustomCombineControlBase(parent)
{
    m_pOrientationWidget = new UICustomOrientationWidget;
    m_pMainLayout->addWidget(m_pOrientationWidget);
    m_pOrientationWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);

    //this->setFixedSize(200, 200);
}

UICustomOrientationControl::~UICustomOrientationControl()
{

}


================================================
FILE: CustomControls/CustomCombineControl/UICustomOrientationControl.h
================================================
#ifndef UICUSTOMORIENTATIONCONTROL_H
#define UICUSTOMORIENTATIONCONTROL_H

#include "UICustomWidgtes/CustomWidget.h"
#include "UICustomCombineControlBase.h"
#include "customcontrols_global.h"

class UICustomOrientationItemWidget;
class UICustomOrientationWidget;
class CUSTOMCONTROLSSHARED_EXPORT UICustomOrientationControl : public UICustomCombineControlBase
{
    Q_OBJECT

public:
    UICustomOrientationControl(QWidget* parent = nullptr);
    ~UICustomOrientationControl();

private:
    UICustomOrientationWidget* m_pOrientationWidget = nullptr;
};

// -----------------------------------------------------------------
class UICustomOrientationItemWidget : public CustomWidget
{
    Q_OBJECT

public:
    UICustomOrientationItemWidget();
    ~UICustomOrientationItemWidget();

    void setPressedStatus(bool status);

protected:
    virtual void customPaint(QPainter* painter) override;
    virtual void mousePressEvent(QMouseEvent* event) override;
    virtual QSize sizeHint() const override;

private:
    bool m_isPressed = false;
    QColor m_color;

signals:
    void clickedItem(void);
};

// -----------------------------------------------------------------
class UICustomOrientationWidget : public CustomWidget
{
    Q_OBJECT

public:
    UICustomOrientationWidget(QWidget* parent = nullptr);
    ~UICustomOrientationWidget();

private:
    QList<UICustomOrientationItemWidget*> m_items;

    void cleanAllItemsStatus(void);

private slots:
    void onClickedItem(void);
};

#endif


================================================
FILE: CustomControls/CustomCombineControl/UICustomPostionControl.cpp
================================================
#include "UICustomPostionControl.h"

UICustomPostionControl::UICustomPostionControl(QWidget* parent)
    :UICustomCombineControlBase(parent)
{
    m_pPostionWidget = new UICustomPostionWidget;
    m_pMainLayout->addWidget(m_pPostionWidget);

    this->setWidth(400);
    this->setHeight(150);

    QObject::connect(m_pPostionWidget, &UICustomPostionWidget::postionValueChanged, \
                     this, &UICustomPostionControl::postionValueChanged);
}

UICustomPostionControl::~UICustomPostionControl()
{

}

// 设置当前映射的尺寸
void UICustomPostionControl::setCurrentMapSize(int width, int height)
{
    m_nMapWidth = width;
    m_nMapHeight = height;
}

// 设置当前的位置
void UICustomPostionControl::setCurrentXPt(int xValue)
{
    qreal val = xValue * 1.0 / m_nMapWidth * 100;
    m_pPostionWidget->setPostionXValue(val);
}

void UICustomPostionControl::setCurrentYPt(int yValue)
{
    qreal val = yValue * 1.0 / m_nMapHeight * 100;
    m_pPostionWidget->setPostionYValue(val);
}

void UICustomPostionControl::setCurrentPostion(int xValue, int yValue)
{
    qreal xVal = xValue * 1.0 / m_nMapWidth * 100;
    qreal yVal = yValue * 1.0 / m_nMapHeight * 100;
    m_pPostionWidget->setPostionValue(xVal, yVal);
}

// 获取当前位置
int UICustomPostionControl::getCurrentXPt(void)
{
    qreal xVal = m_pPostionWidget->getPostionXValue();
    return xVal / 100.0 * m_nMapWidth;
}

int UICustomPostionControl::getCurrentYPt(void)
{
    qreal yVal = m_pPostionWidget->getPostionYValue();
    return yVal / 100.0 * m_nMapHeight;
}

void UICustomPostionControl::getCurrentPostion(int& xValue, int& yValue)
{
    qreal xVal, yVal;
    m_pPostionWidget->getPostionValue(xVal, yVal);

    xValue = xVal / 100.0 * m_nMapWidth;
    yValue = yVal / 100.0 * m_nMapHeight;
}


================================================
FILE: CustomControls/CustomCombineControl/UICustomPostionControl.h
================================================
#ifndef UICUSTOMPOSTIONCONTROL_H
#define UICUSTOMPOSTIONCONTROL_H

#include "UICustomCombineControlBase.h"
#include "UICustomSingleControl/UICustomPostionWidget.h"
#include "customcontrols_global.h"
#include <QWidget>

class CUSTOMCONTROLSSHARED_EXPORT UICustomPostionControl : public UICustomCombineControlBase
{
    Q_OBJECT

public:
    UICustomPostionControl(QWidget* parent = nullptr);
    ~UICustomPostionControl();

    // 设置当前映射的尺寸
    void setCurrentMapSize(int width, int height);

    // 设置当前的位置
    void setCurrentXPt(int xValue);
    void setCurrentYPt(int yValue);
    void setCurrentPostion(int xValue, int yValue);

    // 获取当前位置
    int getCurrentXPt(void);
    int getCurrentYPt(void);
    void getCurrentPostion(int& xValue, int& yValue);

private:
    UICustomPostionWidget* m_pPostionWidget = nullptr;

    int m_nMapWidth = 100;
    int m_nMapHeight = 100;

signals:
    void postionValueChanged(qreal xValue, qreal yValue);
};

#endif


================================================
FILE: CustomControls/CustomCombineControl/UICustomSwitchControl.cpp
================================================
#include "UICustomSwitchControl.h"

UICustomSwitchControl::UICustomSwitchControl(QWidget* parent)
    :UICustomCombineControlBase(parent)
{
    m_pSwitchWidget = new UICustomSwitchWidget;
    m_pMainLayout->addWidget(m_pSwitchWidget);

    m_pLabel = new QLabel;
    m_pMainLayout->addWidget(m_pLabel);

    m_pMainLayout->addStretch();

    this->setWidth(400);
    this->setHeight(30);

    QObject::connect(m_pSwitchWidget, &UICustomSwitchWidget::valueChanged, \
                     this, &UICustomSwitchControl::valueChanged);
}

UICustomSwitchControl::~UICustomSwitchControl()
{

}

// 设置/获取当前值
void UICustomSwitchControl::setCurrentValue(bool isOn, bool hasAnim)
{
    m_pSwitchWidget->setSwitchStatus(isOn, hasAnim);
}

bool UICustomSwitchControl::getCurrentValue(void)
{
    return m_pSwitchWidget->getSwitchStatus();
}

void UICustomSwitchControl::setRightText(const QString& text)
{
    m_pLabel->setText(text);
}


================================================
FILE: CustomControls/CustomCombineControl/UICustomSwitchControl.h
================================================
#ifndef UICUSTOMSWITCHCONTROL_H
#define UICUSTOMSWITCHCONTROL_H

#include "UICustomCombineControlBase.h"
#include "UICustomSingleControl/UICustomSwitchWidget.h"
#include "customcontrols_global.h"
#include <QLabel>

class CUSTOMCONTROLSSHARED_EXPORT UICustomSwitchControl : public UICustomCombineControlBase
{
    Q_OBJECT

public:
    UICustomSwitchControl(QWidget* parent = nullptr);
    ~UICustomSwitchControl();

    // 设置/获取当前值
    void setCurrentValue(bool isOn, bool hasAnim = true);
    bool getCurrentValue(void);

    // 设置右侧文本
    void setRightText(const QString& text);

private:
    UICustomSwitchWidget* m_pSwitchWidget = nullptr;
    QLabel* m_pLabel = nullptr;

signals:
    void valueChanged(bool isOn, bool cmd = false);
};

#endif


================================================
FILE: CustomControls/CustomCombineControl/UICustomTextEditTagControl.cpp
================================================
#include "UICustomTextEditTagControl.h"
#include <QLabel>

UICustomTextEditTagControl::UICustomTextEditTagControl(QWidget* parent)
    :UICustomCombineControlBase(parent)
{
    m_pTextEdit = new UICustomTextEdit;
    m_pTextEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);

    m_pMainLayout->addWidget(m_pTextEdit);
}

UICustomTextEditTagControl::~UICustomTextEditTagControl()
{

}

QString UICustomTextEditTagControl::getCurrentText(void)
{
    return m_pTextEdit->toPlainText();
}

void UICustomTextEditTagControl::setCurrentText(const QString& text)
{
    m_pTextEdit->clear();
    m_pTextEdit->setPlainText(text);
}


================================================
FILE: CustomControls/CustomCombineControl/UICustomTextEditTagControl.h
================================================
#ifndef UICUSTOMTEXTEDITTAGCONTROL_H
#define UICUSTOMTEXTEDITTAGCONTROL_H

#include "UICustomSingleControl/UICustomTextEdit.h"
#include "UICustomCombineControlBase.h"
#include "customcontrols_global.h"

#include <QWidget>

class CUSTOMCONTROLSSHARED_EXPORT UICustomTextEditTagControl : public UICustomCombineControlBase
{
    Q_OBJECT
public:
    UICustomTextEditTagControl(QWidget* parent = nullptr);
    ~UICustomTextEditTagControl();

    // 获取当前文本
    QString getCurrentText(void);
    void setCurrentText(const QString& text);

private:
    UICustomTextEdit* m_pTextEdit = nullptr;
};

#endif


================================================
FILE: CustomControls/CustomCombineControl/UICustomTimeEditControl.cpp
================================================
#include "UICustomTimeEditControl.h"

UICustomTimeEditControl::UICustomTimeEditControl(QWidget* parent)
    :UICustomCombineControlBase(parent)
{
    m_pTimeEdit = new UICustomTimeEdit;
    m_pTimeEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);

    m_pMainLayout->addWidget(m_pTimeEdit);
}

UICustomTimeEditControl::~UICustomTimeEditControl()
{

}

void UICustomTimeEditControl::setCurrentTime(const QTime& time)
{
    m_pTimeEdit->setTime(time);
}

QTime UICustomTimeEditControl::getCurrentTime(void)
{
    return m_pTimeEdit->time();
}



================================================
FILE: CustomControls/CustomCombineControl/UICustomTimeEditControl.h
================================================
#ifndef UICUSTOMTIMEEDITCONTROL_H
#define UICUSTOMTIMEEDITCONTROL_H

#include "UICustomCombineControlBase.h"
#include "UICustomSingleControl/UICustomTimeEdit.h"
#include "customcontrols_global.h"
#include <QWidget>

class CUSTOMCONTROLSSHARED_EXPORT UICustomTimeEditControl : public UICustomCombineControlBase
{
    Q_OBJECT

public:
    UICustomTimeEditControl(QWidget* parent = nullptr);
    ~UICustomTimeEditControl();

    // 设置/获取当前时间
    void setCurrentTime(const QTime& time);
    QTime getCurrentTime(void);

private:
    UICustomTimeEdit* m_pTimeEdit = nullptr;
};

#endif


================================================
FILE: CustomControls/CustomControls.pro
================================================
#-------------------------------------------------
#
# Project created by QtCreator 2020-01-13T22:28:08
#
#-------------------------------------------------

QT       += widgets xml

TARGET = CustomControls
TEMPLATE = lib

DEFINES += CUSTOMCONTROLS_LIBRARY

# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

DESTDIR += $$PWD/../bin
MOC_DIR += $$PWD/../CustomControls/temp
OBJECTS_DIR += $$PWD/../CustomControls/temp
CONFIG += c++11

LIBS += -L$$PWD/../bin -lCustomWidgets
INCLUDEPATH += $$PWD/../CustomWidgets

QMAKE_CXXFLAGS_RELEASE += /Zi
QMAKE_CXXFLAGS_RELEASE += /Od
QMAKE_LFLAGS_RELEASE += /DEBUG

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    CustomCombineControl/UICustomColorControl.cpp \
    CustomCombineControl/UICustomCombineControlBase.cpp \
    CustomCombineControl/UICustomComboBoxControl.cpp \
    CustomCombineControl/UICustomDateEditControl.cpp \
    CustomCombineControl/UICustomDoubleControl.cpp \
    CustomCombineControl/UICustomFontComboBoxControl.cpp \
    CustomCombineControl/UICustomGroupControl.cpp \
    CustomCombineControl/UICustomIntControl.cpp \
    CustomCombineControl/UICustomLineEditControl.cpp \
    CustomCombineControl/UICustomOrientationControl.cpp \
    CustomCombineControl/UICustomPostionControl.cpp \
    CustomCombineControl/UICustomSwitchControl.cpp \
    CustomCombineControl/UICustomTextEditTagControl.cpp \
    CustomCombineControl/UICustomTimeEditControl.cpp \
    UICurtomLeftBarControl/UICustomLeftItemWidget.cpp \
    UICurtomLeftBarControl/UICustomLeftTabsControl.cpp \
    UICurtomLeftBarControl/UICustomLeftWidget.cpp \
    UICustomColorControl/UICustomColorCircle.cpp \
    UICustomColorControl/UICustomColorSlider.cpp \
    UICustomColorControl/UICustomColorSliderItem.cpp \
    UICustomColorControl/UICustomColorWidget.cpp \
    UICustomColorControl/UICustomCustomColorOperator.cpp \
    UICustomColorControl/UICustonColorDialog.cpp \
    UICustomSingleControl/UICustomCalendarWidget.cpp \
    UICustomSingleControl/UICustomColorViewWidget.cpp \
    UICustomSingleControl/UICustomComboBox.cpp \
    UICustomSingleControl/UICustomDateEdit.cpp \
    UICustomSingleControl/UICustomDoubleSpinBox.cpp \
    UICustomSingleControl/UICustomImageViewer.cpp \
    UICustomSingleControl/UICustomIntSpinBox.cpp \
    UICustomSingleControl/UICustomLineEdit.cpp \
    UICustomSingleControl/UICustomPostionWidget.cpp \
    UICustomSingleControl/UICustomSwitchWidget.cpp \
    UICustomSingleControl/UICustomTextEdit.cpp \
    UICustomSingleControl/UICustomTimeEdit.cpp

HEADERS += \
        CustomCombineControl/UICustomColorControl.h \
        CustomCombineControl/UICustomCombineControlBase.h \
        CustomCombineControl/UICustomComboBoxControl.h \
        CustomCombineControl/UICustomDateEditControl.h \
        CustomCombineControl/UICustomDoubleControl.h \
        CustomCombineControl/UICustomFontComboBoxControl.h \
        CustomCombineControl/UICustomGroupControl.h \
        CustomCombineControl/UICustomIntControl.h \
        CustomCombineControl/UICustomLineEditControl.h \
        CustomCombineControl/UICustomOrientationControl.h \
        CustomCombineControl/UICustomPostionControl.h \
        CustomCombineControl/UICustomSwitchControl.h \
        CustomCombineControl/UICustomTextEditTagControl.h \
        CustomCombineControl/UICustomTimeEditControl.h \
        UICurtomLeftBarControl/UICustomLefTabsControl.h \
        UICurtomLeftBarControl/UICustomLeftItemWidget.h \
        UICurtomLeftBarControl/UICustomLeftWidget.h \
        UICustomColorControl/UICustomColorCircle.h \
        UICustomColorControl/UICustomColorSlider.h \
        UICustomColorControl/UICustomColorSliderItem.h \
        UICustomColorControl/UICustomColorWidget.h \
        UICustomColorControl/UICustomCustomColorOperator.h \
        UICustomColorControl/UICustonColorDialog.h \
        UICustomSingleControl/UICustomCalendarWidget.h \
        UICustomSingleControl/UICustomColorViewWidget.h \
        UICustomSingleControl/UICustomComboBox.h \
        UICustomSingleControl/UICustomDateEdit.h \
        UICustomSingleControl/UICustomDoubleSpinBox.h \
        UICustomSingleControl/UICustomImageViewer.h \
        UICustomSingleControl/UICustomIntSpinBox.h \
        UICustomSingleControl/UICustomLineEdit.h \
        UICustomSingleControl/UICustomPostionWidget.h \
        UICustomSingleControl/UICustomSwitchWidget.h \
        UICustomSingleControl/UICustomTextEdit.h \
        UICustomSingleControl/UICustomTimeEdit.h \
        customcontrols_global.h 

unix {
    target.path = /usr/lib
    INSTALLS += target
}


================================================
FILE: CustomControls/UICurtomLeftBarControl/UICustomLefTabsControl.h
================================================
#ifndef UICUSTOMLEFTTABSCONTROL_H
#define UICUSTOMLEFTTABSCONTROL_H

#include "UICustomWidgtes/CustomWidget.h"
#include <QWidget>
#include <QStackedWidget>
#include "customcontrols_global.h"

class UICutomLeftWidget;
class CUSTOMCONTROLSSHARED_EXPORT UICustomLeftTabsControl : public CustomWidget
{
    Q_OBJECT

public:
    UICustomLeftTabsControl(QWidget* parent = nullptr);
    ~UICustomLeftTabsControl();

    // 添加元素
    void addWidget(QWidget* widget, const QString& name, const QString& iconPath = "");
    // 设置当前选中的Item
    void setCurrentSelectedItem(int index);

private:
    QStackedWidget* m_pStackWidget = nullptr;
    UICutomLeftWidget* m_pLeftWidget = nullptr;

private slots:
    void onClickedItem(int index);
};

#endif


================================================
FILE: CustomControls/UICurtomLeftBarControl/UICustomLeftItemWidget.cpp
================================================
#include "UICustomLeftItemWidget.h"
#include "UICustomCore/CustomStyleConfig.h"
#include <QPainter>

UICustomLeftItemWidget::UICustomLeftItemWidget(QWidget* parent)
    :CustomWidget(parent)
{
    g_StyleConfig->setCurrentStyle(this, "LeftBarItem");
}

UICustomLeftItemWidget::~UICustomLeftItemWidget()
{

}

void UICustomLeftItemWidget::customPaint(QPainter* painter)
{
    painter->save();
    painter->setRenderHint(QPainter::Antialiasing);

    // 绘制选中矩形
    if (m_isSelected)
    {
        painter->save();
        painter->fillRect(QRect(0, 0, m_nLeftSeletedWidth, this->height()), \
                          QBrush(g_StyleConfig->getHighLightColor()));

        // 绘制三角形
        QPolygon polygon;
        polygon << QPoint(this->width() - 4 * m_nArrowWidth, this->rect().center().y()) \
                << QPoint(this->width(), this->rect().center().y() - 3 * m_nArrowWidth) \
                << QPoint(this->width(), this->rect().center().y() + 3 * m_nArrowWidth);

        painter->setPen(Qt::NoPen);
        painter->setBrush(QColor(g_StyleConfig->getHighLightColor()));
        painter->drawPolygon(polygon);
        painter->restore();
    }

    // 绘制图标
    int nIconSize = this->height() - 2 * 2;
    if (!m_pixmap.isNull())
        painter->drawPixmap(QRect(m_nLeftSeletedWidth + m_nInterval, 2, nIconSize, nIconSize), m_pixmap);

    // 绘制文字
    int xPt = nIconSize + m_nLeftSeletedWidth + m_nInterval * 2;
    QRect textRect(xPt, 0, this->width() - xPt, this->height());
    QTextOption o;
    o.setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
    painter->drawText(textRect, m_cString, o);

    painter->restore();
}

void UICustomLeftItemWidget::mousePressEvent(QMouseEvent* event)
{
    setSelected(true);
    this->update();

    // 发送点击信号
    emit clickedItem();

    return CustomWidget::mousePressEvent(event);
}

QSize UICustomLeftItemWidget::sizeHint(void) const
{
    return QSize(250, 50);
}

// 设置/获取是否被选中
void UICustomLeftItemWidget::setSelected(bool isSelected)
{
    m_isSelected = isSelected;
    if (m_isSelected)
        g_StyleConfig->setCurrentStyle(this, "LeftBarItemSelected", true);
    else
        g_StyleConfig->setCurrentStyle(this, "LeftBarItem", true);

    this->update();
}

bool UICustomLeftItemWidget::isSelected(void)
{
    return m_isSelected;
}

// 设置/获取字符串
void UICustomLeftItemWidget::setText(const QString& name)
{
    m_cString = name;
    this->update();
}

QString UICustomLeftItemWidget::getText(void)
{
    return m_cString;
}

void UICustomLeftItemWidget::setIcon(const QString& imageFile)
{
    m_pixmap.load(imageFile);
    this->update();
}


================================================
FILE: CustomControls/UICurtomLeftBarControl/UICustomLeftItemWidget.h
================================================
#ifndef UICUSTOMLEFTITEMWIDGET_H
#define UICUSTOMLEFTITEMWIDGET_H

#include "UICustomWidgtes/CustomWidget.h"
#include "customcontrols_global.h"
#include <QWidget>

class CUSTOMCONTROLSSHARED_EXPORT UICustomLeftItemWidget : public CustomWidget
{
    Q_OBJECT
public:
    UICustomLeftItemWidget(QWidget* parent = nullptr);
    ~UICustomLeftItemWidget();

    // 设置/获取是否被选中
    void setSelected(bool isSelected);
    bool isSelected(void);

    // 设置/获取字符串
    void setText(const QString& name);
    QString getText(void);

    // 设置图标
    void setIcon(const QString& imageFile);

protected:
    void customPaint(QPainter* painter) override;
    void mousePressEvent(QMouseEvent* event) override;
    QSize sizeHint(void) const override;

    bool m_isSelected = false;
    QString m_cString;
    QPixmap m_pixmap;

    int m_nLeftSeletedWidth = 5;
    int m_nInterval = 2;
    int m_nArrowWidth = 4;

signals:
    void clickedItem(void);
};

#endif


================================================
FILE: CustomControls/UICurtomLeftBarControl/UICustomLeftTabsControl.cpp
================================================
#include "UICustomLefTabsControl.h"
#include "UICustomLeftWidget.h"
#include <QSplitter>
#include <QVBoxLayout>

UICustomLeftTabsControl::UICustomLeftTabsControl(QWidget* parent)
    :CustomWidget(parent)
{
    QHBoxLayout* mainLayout = new QHBoxLayout(this);
    mainLayout->setMargin(0);
    mainLayout->setSpacing(0);

    QSplitter* splitter = new QSplitter(Qt::Horizontal);
    mainLayout->addWidget(splitter);

    // 添加 左侧工具条
    m_pLeftWidget = new UICutomLeftWidget;
    QObject::connect(m_pLeftWidget, &UICutomLeftWidget::clickedItem, \
                     this, &UICustomLeftTabsControl::onClickedItem);
    splitter->addWidget(m_pLeftWidget);

    // 添加右侧主要部分
    m_pStackWidget = new QStackedWidget;
    splitter->addWidget(m_pStackWidget);

    // 设置 Handle Hover Attribute
    QSplitterHandle* handle = splitter->handle(1);
    if (handle != nullptr)
        handle->setAttribute(Qt::WA_Hover, true);
}

UICustomLeftTabsControl::~UICustomLeftTabsControl()
{

}

void UICustomLeftTabsControl::addWidget(QWidget* widget, const QString& name, const QString& iconPath)
{
    m_pLeftWidget->addItem(name, iconPath);
    m_pStackWidget->addWidget(widget);
}

void UICustomLeftTabsControl::setCurrentSelectedItem(int index)
{
    m_pLeftWidget->setCurrentSelected(index);
}

void UICustomLeftTabsControl::onClickedItem(int index)
{
    m_pStackWidget->setCurrentIndex(index);
}


================================================
FILE: CustomControls/UICurtomLeftBarControl/UICustomLeftWidget.cpp
================================================
#include "UICustomLeftWidget.h"
#include <QVBoxLayout>
#include "UICustomLeftItemWidget.h"
#include "UICustomCore/CustomStyleConfig.h"

UICutomLeftWidget::UICutomLeftWidget(QWidget* parent)
    :CustomWidget(parent)
{
    this->setMinimumWidth(250);
    this->setMaximumWidth(300);
    m_pMainLayout = new QVBoxLayout(this);
    m_pMainLayout->setMargin(4);
    m_pMainLayout->setSpacing(2);
    m_pMainLayout->addStretch();

    g_StyleConfig->setCurrentStyle(this, "LeftBar");
}

UICutomLeftWidget::~UICutomLeftWidget()
{

}

void UICutomLeftWidget::addItem(const QString& name, const QString& iconPath)
{
    UICustomLeftItemWidget* item = new UICustomLeftItemWidget;
    QObject::connect(item, &UICustomLeftItemWidget::clickedItem, this, &UICutomLeftWidget::onClickedItem);
    item->setText(name);

    if (!iconPath.isEmpty())
        item->setIcon(iconPath);

    m_pMainLayout->insertWidget(m_items.count(), item);
    m_items << item;
}

void UICutomLeftWidget::cleanAllSelected(void)
{
    foreach(auto item , m_items)
        item->setSelected(false);
}

void UICutomLeftWidget::onClickedItem(void)
{
    UICustomLeftItemWidget* itemWidget = qobject_cast<UICustomLeftItemWidget*>(sender());
    if (itemWidget == nullptr)
        return;

    cleanAllSelected();
    itemWidget->setSelected(true);

    // 查找点击的Item的索引
    int index = 0;
    bool hasFinded = false;
    for (auto iter = m_items.begin(); iter != m_items.end(); ++iter)
    {
        if (itemWidget == *iter)
        {
            hasFinded = true;
            break;
        }

        index++;
    }

    // 发送点击信号
    if (hasFinded)
        emit clickedItem(index);
}

void UICutomLeftWidget::setCurrentSelected(int index)
{
    m_items[index]->setSelected(true);
}


================================================
FILE: CustomControls/UICurtomLeftBarControl/UICustomLeftWidget.h
================================================
#ifndef UICUSTOMLEFTWIDGET_H
#define UICUSTOMLEFTWIDGET_H

#include "UICustomWidgtes/CustomWidget.h"
#include <QWidget>

class QVBoxLayout;
class UICustomLeftItemWidget;
class UICutomLeftWidget : public CustomWidget
{
    Q_OBJECT

public:
    UICutomLeftWidget(QWidget* parent = nullptr);
    ~UICutomLeftWidget();

    // 添加元素
    void addItem(const QString& name, const QString& iconPath = "");
    // 清除所有选中
    void cleanAllSelected(void);
    // 设置当前选中
    void setCurrentSelected(int index);

private:
    QVBoxLayout* m_pMainLayout = nullptr;
    QList<UICustomLeftItemWidget*> m_items;

private slots:
    void onClickedItem(void);

signals:
    void clickedItem(int);
};

#endif


================================================
FILE: CustomControls/UICustomColorControl/UICustomColorCircle.cpp
================================================
#include "UICustomColorCircle.h"
#include "UICustomCore/CustomStyleConfig.h"
#include <QPainter>
#include <QMouseEvent>
#include <QLinearGradient>
#include <math.h>

UICustomColorCircle::UICustomColorCircle(QWidget* parent)
    :CustomWidget(parent)
{
    m_colorVec << QColor(255, 0, 0) << QColor(255, 255, 0) \
               << QColor(0, 255, 0) << QColor(0, 255, 255) \
               << QColor(0, 0, 255) << QColor(255, 0, 255);

    //this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
}

UICustomColorCircle::~UICustomColorCircle()
{

}

void UICustomColorCircle::customPaint(QPainter* painter)
{
    painter->setRenderHint(QPainter::Antialiasing);

    QConicalGradient conicalGradient(this->rect().center(), 0);
    qreal interval = 1.0 / m_colorVec.size();
    // 设置渐变颜色
    for (int i=0; i<m_colorVec.size(); ++i)
    {
        conicalGradient.setColorAt(interval * i, m_colorVec[i]);
    }
    conicalGradient.setColorAt(1.0, m_colorVec[0]);

    // 绘制圆环
    painter->setBrush(conicalGradient);
    painter->setPen(QPen(Qt::NoPen));
    int width = qMin(this->width(), this->height()) / 2 * 2;
    QRect centerRect(this->rect().center().x() - width / 2, \
                     this->rect().center().y() - width / 2, \
                     width, width);
    painter->drawEllipse(centerRect);

    // 绘制中间部分
    centerRect.adjust(m_nCircleWidth, m_nCircleWidth, -m_nCircleWidth, -m_nCircleWidth);
    painter->setBrush(QColor(g_StyleConfig->getNormalBackgroundColor()));
    painter->drawEllipse(centerRect);

    // 绘制H选择圆圈
    QPen nPen;
    nPen.setColor(QColor(0, 0, 0));
    nPen.setWidth(2);
    painter->setPen(nPen);
    painter->setBrush(Qt::NoBrush);
    QVector2D vec(cos(m_nHValue / (180 / 3.1415926)), sin(m_nHValue / (180 / 3.1415926)));
    vec.normalize();
    int length = centerRect.width() / 2 + m_nCircleWidth / 2;
    vec = vec * length;
    vec = QVector2D(this->rect().center().x() + vec.x(), this->rect().center().y() - vec.y());
    painter->drawEllipse(QPoint(vec.x(), vec.y()), m_nCircleWidth / 5, m_nCircleWidth / 5);

    // 绘制中间矩形
    int d = static_cast<int>(sqrt(2) * centerRect.width() / 2);
    QRect rect(centerRect.center().x() - d / 2, centerRect.center().y() - d / 2, d, d);
    rect.adjust(2, 2, -2, -2);
    drawCenterRect(rect, painter);
}

void UICustomColorCircle::drawCenterRect(const QRect& rect, QPainter* painter)
{
    painter->save();
    QLinearGradient linearGradientH(rect.topLeft(), rect.topRight());
    linearGradientH.setColorAt(0, QColor(255, 255, 255));
    QColor color;
    color.setHsv(m_nHValue, 255, 255);
    linearGradientH.setColorAt(1, color);
    painter->fillRect(rect, linearGradientH);

    QLinearGradient linearGradientV(rect.topLeft(), rect.bottomLeft());
    linearGradientV.setColorAt(0, QColor(0, 0, 0, 0));
    linearGradientV.setColorAt(1, QColor(0, 0, 0, 255));
    painter->fillRect(rect, linearGradientV);

    // 绘制选中的圈
    int h, s, v;
    m_currentColor.getHsv(&h, &s, &v);
    qreal interValX = rect.width() * s * 1.0 / 255;
    qreal interValY = rect.height() * v * 1.0 / 255;
    QPoint centerPos(rect.bottomLeft().x() + interValX, rect.bottomLeft().y() - interValY);
    QPen nPen;
    nPen.setColor(QColor(0, 0, 0));
    nPen.setWidth(2);
    painter->setPen(nPen);
    painter->setBrush(Qt::NoBrush);
    painter->drawEllipse(centerPos, m_nCircleWidth / 5, m_nCircleWidth / 5);

    painter->restore();
}

qreal UICustomColorCircle::distance(QPoint p1, QPoint p2)
{
    return sqrt((p1.x() - p2.x()) * (p1.x() - p2.x()) + (p1.y() - p2.y()) * (p1.y() - p2.y()));
}

int UICustomColorCircle::getHValue(QPoint pos)
{
    QPoint centerPos = this->rect().center();
    QVector2D vec = QVector2D(pos) - QVector2D(centerPos);
    vec.normalize();

    float angle = acos(vec.x());
    int value = static_cast<int>(angle * (180 / 3.1415926));
    if (pos.y() > centerPos.y())
        value = 360 - value;

    return value;
}

void UICustomColorCircle::updateCurrentColor(QPoint pos)
{
    int width = qMin(this->width(), this->height()) / 2 * 2;
    QRect centerRect(this->rect().center().x() - width / 2, \
                     this->rect().center().y() - width / 2, \
                     width, width);

    centerRect.adjust(m_nCircleWidth, m_nCircleWidth, -m_nCircleWidth, -m_nCircleWidth);
    int d = static_cast<int>(sqrt(2) * centerRect.width() / 2);
    QRect rect(centerRect.center().x() - d / 2, centerRect.center().y() - d / 2, d, d);
    rect.adjust(2, 2, -2, -2);

    int sValue = qMin(static_cast<int>((pos.x() - rect.x()) * 1.0 / rect.width() * 255), 255);
    int vValue = qMin(static_cast<int>((rect.bottom() - pos.y()) * 1.0 / rect.height() * 255), 255);
    sValue = qMax(sValue, 0);
    vValue = qMax(vValue, 0);
    m_currentColor.setHsv(m_nHValue, sValue, vValue);
}

QColor UICustomColorCircle::getCurrentColor(void)
{
    int h, s, v;
    m_currentColor.getHsv(&h, &s, &v);
    m_currentColor.setHsv(m_nHValue, s, v);

    return m_currentColor;
}

void UICustomColorCircle::setCurrentColor(const QColor& color)
{
    m_currentColor = color;

    int h, s, v;
    m_currentColor.getHsv(&h, &s, &v);
    m_nHValue = h;
    this->update();
}

void UICustomColorCircle::resizeEvent(QResizeEvent* event)
{
    int width = qMin(this->size().width(), this->size().height());
    m_nCircleWidth = static_cast<int>(width / 8.0);

    return CustomWidget::resizeEvent(event);
}

void UICustomColorCircle::mousePressEvent(QMouseEvent* event)
{
    m_selectMode = Normal;
    QPoint pos = event->pos();

    int width = qMin(this->width(), this->height()) / 2 * 2;
    QRect centerRect(this->rect().center().x() - width / 2, \
                     this->rect().center().y() - width / 2, \
                     width, width);

    qreal distance1 = distance(this->rect().center(), pos);
    qreal distance2 = abs(centerRect.topLeft().x() - this->rect().center().x());

    // 判断是否选中圆环
    centerRect.adjust(m_nCircleWidth, m_nCircleWidth, -m_nCircleWidth, -m_nCircleWidth);
    qreal distance3 = abs(centerRect.topLeft().x() - this->rect().center().x());
    if (distance1 > distance3 && distance1 < distance2)
        m_selectMode = Circle;

    // 判断是否选中中间矩形
    int d = static_cast<int>(sqrt(2) * centerRect.width() / 2);
    QRect rect(centerRect.center().x() - d / 2, centerRect.center().y() - d / 2, d, d);
    rect.adjust(2, 2, -2, -2);
    if (rect.contains(pos))
        m_selectMode = Rect;

    if (m_selectMode == Circle)
    {
        m_nHValue = getHValue(pos);
        emit colorChanged();
        this->update();
    }
    else if (m_selectMode == Rect)
    {
        updateCurrentColor(pos);
        emit colorChanged();
        this->update();
    }

    return CustomWidget::mousePressEvent(event);
}

void UICustomColorCircle::mouseReleaseEvent(QMouseEvent* event)
{
    QPoint pos = event->pos();
    if (m_selectMode == Circle)
    {
        m_nHValue = getHValue(pos);
        emit colorChanged();
        this->update();
    }
    else if (m_selectMode == Rect)
    {
        updateCurrentColor(pos);
        emit colorChanged();
        this->update();
    }

    m_selectMode = Normal;
    return CustomWidget::mouseReleaseEvent(event);
}

void UICustomColorCircle::mouseMoveEvent(QMouseEvent* event)
{
    QPoint pos = event->pos();
    if (m_selectMode == Circle)
    {
        m_nHValue = getHValue(pos);
        emit colorChanged();
        this->update();
    }
    else if (m_selectMode == Rect)
    {
        updateCurrentColor(pos);
        emit colorChanged();
        this->update();
    }

    return CustomWidget::mouseMoveEvent(event);
}

QSize UICustomColorCircle::sizeHint() const
{
    QSize size(250, 250);
    return size;
}


================================================
FILE: CustomControls/UICustomColorControl/UICustomColorCircle.h
================================================
#ifndef UICUSTOMCOLORRANGE_H
#define UICUSTOMCOLORRANGE_H

#include "UICustomWidgtes/CustomWidget.h"
class UICustomColorCircle : public CustomWidget
{
    Q_OBJECT

public:
    UICustomColorCircle(QWidget* parent = nullptr);
    ~UICustomColorCircle();

    enum SelectedMode
    {
        Normal,     // 未选中状态
        Circle,     // 圆环选中状态
        Rect        // 矩形区域选中状态
    };

    // 设置/获取当前颜色
    QColor getCurrentColor(void);
    void setCurrentColor(const QColor& color);

protected:
    void customPaint(QPainter* painter) override;
    void resizeEvent(QResizeEvent* event) override;
    QSize sizeHint() const override;

    void mousePressEvent(QMouseEvent* event) override;
    void mouseReleaseEvent(QMouseEvent* event) override;
    void mouseMoveEvent(QMouseEvent* event) override;

private:
    int m_nCircleWidth = 30;
    int m_nHValue = 0;
    QVector<QColor> m_colorVec;
    SelectedMode m_selectMode = Normal;
    QColor m_currentColor;

    // 绘制中心矩形
    void drawCenterRect(const QRect& rect, QPainter* painter);
    // 获取两点之间的距离
    qreal distance(QPoint p1, QPoint p2);
    // 根据点的位置或者角度
    int getHValue(QPoint pos);
    // 更新当前颜色值显示
    void updateCurrentColor(QPoint pos);

signals:
    void colorChanged(void);
};
#endif


================================================
FILE: CustomControls/UICustomColorControl/UICustomColorSlider.cpp
================================================
#include "UICustomColorSlider.h"

UICustomColorSlider::UICustomColorSlider(QWidget *parent)
    :UICustomCombineControlBase(parent)
{
    m_pColorSliderItem = new UICustomColorSliderItem;
    m_pValueSpixBox = new UICustomIntSpinBox;

    m_pMainLayout->addWidget(m_pValueSpixBox);
    m_pMainLayout->addWidget(m_pColorSliderItem);
    m_pColorSliderItem->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
    this->setColumnWidth(0, 40);

    QObject::connect(m_pColorSliderItem, &UICustomColorSliderItem::changedValue, \
                     this, &UICustomColorSlider::onChangedValue);
    QObject::connect(m_pColorSliderItem, &UICustomColorSliderItem::changedValue, \
                     this, &UICustomColorSlider::valueChanged);

    QObject::connect(m_pValueSpixBox, &UICustomIntSpinBox::editingFinished, [&](void){
        emit valueChanged(m_pValueSpixBox->value());
    });
}

UICustomColorSlider::~UICustomColorSlider()
{

}

void UICustomColorSlider::setValueRange(int minValue, int maxValue)
{
    m_pValueSpixBox->setMinimum(minValue);
    m_pValueSpixBox->setMaximum(maxValue);

    m_nMinValue = minValue;
    m_nMaxValue = maxValue;
}

// 设置开始颜色
void UICustomColorSlider::setStartColor(const QColor& startColor)
{
    m_pColorSliderItem->setStartColor(startColor);
}

// 设置结束颜色
void UICustomColorSlider::setEndColor(const QColor& endColor)
{
    m_pColorSliderItem->setEndColor(endColor);
}

void UICustomColorSlider::onChangedValue(int value)
{
    int val = (m_nMaxValue - m_nMinValue) * value * 1.0 / 100;
    m_pValueSpixBox->setValue(val);
}

// 设置当前值
void UICustomColorSlider::setCurrentValue(int value)
{
    if (value < m_nMinValue || value > m_nMaxValue)
        return;

    m_pValueSpixBox->setValue(value);
    int val = (value - m_nMinValue) * 1.0 / (m_nMaxValue - m_nMinValue) * 100;
    m_pColorSliderItem->setCurrentValue(val);
}

// 获取当前值
int UICustomColorSlider::getCurrentValue(void)
{
    return m_pValueSpixBox->value();
}

// 设置是否为H
void UICustomColorSlider::setHVisible(bool isVisible)
{
    m_pColorSliderItem->setHVisible(isVisible);
}


================================================
FILE: CustomControls/UICustomColorControl/UICustomColorSlider.h
================================================
#ifndef UICUSTOMCOLORSLIDER_H
#define UICUSTOMCOLORSLIDER_H

#include "UICustomWidgtes/CustomWidget.h"
#include "UICustomColorSliderItem.h"
#include "CustomCombineControl/UICustomCombineControlBase.h"
#include "UICustomSingleControl/UICustomColorViewWidget.h"
#include "UICustomSingleControl/UICustomIntSpinBox.h"

class UICustomColorSlider : public UICustomCombineControlBase
{
    Q_OBJECT

public:
    UICustomColorSlider(QWidget *parent = nullptr);
    ~UICustomColorSlider();

    // 设置 最小值、最大值
    void setValueRange(int minValue, int maxValue);

    // 设置开始颜色
    void setStartColor(const QColor& startColor);
    // 设置结束颜色
    void setEndColor(const QColor& endColor);

    // 设置当前值
    void setCurrentValue(int value);
    // 获取当前值
    int getCurrentValue(void);

    // 设置是否为H
    void setHVisible(bool isVisible);

private:
    UICustomColorSliderItem* m_pColorSliderItem = nullptr;
    UICustomIntSpinBox* m_pValueSpixBox = nullptr;

    int m_nMinValue = 0;
    int m_nMaxValue = 100;

private slots:
    void onChangedValue(int value);

signals:
    void valueChanged(int value);
};

#endif


================================================
FILE: CustomControls/UICustomColorControl/UICustomColorSliderItem.cpp
================================================
#include "UICustomColorSliderItem.h"
#include <QPainter>
#include <QMouseEvent>

UICustomColorSliderItem::UICustomColorSliderItem(QWidget* parent)
    :CustomWidget(parent)
    , m_cStartColor(255, 0, 0)
    , m_cEndColor(0, 255, 0)
{
    m_colorVec  << QColor(255, 0, 0) << QColor(255, 255, 0) \
                << QColor(0, 255, 0) << QColor(0, 255, 255) \
                << QColor(0, 0, 255) << QColor(255, 0, 255);
}

UICustomColorSliderItem::~UICustomColorSliderItem()
{

}

void UICustomColorSliderItem::customPaint(QPainter* painter)
{
    painter->save();
    painter->setRenderHint(QPainter::Antialiasing);
    QRect rect = this->rect().adjusted(m_nMargin + m_nSliderWidth / 2 - m_nInterVal, m_nMargin, \
                                       -(m_nMargin + m_nSliderWidth / 2 - m_nInterVal), \
                                       -m_nMargin - m_nSliderHeight);

    // 绘制边框
    painter->setPen(QPen(QColor(200, 200, 200)));
    painter->drawRoundedRect(rect, 4, 4);

    // 绘制渐变
    rect = rect.adjusted(m_nInterVal, m_nInterVal, -m_nInterVal, -m_nInterVal);
    QLinearGradient linerGradient(rect.topLeft(), rect.topRight());
    if (m_isHValueSlider)
    {
        for (int i=0; i<m_colorVec.size(); ++i)
        {
            qreal value = 1.0 / m_colorVec.size() * i;
            linerGradient.setColorAt(value, m_colorVec[i]);
        }
    }
    else
    {
        linerGradient.setColorAt(0, m_cStartColor);
        linerGradient.setColorAt(1, m_cEndColor);
    }

    painter->setPen(Qt::NoPen);
    painter->setBrush(linerGradient);
    painter->drawRoundedRect(rect, 4, 4);

    // 绘制滑动三角形手柄
    painter->setBrush(QColor(220, 220, 220));
    qreal xPt = m_nCurrentValue * 1.0 / (m_nMaxValue - m_nMinValue) * rect.width() + rect.x();
    QPoint currentPos(xPt, rect.bottom() + m_nInterVal + 1);
    QPolygon polygon;
    polygon << currentPos << QPoint(currentPos.x() - m_nSliderWidth / 2, currentPos.y() + m_nSliderHeight) \
            << QPoint(currentPos.x() + m_nSliderWidth / 2, currentPos.y() + m_nSliderHeight);
    painter->drawPolygon(polygon);

    painter->restore();
}

void UICustomColorSliderItem::mousePressEvent(QMouseEvent* event)
{
    QRect rect = this->rect().adjusted(m_nMargin + m_nSliderWidth / 2 - m_nInterVal, m_nMargin, \
                                       -(m_nMargin + m_nSliderWidth / 2 - m_nInterVal), \
                                       -m_nMargin - m_nSliderHeight);
    rect = rect.adjusted(m_nInterVal, m_nInterVal, -m_nInterVal, -m_nInterVal);
    qreal xPt = m_nCurrentValue * 1.0 / (m_nMaxValue - m_nMinValue) * rect.width() + rect.x();
    QPoint currentPos(xPt, rect.bottom() + m_nInterVal + 1);
    QPolygon polygon;
    polygon << currentPos << QPoint(currentPos.x() - m_nSliderWidth / 2, currentPos.y() + m_nSliderHeight) \
            << QPoint(currentPos.x() + m_nSliderWidth / 2, currentPos.y() + m_nSliderHeight);

    // 判断是否选中
    m_isSelected = false;
    QPoint pos = event->pos();
    if (rect.contains(pos))
        m_isSelected = true;
    else if (polygon.containsPoint(pos, Qt::OddEvenFill))
        m_isSelected = true;

    if (m_isSelected)
        selectedPoint(pos);
}

void UICustomColorSliderItem::mouseMoveEvent(QMouseEvent* event)
{
    QPoint pos = event->pos();
    if (m_isSelected)
        selectedPoint(pos);
}

void UICustomColorSliderItem::mouseReleaseEvent(QMouseEvent* event)
{
    QPoint pos = event->pos();
    if (m_isSelected)
        selectedPoint(pos);

    m_isSelected = false;

}

QSize UICustomColorSliderItem::sizeHint() const
{
    QSize size(200, 30);
    return size;
}

void UICustomColorSliderItem::selectedPoint(const QPoint& pos)
{
    QRect rect = this->rect().adjusted(m_nMargin + m_nSliderWidth / 2 - m_nInterVal, m_nMargin, \
                                       -(m_nMargin + m_nSliderWidth / 2 - m_nInterVal), \
                                       -m_nMargin - m_nSliderHeight);
    rect = rect.adjusted(m_nInterVal, m_nInterVal, -m_nInterVal, -m_nInterVal);

    int value = (pos.x() - rect.x()) * 1.0 / rect.width() * (m_nMaxValue - m_nMinValue) + m_nMinValue;
    value = qMax(value, m_nMinValue);
    value = qMin(value, m_nMaxValue);
    m_nCurrentValue = value;

    // 发送信号
    emit changedValue(m_nCurrentValue);

    this->update();
}

// 设置开始颜色
void UICustomColorSliderItem::setStartColor(const QColor& startColor)
{
    m_cStartColor = startColor;
    this->update();
}

// 设置结束颜色
void UICustomColorSliderItem::setEndColor(const QColor& endColor)
{
    m_cEndColor = endColor;
    this->update();
}

// 设置当前选中的值
void UICustomColorSliderItem::setCurrentValue(int value)
{
    m_nCurrentValue = value;
    this->update();
}

// 获取当前选中值
int UICustomColorSliderItem::getCurrentValue(void)
{
    return m_nCurrentValue;
}

void UICustomColorSliderItem::setHVisible(bool isVisible)
{
    m_isHValueSlider = isVisible;
}


================================================
FILE: CustomControls/UICustomColorControl/UICustomColorSliderItem.h
================================================
#ifndef UICUSTOMCOLORSLIDERITEM_H
#define UICUSTOMCOLORSLIDERITEM_H

#include <QWidget>
#include "UICustomWidgtes/CustomWidget.h"
class QColor;
class UICustomColorSliderItem : public CustomWidget
{
    Q_OBJECT

public:
    UICustomColorSliderItem(QWidget* parent = nullptr);
    ~UICustomColorSliderItem();

    // 设置开始颜色
    void setStartColor(const QColor& startColor);
    // 设置结束颜色
    void setEndColor(const QColor& endColor);

    // 设置当前选中的值
    void setCurrentValue(int value);
    // 获取当前选中值
    int getCurrentValue(void);

    // 设置是否为H
    void setHVisible(bool isVisible);

protected:
    void customPaint(QPainter* painter) override;
    void mousePressEvent(QMouseEvent* event) override;
    void mouseMoveEvent(QMouseEvent* event) override;
    void mouseReleaseEvent(QMouseEvent* event) override;
    QSize sizeHint() const override;

private:
    int m_nMargin = 1;
    int m_nSliderWidth = 12;     // 滑块宽度
    int m_nSliderHeight = 10;    // 滑块高度
    int m_nInterVal = 4;

    int m_nCurrentValue = 0;    // 当前选中数值
    int m_nMinValue = 0;        // 最小值
    int m_nMaxValue = 100;      // 最大值

    QColor m_cStartColor;       // 开始颜色
    QColor m_cEndColor;         // 结束颜色

    QVector<QColor> m_colorVec;
    bool m_isHValueSlider = false;

    bool m_isSelected = false;
    // 根据点更新显示
    void selectedPoint(const QPoint& pos);

signals:
    void changedValue(int value);
};
#endif


================================================
FILE: CustomControls/UICustomColorControl/UICustomColorWidget.cpp
================================================
#include "UICustomColorWidget.h"
#include <QHBoxLayout>
#include <QPushButton>
#include <QDebug>

UICustomColorWidget::UICustomColorWidget(QWidget* parent)
    :CustomWidget(parent)
    ,m_currentColor(0, 0, 0)
{
    // CustomColor
    m_pCustomColorOperator = new UICustomCustomColorOperator(this);

    m_pLayout = new QVBoxLayout(this);
    m_pLayout->setSpacing(0);

    QWidget* pW = new QWidget;
    pW->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
    m_pLayout->addWidget(pW);

    m_pColorCircle = new UICustomColorCircle;
    m_pColorCircle->setFixedSize(300, 300);

    m_pMainLayout = new QHBoxLayout(pW);
    m_pMainLayout->setMargin(0);
    initColorCircle();
    initColorSliderWidget();
    initColorButtonWidget();

    QObject::connect(m_pColorCircle, &UICustomColorCircle::colorChanged, \
                     this, &UICustomColorWidget::onColorChanged);
}

UICustomColorWidget::~UICustomColorWidget()
{

}

void UICustomColorWidget::initColorCircle(void)
{
    QWidget* widget = new QWidget;
    m_pMainLayout->addWidget(widget);

    QVBoxLayout* layout = new QVBoxLayout(widget);
    layout->setMargin(2);
    layout->addWidget(m_pColorCircle);
}

void UICustomColorWidget::initColorSliderWidget(void)
{
    QWidget* widget = new QWidget;
    widget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
    m_pMainLayout->addWidget(widget);

    QVBoxLayout* layout = new QVBoxLayout(widget);
    layout->setMargin(0);
    layout->setSpacing(2);

    initColorRGBSliderWidget();
    initColorHSVSliderWidget();

    layout->addWidget(m_pRGBGroup);
    layout->addWidget(m_pHSVGroup);

    layout->addStretch();
}

void UICustomColorWidget::initColorHSVSliderWidget(void)
{
    m_pHSVGroup = new QGroupBox("HSV");

    QVBoxLayout *playout = new QVBoxLayout(m_pHSVGroup);
    m_pHSlider = new UICustomColorSlider;
    m_pHSlider->setTagText("H: ");
    m_pHSlider->setHVisible(true);
    m_pHSlider->setValueRange(0, 359);
    playout->addWidget(m_pHSlider);
    QObject::connect(m_pHSlider, &UICustomColorSlider::valueChanged, \
                     this, &UICustomColorWidget::onHSVSliderColorChanged);

    m_pSSlider = new UICustomColorSlider;
    m_pSSlider->setTagText("S: ");
    m_pSSlider->setValueRange(0, 255);
    playout->addWidget(m_pSSlider);
    QObject::connect(m_pSSlider, &UICustomColorSlider::valueChanged, \
                     this, &UICustomColorWidget::onHSVSliderColorChanged);

    m_pVSlider = new UICustomColorSlider;
    m_pVSlider->setTagText("V: ");
    m_pVSlider->setValueRange(0, 255);
    playout->addWidget(m_pVSlider);
    QObject::connect(m_pVSlider, &UICustomColorSlider::valueChanged, \
                     this, &UICustomColorWidget::onHSVSliderColorChanged);
}

void UICustomColorWidget::initColorButtonWidget(void)
{
    QWidget* bottomWidget = new QWidget;
    bottomWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
    QHBoxLayout* mainLayout = new QHBoxLayout(bottomWidget);
    mainLayout->setMargin(0);

    // 添加自定义颜色
    initColorCustomWidget();
    mainLayout->addWidget(m_pCustomGroup);

    m_pColorView = new UICustomColorViewWidget;
    m_pColorView->setDragVisible(true);
    m_pColorView->setFixedSize(120, 120);
    mainLayout->addWidget(m_pColorView);

    QVBoxLayout *bottomLayout = new QVBoxLayout;
    bottomLayout->addStretch();

    // 添加到自定义按钮
    QPushButton* addButton = new QPushButton(tr("AddToCustom"));
    addButton->setFixedSize(120, 30);
    bottomLayout->addWidget(addButton);
    QObject::connect(addButton, &QPushButton::clicked, this, &UICustomColorWidget::onClickedAddCustomColor);

    // 确定按钮
    QPushButton* okButton = new QPushButton(tr("OK"));
    okButton->setFixedSize(120, 30);
    bottomLayout->addWidget(okButton);
    QObject::connect(okButton, &QPushButton::clicked, this, &UICustomColorWidget::clickedOKButton);

    // 取消按钮
    QPushButton* cannelButton = new QPushButton(tr("Cannel"));
    cannelButton->setFixedSize(120, 30);
    bottomLayout->addWidget(cannelButton);
    mainLayout->addLayout(bottomLayout);
    QObject::connect(cannelButton, &QPushButton::clicked, this, &UICustomColorWidget::clickedCannelButton);

    m_pLayout->addWidget(bottomWidget);
}

void UICustomColorWidget::initColorCustomWidget(void)
{
    m_pCustomGroup = new QGroupBox(tr("Custom Color"));
    QGridLayout *layout = new QGridLayout(m_pCustomGroup);
    layout->setMargin(0);
    layout->setSpacing(0);

    for (int i=0; i<14; ++i)
    {
        UICustomColorViewWidget* colorView = new UICustomColorViewWidget;
        colorView->setAcceptDrops(true);
        colorView->setFixedSize(70, 30);

        layout->addWidget(colorView, i / (14 / 2), i % (14 / 2));
        m_colorViewsList << colorView;

        // 点击时,设置颜色
        QObject::connect(colorView, &UICustomColorViewWidget::mousePressed, \
                         this, &UICustomColorWidget::onClickedColorView);
        QObject::connect(colorView, &UICustomColorViewWidget::dropSignal, \
                         this, &UICustomColorWidget::onDropSignal);
    }

    // 保存到文件
    loadCustomColor();
}

// 点击自定义颜色
void UICustomColorWidget::onClickedColorView(void)
{
    UICustomColorViewWidget* pColorView = dynamic_cast<UICustomColorViewWidget*>(sender());
    if (pColorView == nullptr)
        return;

    // 清除选择
    for (auto iter = m_colorViewsList.begin(); iter != m_colorViewsList.end(); ++iter)
        (*iter)->setSelected(false);

    // 设置选中
    pColorView->setSelected(true);

    // 设置当前的颜色
    QColor color = pColorView->getCurrentColor();
    setCurrentColor(color);
}

void UICustomColorWidget::onClickedAddCustomColor(void)
{
    // 设置选中的为当前颜色
    for (auto iter = m_colorViewsList.begin(); iter != m_colorViewsList.end(); ++iter)
    {
        bool isSelected = (*iter)->getSelected();
        if (isSelected)
        {
            (*iter)->setCurrentColor(m_currentColor);
            break;
        }
    }

    // 保存到文件
    saveCustomColor();
}

void UICustomColorWidget::onDropSignal(void)
{
    // 保存到文件
    saveCustomColor();
}

void UICustomColorWidget::initColorRGBSliderWidget(void)
{
    m_pRGBGroup = new QGroupBox("RGB");
    QVBoxLayout *playout = new QVBoxLayout(m_pRGBGroup);

    m_pRedSlider = new UICustomColorSlider;
    m_pRedSlider->setTagText("R: ");
    playout->addWidget(m_pRedSlider);
    m_pRedSlider->setValueRange(0, 255);
    m_pRedSlider->setStartColor(QColor(0, m_currentColor.green(), m_currentColor.blue()));
    m_pRedSlider->setEndColor(QColor(255, m_currentColor.green(), m_currentColor.blue()));
    QObject::connect(m_pRedSlider, &UICustomColorSlider::valueChanged, \
                     this, &UICustomColorWidget::onSliderColorChanged);

    m_pGreenSlider = new UICustomColorSlider;
    m_pGreenSlider->setTagText("G: ");
    playout->addWidget(m_pGreenSlider);
    m_pGreenSlider->setValueRange(0, 255);
    m_pGreenSlider->setStartColor(QColor(m_currentColor.red(), 0, m_currentColor.blue()));
    m_pGreenSlider->setEndColor(QColor(m_currentColor.red(), 255, m_currentColor.blue()));
    QObject::connect(m_pGreenSlider, &UICustomColorSlider::valueChanged, \
                     this, &UICustomColorWidget::onSliderColorChanged);

    m_pBlueSlider = new UICustomColorSlider;
    m_pBlueSlider->setTagText("B: ");
    playout->addWidget(m_pBlueSlider);
    m_pBlueSlider->setValueRange(0, 255);
    m_pBlueSlider->setStartColor(QColor(m_currentColor.red(), m_currentColor.green(), 0));
    m_pBlueSlider->setEndColor(QColor(m_currentColor.red(), m_currentColor.green(), 255));
    QObject::connect(m_pBlueSlider, &UICustomColorSlider::valueChanged, \
                     this, &UICustomColorWidget::onSliderColorChanged);
}

void UICustomColorWidget::onColorChanged(void)
{
    QColor color = m_pColorCircle->getCurrentColor();
    m_pColorView->setCurrentColor(color);

    m_currentColor = color;

    // 更新Color颜色显示
    updateForColorSlider();
    updateForColorSliderValue();
}

void UICustomColorWidget::onSliderColorChanged(void)
{
    int rValue = m_pRedSlider->getCurrentValue();
    int gValue = m_pGreenSlider->getCurrentValue();
    int bValue = m_pBlueSlider->getCurrentValue();

    QColor color(rValue, gValue, bValue);
    m_pColorCircle->setCurrentColor(color);
    m_pColorView->setCurrentColor(color);

    m_currentColor = color;

    // 更新Color颜色显示
    updateForColorSlider();
    updateForColorSliderValue();
}

void UICustomColorWidget::onHSVSliderColorChanged(void)
{
    int h = m_pHSlider->getCurrentValue();
    int s = m_pSSlider->getCurrentValue();
    int v = m_pVSlider->getCurrentValue();

    QColor color;
    color.setHsv(h, s, v);
    m_pColorCircle->setCurrentColor(color);
    m_pColorView->setCurrentColor(color);

    m_currentColor = color;

    // 更新Color颜色显示
    updateForColorSlider();
    updateForColorSliderValue();
}

void UICustomColorWidget::updateForColorSlider(void)
{
    m_pRedSlider->setStartColor(QColor(0, m_currentColor.green(), m_currentColor.blue()));
    m_pRedSlider->setEndColor(QColor(255, m_currentColor.green(), m_currentColor.blue()));

    m_pGreenSlider->setStartColor(QColor(m_currentColor.red(), 0, m_currentColor.blue()));
    m_pGreenSlider->setEndColor(QColor(m_currentColor.red(), 255, m_currentColor.blue()));

    m_pBlueSlider->setStartColor(QColor(m_currentColor.red(), m_currentColor.green(), 0));
    m_pBlueSlider->setEndColor(QColor(m_currentColor.red(), m_currentColor.green(), 255));

    // s
    int h, s, v;
    m_currentColor.getHsv(&h, &s, &v);
    QColor startColor, endColor;
    startColor.setHsv(h, 0, v);
    endColor.setHsv(h, 255, v);
    m_pSSlider->setStartColor(startColor);
    m_pSSlider->setEndColor(endColor);

    // v
    startColor.setHsv(h, s, 0);
    endColor.setHsv(h, s, 255);
    m_pVSlider->setStartColor(startColor);
    m_pVSlider->setEndColor(endColor);
}

void UICustomColorWidget::updateForColorSliderValue(void)
{
    m_pRedSlider->setCurrentValue(m_currentColor.red());
    m_pGreenSlider->setCurrentValue(m_currentColor.green());
    m_pBlueSlider->setCurrentValue(m_currentColor.blue());

    int h, s, v;
    m_currentColor.getHsv(&h, &s, &v);

    m_pHSlider->setCurrentValue(h);
    m_pSSlider->setCurrentValue(s);
    m_pVSlider->setCurrentValue(v);
}

// 保存和加载
void UICustomColorWidget::saveCustomColor(void)
{
    QList<QColor> colors;
    for (auto iter = m_colorViewsList.begin(); iter != m_colorViewsList.end(); ++iter)
    {
        QColor color = (*iter)->getCurrentColor();
        colors << color;
    }

    m_pCustomColorOperator->saveCustomColors(colors);
}

void UICustomColorWidget::loadCustomColor(void)
{
    QList<QColor> colors;
    m_pCustomColorOperator->loadCustonColors(colors);

    int count = 0;
    for (auto iter = colors.begin(); iter != colors.end(); ++iter)
        m_colorViewsList[count++]->setCurrentColor(*iter);
}

// 设置/获取当前的颜色
void UICustomColorWidget::setCurrentColor(const QColor& color)
{
    m_currentColor = color;

    m_pColorCircle->setCurrentColor(color);
    m_pColorView->setCurrentColor(color);

    // 更新Color颜色显示
    updateForColorSlider();
    updateForColorSliderValue();
}

QColor UICustomColorWidget::getCurrentColor(void)
{
    return m_currentColor;
}


================================================
FILE: CustomControls/UICustomColorControl/UICustomColorWidget.h
================================================
#ifndef UICUSTOMCOLORWIDGET_H
#define UICUSTOMCOLORWIDGET_H

#include "UICustomWidgtes/CustomWidget.h"
#include "UICustomColorCircle.h"
#include "UICustomColorSlider.h"
#include "UICustomSingleControl/UICustomColorViewWidget.h"
#include "UICustomCustomColorOperator.h"
#include <QWidget>
#include <QGroupBox>

class QHBoxLayout;
class UICustomColorWidget : public CustomWidget
{
    Q_OBJECT

public:
    UICustomColorWidget(QWidget* parent = nullptr);
    ~UICustomColorWidget();

    // 设置/获取当前的颜色
    void setCurrentColor(const QColor& color);
    QColor getCurrentColor(void);

private:
    UICustomColorCircle* m_pColorCircle = nullptr;

    void initColorCircle(void);

    void initColorSliderWidget(void);
    void initColorRGBSliderWidget(void);
    void initColorHSVSliderWidget(void);
    void initColorButtonWidget(void);
    void initColorCustomWidget(void);

    QGroupBox* m_pRGBGroup = nullptr;
    QGroupBox* m_pHSVGroup = nullptr;
    QGroupBox* m_pCustomGroup = nullptr;

    UICustomColorSlider* m_pRedSlider = nullptr;
    UICustomColorSlider* m_pGreenSlider = nullptr;
    UICustomColorSlider* m_pBlueSlider = nullptr;
    UICustomColorSlider* m_pHSlider = nullptr;
    UICustomColorSlider* m_pSSlider = nullptr;
    UICustomColorSlider* m_pVSlider = nullptr;

    UICustomColorViewWidget* m_pColorView = nullptr;
    QVector<UICustomColorViewWidget*> m_colorViewsList;
    UICustomCustomColorOperator* m_pCustomColorOperator = nullptr;

    QColor m_currentColor;

    // 根据滑条,更新显示
    void updateForColorSlider(void);
    void updateForColorSliderValue(void);

    // 保存和加载
    void saveCustomColor(void);
    void loadCustomColor(void);

private:
    QHBoxLayout* m_pMainLayout = nullptr;
    QVBoxLayout* m_pLayout = nullptr;

private slots:
    void onColorChanged(void);

    void onSliderColorChanged(void);
    void onHSVSliderColorChanged(void);

    // 点击自定义颜色
    void onClickedColorView(void);
    // 点击添加自定义颜色
    void onClickedAddCustomColor(void);
    // 处理自定义颜色信号
    void onDropSignal(void);

signals:
    void clickedOKButton(void);
    void clickedCannelButton(void);
};

#endif


================================================
FILE: CustomControls/UICustomColorControl/UICustomCustomColorOperator.cpp
================================================
#include "UICustomCustomColorOperator.h"
#include <QDomElement>
#include <QFile>
#include <QTextStream>
#include <QApplication>

const QString UICustomCustomColorOperator::m_cFileName = "./CustomColor.xml";

UICustomCustomColorOperator::UICustomCustomColorOperator(QObject* parent)
    :QObject(parent)
{

}

UICustomCustomColorOperator::~UICustomCustomColorOperator()
{

}

// 保存和加载颜色
void UICustomCustomColorOperator::saveCustomColors(const QList<QColor>& colors)
{
    QString curAppPath = qApp->applicationDirPath() + "/";
    QFile file(curAppPath + m_cFileName);
    if (file.exists())
        file.remove();

    QDomDocument doc;

    //写入xml头部
    QDomProcessingInstruction instruction; //添加处理命令
    instruction = doc.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\"");
    doc.appendChild(instruction);

    // 添加颜色
    QDomElement rootElement = doc.createElement("CustomColor");
    doc.appendChild(rootElement);

    for (auto iter = colors.begin(); iter != colors.end(); ++iter)
    {
        QDomElement element = doc.createElement("Color");

        element.setAttribute("red", iter->red());
        element.setAttribute("green", iter->green());
        element.setAttribute("blue", iter->blue());

        rootElement.appendChild(element);
    }

    QFile xmlFile(curAppPath + m_cFileName);
    xmlFile.open(QFile::WriteOnly);
    QTextStream out_stream(&xmlFile);
    doc.save(out_stream, 4);
    xmlFile.close();
}

void UICustomCustomColorOperator::loadCustonColors(QList<QColor>& colors)
{
    colors.clear();

    // open file
    QString curAppPath = qApp->applicationDirPath() + "/";
    QFile file(curAppPath + m_cFileName);
    if (!file.open(QFile::ReadOnly))
        return;

    QDomDocument doc;
    if (!doc.setContent(&file))
    {
        file.close();
        return;
    }
    file.close();

    // root element
    QDomElement root = doc.documentElement();
    if (root.tagName() != "CustomColor")
        return;

    // nodeList
    QDomNodeList nodeList = root.childNodes();
    for (int i = 0; i < nodeList.count(); ++i)
    {
        QDomElement element = nodeList.at(i).toElement();

        QColor color;
        color.setRed(element.attribute("red").toInt());
        color.setGreen(element.attribute("green").toInt());
        color.setBlue(element.attribute("blue").toInt());

        colors.append(color);
    }
}


================================================
FILE: CustomControls/UICustomColorControl/UICustomCustomColorOperator.h
================================================
#ifndef UICUSTOMCUSTOMCOLOROPERATOR_H
#define UICUSTOMCUSTOMCOLOROPERATOR_H

#include <QObject>
#include <QDomDocument>
#include <QString>
#include <QColor>

class UICustomCustomColorOperator : public QObject
{
    Q_OBJECT

public:
    UICustomCustomColorOperator(QObject* parent = nullptr);
    ~UICustomCustomColorOperator();

    // 保存和加载颜色
    void saveCustomColors(const QList<QColor>& colors);
    void loadCustonColors(QList<QColor>& colors);

private:
    static const QString m_cFileName;
};

#endif


================================================
FILE: CustomControls/UICustomColorControl/UICustonColorDialog.cpp
================================================
#include "UICustonColorDialog.h"

UICustomColorDialog::UICustomColorDialog(QWidget* parent)
    :CustomDialog(parent)
{
    init();

    QObject::connect(m_pColorWidget, &UICustomColorWidget::clickedOKButton, \
                     this, &UICustomColorDialog::accept);
    QObject::connect(m_pColorWidget, &UICustomColorWidget::clickedCannelButton, \
                     this, &UICustomColorDialog::reject);
}

UICustomColorDialog::~UICustomColorDialog()
{

}

void UICustomColorDialog::init(void)
{
    m_pColorWidget = new UICustomColorWidget;
    this->setContentWidget(m_pColorWidget);

    this->setWindowTitle(tr("Color Config"));
}

// 设置/获取颜色
void UICustomColorDialog::setCurrentColor(const QColor& color)
{
    m_pColorWidget->setCurrentColor(color);
}

QColor UICustomColorDialog::getCurrentColor(void)
{
    return m_pColorWidget->getCurrentColor();
}


================================================
FILE: CustomControls/UICustomColorControl/UICustonColorDialog.h
================================================
#ifndef UICUSTOMCONTROLDIALOG_H
#define UICUSTOMCONTROLDIALOG_H

#include "UICustomWidgtes/CustomDialog.h"
#include "UICustomColorWidget.h"
#include <QWidget>

class UICustomColorDialog : public CustomDialog
{
    Q_OBJECT

public:
    UICustomColorDialog(QWidget* parent = nullptr);
    ~UICustomColorDialog();

    // 设置/获取颜色
    void setCurrentColor(const QColor& color);
    QColor getCurrentColor(void);

private:
    UICustomColorWidget* m_pColorWidget = nullptr;

    void init(void);
};

#endif


================================================
FILE: CustomControls/UICustomSingleControl/UICustomCalendarWidget.cpp
================================================
#include "UICustomCalendarWidget.h"

UICustomCalendarWidget::UICustomCalendarWidget(QWidget* parent)
    :QCalendarWidget(parent)
{

}

UICustomCalendarWidget::~UICustomCalendarWidget()
{

}


================================================
FILE: CustomControls/UICustomSingleControl/UICustomCalendarWidget.h
================================================
#ifndef UICUSTOMCALENDARWIDGET_H
#define UICUSTOMCALENDARWIDGET_H

#include <QCalendarWidget>

class UICustomCalendarWidget : public QCalendarWidget
{
    Q_OBJECT

public:
    UICustomCalendarWidget(QWidget* parent = nullptr);
    ~UICustomCalendarWidget();
};

#endif


================================================
FILE: CustomControls/UICustomSingleControl/UICustomColorViewWidget.cpp
================================================
#include "UICustomColorViewWidget.h"
#include "UICustomCore/CustomStyleConfig.h"
#include <QPainter>
#include <QMouseEvent>
#include <QMimeData>
#include <QDrag>

UICustomColorViewWidget::UICustomColorViewWidget(QWidget* parent)
    :CustomWidget(parent)
    , m_selectedColor(g_StyleConfig->getHighLightColor())
{
    g_StyleConfig->setCurrentStyle(this, "Transparent");
    this->setAcceptDrops(false);
}

UICustomColorViewWidget::~UICustomColorViewWidget()
{

}

void UICustomColorViewWidget::customPaint(QPainter* painter)
{
    painter->save();
    painter->setRenderHint(QPainter::Antialiasing);

    if (m_isSelected)
    {
        QPen pen;
        pen.setColor(m_selectedColor);
        pen.setWidth(2);
        painter->setPen(pen);
    }
    else
        painter->setPen(Qt::NoPen);

    painter->setBrush(QBrush(m_currentColor));
    painter->drawRoundedRect(this->rect().adjusted(2, 2, -2, -2), 4, 4);

    painter->restore();
}

QSize UICustomColorViewWidget::sizeHint() const
{
    QSize size(80, 30);
    return size;
}

void UICustomColorViewWidget::mousePressEvent(QMouseEvent* event)
{
    if (m_isDragVisible)
    {
        QDrag *drag = new QDrag(this);
        QMimeData *mineData = new QMimeData;
        mineData->setColorData(m_currentColor);
        drag->setMimeData(mineData);

        drag->exec();
    }
    else
    {
        event->accept();
        emit mousePressed();
    }
}

void UICustomColorViewWidget::dragEnterEvent(QDragEnterEvent *event)
{
    if (event->mimeData()->hasColor())
        event->acceptProposedAction();

    emit dragEnterSignals();
}

void UICustomColorViewWidget::dragLeaveEvent(QDragLeaveEvent *event)
{
    emit dragReleaseSignals();
}

void UICustomColorViewWidget::dragMoveEvent(QDragMoveEvent *event)
{

}

void UICustomColorViewWidget::dropEvent(QDropEvent *event)
{
    if (!event->mimeData()->hasColor())
        return;

    // 设置当前颜色
    QColor color = qvariant_cast<QColor>(event->mimeData()->colorData());
    this->setCurrentColor(color);

    emit dropSignal();
}

void UICustomColorViewWidget::setCurrentColor(const QColor& color)
{
    m_currentColor = color;
    this->update();
}

const QColor& UICustomColorViewWidget::getCurrentColor(void)
{
    return m_currentColor;
}

void UICustomColorViewWidget::setDragVisible(bool isVisible)
{
    m_isDragVisible = isVisible;
}

void UICustomColorViewWidget::setSelected(bool isSelected)
{
    m_isSelected = isSelected;
    this->update();
}

bool UICustomColorViewWidget::getSelected(void)
{
    return m_isSelected;
}


================================================
FILE: CustomControls/UICustomSingleControl/UICustomColorViewWidget.h
================================================
#ifndef UICUSTOMCOLORVIEWWIDGET_H
#define UICUSTOMCOLORVIEWWIDGET_H

#include "UICustomWidgtes/CustomWidget.h"
#include <QWidget>

class UICustomColorViewWidget : public CustomWidget
{
    Q_OBJECT

public:
    UICustomColorViewWidget(QWidget* parent = nullptr);
    ~UICustomColorViewWidget();

    // 设置/获取当前显示的颜色
    void setCurrentColor(const QColor& color);
    const QColor& getCurrentColor(void);

    // 设置是否允许拖拽
    void setDragVisible(bool isVisible);
    // 设置是否被选择
    void setSelected(bool isSelected);
    bool getSelected(void);

protected:
    virtual void customPaint(QPainter* painter) override;
    virtual QSize sizeHint() const override;
    virtual void mousePressEvent(QMouseEvent* event) override;

    virtual void dragEnterEvent(QDragEnterEvent *event) override;
    virtual void dragLeaveEvent(QDragLeaveEvent *event) override;
    virtual void dragMoveEvent(QDragMoveEvent *event) override;
    virtual void dropEvent(QDropEvent *event) override;

private:
    QColor m_currentColor;
    QColor m_selectedColor;
    bool m_isDragVisible = false;
    bool m_isSelected = false;

signals:
    void mousePressed(void);
    void dragEnterSignals(void);
    void dragReleaseSignals(void);
    void dropSignal(void);
};

#endif


================================================
FILE: CustomControls/UICustomSingleControl/UICustomComboBox.cpp
================================================
#include "UICustomComboBox.h"
#include <QListView>

UICustomComboBox::UICustomComboBox(QWidget* parent)
    :QComboBox(parent)
{
    this->setView(new QListView(this));
}

UICustomComboBox::~UICustomComboBox()
{

}

QSize UICustomComboBox::sizeHint(void) const
{
    QSize size(80, 30);
    return size;
}


================================================
FILE: CustomControls/UICustomSingleControl/UICustomComboBox.h
================================================
#ifndef UICUSTOMCOMBOBOX_H
#define UICUSTOMCOMBOBOX_H

#include <QComboBox>
class UICustomComboBox : public QComboBox
{
    Q_OBJECT

public:
    UICustomComboBox(QWidget* parent = nullptr);
    ~UICustomComboBox() override;

protected:
    QSize sizeHint(void) const override;
};

#endif // UICUSTOMCOMBOBOX_H


================================================
FILE: CustomControls/UICustomSingleControl/UICustomDateEdit.cpp
================================================
#include "UICustomDateEdit.h"
#include "UICustomCalendarWidget.h"

UICutomDateEdit::UICutomDateEdit(QWidget* parent)
    :QDateEdit(parent)
{
    this->setCalendarPopup(true);
    this->setCalendarWidget(new UICustomCalendarWidget);
}

UICutomDateEdit::~UICutomDateEdit()
{

}


================================================
FILE: CustomControls/UICustomSingleControl/UICustomDateEdit.h
================================================
#ifndef UICUSTOMDATEEDIT_H
#define UICUSTOMDATEEDIT_H

#include <QDateEdit>
class UICutomDateEdit : public QDateEdit
{
    Q_OBJECT

public:
    UICutomDateEdit(QWidget* parent = nullptr);
    ~UICutomDateEdit();
};

#endif


================================================
FILE: CustomControls/UICustomSingleControl/UICustomDoubleSpinBox.cpp
================================================
#include "UICustomDoubleSpinBox.h"
#include <QKeyEvent>

UICustomDoubleSpinBox::UICustomDoubleSpinBox(QWidget* parent)
    :QDoubleSpinBox(parent)
{

}

UICustomDoubleSpinBox::~UICustomDoubleSpinBox()
{

}

QSize UICustomDoubleSpinBox::sizeHint() const
{
    QSize size(80, 30);
    return size;
}

void UICustomDoubleSpinBox::keyPressEvent(QKeyEvent* event)
{
    QDoubleSpinBox::keyPressEvent(event);
    event->accept();
}


================================================
FILE: CustomControls/UICustomSingleControl/UICustomDoubleSpinBox.h
================================================
#ifndef UICUSTOMDOUBLESPINBOX_H
#define UICUSTOMDOUBLESPINBOX_H

#include <QWidget>
#include <QDoubleSpinBox>

class UICustomDoubleSpinBox : public QDoubleSpinBox
{
    Q_OBJECT

public:
    UICustomDoubleSpinBox(QWidget* parent = nullptr);
    ~UICustomDoubleSpinBox();

protected:
    virtual QSize sizeHint() const override;

    void keyPressEvent(QKeyEvent* event) override;
};

#endif


================================================
FILE: CustomControls/UICustomSingleControl/UICustomImageViewer.cpp
================================================
#include "UICustomImageViewer.h"
#include <QPainter>
#include <QWheelEvent>
#include <QMouseEvent>

UICustomImageViewer::UICustomImageViewer(QWidget* parent)
    :QWidget(parent)
{
    this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
}

UICustomImageViewer::~UICustomImageViewer()
{

}

void UICustomImageViewer::loadImage(const QString& imagePath)
{
    QImage image(imagePath);
    m_pixmap = QPixmap::fromImage(image);

    this->update();
}

void UICustomImageViewer::loadImage(const QImage& image)
{
    m_pixmap = QPixmap::fromImage(image);

    this->update();
}

void UICustomImageViewer::paintEvent(QPaintEvent* event)
{
    if (m_pixmap.isNull())
        return;

    QPainter npainter(this);
    QPainter* painter = &npainter;

    QRect rect = this->rect().adjusted(m_nMargin, m_nMargin, -m_nMargin, -m_nMargin);

    painter->save();

    // 平移
    painter->translate(QPoint(rect.center().x() + m_nIntervalX, rect.center().y() + m_nIntervalY));
    // 缩放
    painter->scale(m_zoomRate, m_zoomRate);

    // 计算实际显示大小
    int imageWidth = m_pixmap.width();
    imageWidth = qMin(rect.width(), imageWidth);
    int imageHeight = imageWidth * 1.0 / (m_pixmap.width() * 1.0 / m_pixmap.height());
    imageHeight = qMin(rect.height(), imageHeight);
    imageWidth = imageHeight * (m_pixmap.width() * 1.0 / m_pixmap.height());


    QRect pixRect(-imageWidth / 2, -imageHeight / 2, imageWidth, imageHeight);
    painter->drawPixmap(pixRect, m_pixmap);

    painter->restore();
}

void UICustomImageViewer::wheelEvent(QWheelEvent *event)
{
    int value = event->delta();
    if (value > 0)
        m_zoomRate += 0.2;
    else
        m_zoomRate -= 0.2;

    if (m_zoomRate < 0.5)
        m_zoomRate = 0.5;

    this->update();
}

void UICustomImageViewer::mousePressEvent(QMouseEvent* event)
{
    m_isMousePressed = true;
    m_tempPos = event->pos();
}

void UICustomImageViewer::mouseMoveEvent(QMouseEvent* event)
{
    if (!m_isMousePressed)
        return;

    this->setCursor(Qt::SizeAllCursor);
    QPoint pos = event->pos();
    m_nIntervalX += pos.x() - m_tempPos.x();
    m_nIntervalY += pos.y() - m_tempPos.y();

    m_tempPos = pos;

    this->update();
}

void UICustomImageViewer::mouseReleaseEvent(QMouseEvent* event)
{
    m_isMousePressed = false;
    this->setCursor(Qt::ArrowCursor);
}

QSize UICustomImageViewer::sizeHint() const
{
    QSize size(600, 600);
    return size;
}

// 缩放
void UICustomImageViewer::zoom(qreal value)
{
    m_zoomRate = value;
    this->update();
}

qreal UICustomImageViewer::getZoomValue(void)
{
    return m_zoomRate;
}

// 复位
void UICustomImageViewer::rest(void)
{
    m_zoomRate = 1.0;
    m_nIntervalX = 0;
    m_nIntervalY = 0;

    this->update();
}


================================================
FILE: CustomControls/UICustomSingleControl/UICustomImageViewer.h
================================================
#ifndef UICUSTOMIMAGEVIEWER_H
#define UICUSTOMIMAGEVIEWER_H

#include <QWidget>
#include "UICustomWidgtes/CustomWidget.h"
#include "customcontrols_global.h"

class CUSTOMCONTROLSSHARED_EXPORT UICustomImageViewer : public QWidget
{
    Q_OBJECT

public:
    UICustomImageViewer(QWidget* parent = nullptr);
    ~UICustomImageViewer();

    // 加载图片
    void loadImage(const QString& imagePath);
    void loadImage(const QImage& image);

    // 缩放
    void zoom(qreal value);
    qreal getZoomValue(void);

    // 复位
    void rest(void);

protected:
    void paintEvent(QPaintEvent* event) override;
    void wheelEvent(QWheelEvent* event) override;
    void mousePressEvent(QMouseEvent* event) override;
    void mouseMoveEvent(QMouseEvent* event) override;
    void mouseReleaseEvent(QMouseEvent* event) override;
    QSize sizeHint() const override;

private:
    QPixmap m_pixmap;
    int m_nMargin = 2;

    // 缩放系数
    qreal m_zoomRate = 1.0;
    // 移动
    int m_nIntervalX = 0;
    int m_nIntervalY = 0;
    bool m_isMousePressed = false;
    QPoint m_tempPos;
};

#endif


================================================
FILE: CustomControls/UICustomSingleControl/UICustomIntSpinBox.cpp
================================================
#include "UICustomIntSpinBox.h"
#include <QKeyEvent>

UICustomIntSpinBox::UICustomIntSpinBox(QWidget* parent)
    :QSpinBox(parent)
{

}

UICustomIntSpinBox::~UICustomIntSpinBox()
{

}

QSize UICustomIntSpinBox::sizeHint() const
{
    QSize size(80, 30);
    return size;
}

void UICustomIntSpinBox::keyPressEvent(QKeyEvent* event)
{
    QSpinBox::keyPressEvent(event);
    event->accept();
}


================================================
FILE: CustomControls/UICustomSingleControl/UICustomIntSpinBox.h
================================================
#ifndef UICUSTOMINTSPINBOX_H
#define UICUSTOMINTSPINBOX_H

#include <QWidget>
#include <QSpinBox>
#include "customcontrols_global.h"

class CUSTOMCONTROLSSHARED_EXPORT UICustomIntSpinBox : public QSpinBox
{
    Q_OBJECT

public:
    UICustomIntSpinBox(QWidget* parent = nullptr);
    ~UICustomIntSpinBox();

protected:
    virtual QSize sizeHint() const override;
    void keyPressEvent(QKeyEvent* event) override;
};

#endif


================================================
FILE: CustomControls/UICustomSingleControl/UICustomLineEdit.cpp
================================================
#include "UICustomLineEdit.h"
#include <QKeyEvent>
#include <QToolButton>
#include <QVBoxLayout>
#include <QPainter>
#include "UICustomCore/CustomStyleConfig.h"

UICustomLineEdit::UICustomLineEdit(QWidget* parent)
    :QLineEdit(parent)
{
    m_pButton = new UICustomCloseButton;
    m_pButton->setFixedSize(12, 12);

    QHBoxLayout* mainLayout = new QHBoxLayout(this);
    mainLayout->addStretch();
    mainLayout->addWidget(m_pButton, 0, Qt::AlignRight | Qt::AlignVCenter);

    setCloseButtonEnable(false);

    // 关联信号和槽
    QObject::connect(this, &UICustomLineEdit::textChanged, this, &UICustomLineEdit::onTextChanged);
    QObject::connect(m_pButton, &UICustomCloseButton::clicked, this, &UICustomLineEdit::onCloseButtonClicked);
}

UICustomLineEdit::~UICustomLineEdit()
{

}

void UICustomLineEdit::keyPressEvent(QKeyEvent* event)
{
    QLineEdit::keyPressEvent(event);
    event->accept();
}

void UICustomLineEdit::setCloseButtonEnable(bool isEnabled)
{
    m_isToolButtonEnable = isEnabled;
    if (!isEnabled)
        m_pButton->setVisible(false);
}

void UICustomLineEdit::onTextChanged(const QString& textChanged)
{
    if (!m_isToolButtonEnable)
    {
        emit currentTextChanged(textChanged);
        return;
    }

    if (textChanged.isEmpty())
        m_pButton->setVisible(false);
    else
        m_pButton->setVisible(true);
    emit currentTextChanged(textChanged);
}

void UICustomLineEdit::onCloseButtonClicked(void)
{
    this->setText("");
}
// ==============================================================
UICustomCloseButton::UICustomCloseButton(QWidget* parent)
    :CustomWidget(parent)
{
    this->setMouseTracking(true);
    g_StyleConfig->setCurrentStyle(this, "TransparentBgWidget");
}

UICustomCloseButton::~UICustomCloseButton()
{

}

void UICustomCloseButton::customPaint(QPainter* painter)
{
    QColor penColor(200, 80, 80);
    if (m_isHoveredOn)
        penColor = QColor(200, 200, 200);

    // 设置画笔
    QPen pen;
    pen.setWidth(2);
    pen.setColor(penColor);
    pen.setCapStyle(Qt::RoundCap);
    painter->setPen(pen);

    // 绘制关闭
    QRect rect = this->rect();
    rect.adjust(2, 2, -2, -2);
    painter->drawLine(rect.topLeft(), rect.bottomRight());
    painter->drawLine(rect.topRight(), rect.bottomLeft());
}

void UICustomCloseButton::mousePressEvent(QMouseEvent *event)
{
    emit clicked();
    CustomWidget::mousePressEvent(event);
}

void UICustomCloseButton::enterEvent(QEvent *event)
{
    m_isHoveredOn = true;
    this->setCursor(Qt::PointingHandCursor);
    this->update();
    CustomWidget::enterEvent(event);
}

void UICustomCloseButton::leaveEvent(QEvent *event)
{
    m_isHoveredOn = false;
    this->setCursor(Qt::ArrowCursor);
    this->update();
    CustomWidget::leaveEvent(event);
}


================================================
FILE: CustomControls/UICustomSingleControl/UICustomLineEdit.h
================================================
#ifndef UICUSTOMLINEEDIT_H
#define UICUSTOMLINEEDIT_H

#include <QLineEdit>
#include <QWidget>
#include "UICustomWidgtes/CustomWidget.h"
#include "customcontrols_global.h"

class UICustomCloseButton;
class CUSTOMCONTROLSSHARED_EXPORT UICustomLineEdit : public QLineEdit
{
    Q_OBJECT

public:
    UICustomLineEdit(QWidget* parent = nullptr);
    ~UICustomLineEdit() override;

    // Close Button Visible
    void setCloseButtonEnable(bool isEnabled);

protected:
    void keyPressEvent(QKeyEvent* event) override;

private:
    UICustomCloseButton* m_pButton = nullptr;
    bool m_isToolButtonEnable = false;

signals:
    void currentTextChanged(const QString& text);

private slots:
    void onTextChanged(const QString& textChanged);
    void onCloseButtonClicked(void);
};

// ==============================================================
class UICustomCloseButton : public CustomWidget
{
    Q_OBJECT

public:
    UICustomCloseButton(QWidget* parent = nullptr);
    ~UICustomCloseButton();

protected:
    void customPaint(QPainter* painter) override;
    void mousePressEvent(QMouseEvent *event) override;
    void enterEvent(QEvent *event) override;
    void leaveEvent(QEvent *event) override;

signals:
    void clicked(void);

private:
    bool m_isHoveredOn = false;
};

#endif


================================================
FILE: CustomControls/UICustomSingleControl/UICustomPostionWidget.cpp
================================================
#include "UICustomPostionWidget.h"
#include "UICustomCore/CustomStyleConfig.h"
#include <QPainter>
#include <QMouseEvent>

UICustomPostionWidget::UICustomPostionWidget(QWidget* parent)
    :CustomWidget(parent)
{
    this->setMouseTracking(true);
    g_StyleConfig->setCurrentStyle(this, "Transparent");
}

UICustomPostionWidget::~UICustomPostionWidget()
{

}

void UICustomPostionWidget::customPaint(QPainter* painter)
{
    QPoint pos = transToThisPostion();

    painter->save();
    painter->setPen(QPen(g_StyleConfig->getHighLightColor()));
    painter->setRenderHint(QPainter::Antialiasing);

    // 绘制矩形
    QRect rect = this->rect().adjusted(m_nRadius, m_nRadius, -m_nRadius, -m_nRadius);
    painter->drawRect(rect);

    // 绘制位置
    painter->setPen(QPen(QColor(230, 230, 230)));
    painter->drawEllipse(pos, m_nRadius, m_nRadius);

    painter->restore();
}

QSize UICustomPostionWidget::sizeHint() const
{
    QSize size(150, 150);
    return size;
}

void UICustomPostionWidget::mousePressEvent(QMouseEvent* event)
{
    m_isPressed = true;

    QPoint pos = event->pos();
    transToThisValue(pos);
    this->update();
}

void UICustomPostionWidget::mouseMoveEvent(QMouseEvent* event)
{
    if (!m_isPressed)
        return;

    QPoint pos = event->pos();
    transToThisValue(pos);
    this->update();
}

void UICustomPostionWidget::mouseReleaseEvent(QMouseEvent* event)
{
    if (!m_isPressed)
        return;

    m_isPressed = false;

    QPoint pos = event->pos();
    transToThisValue(pos);
    this->update();
}

QPoint UICustomPostionWidget::transToThisPostion(void)
{
    QRect rect = this->rect().adjusted(m_nRadius, m_nRadius, -m_nRadius, -m_nRadius);

    qreal xPt = m_xValue / 100.0 * rect.width() + rect.x();
    qreal yPt = m_yValue / 100.0 * rect.height() + rect.y();

    QPoint pos;
    pos.setX(xPt);
    pos.setY(yPt);

    return pos;
}

void UICustomPostionWidget::transToThisValue(QPoint pos)
{
    QRect rect = this->rect().adjusted(m_nRadius, m_nRadius, -m_nRadius, -m_nRadius);
    if (!rect.contains(pos))
        return;

    m_xValue = (pos.x() - rect.x()) * 1.0 / rect.width() * 100;
    m_yValue = (pos.y() - rect.y()) * 1.0 / rect.height() * 100;
    emit postionValueChanged(m_xValue, m_yValue);
}

void UICustomPostionWidget::setPostionValue(qreal xValue, qreal yValue)
{
    m_xValue = xValue;
    m_yValue = yValue;

    this->update();
}

void UICustomPostionWidget::setPostionXValue(qreal xValue)
{
    m_xValue = xValue;
    this->update();
}

void UICustomPostionWidget::setPostionYValue(qreal yValue)
{
    m_yValue = yValue;
    this->update();
}

void UICustomPostionWidget::getPostionValue(qreal& xValue, qreal &yValue)
{
    xValue = m_xValue;
    yValue = m_yValue;
}

qreal UICustomPostionWidget::getPostionXValue(void)
{
    return m_xValue;
}

qreal UICustomPostionWidget::getPostionYValue(void)
{
    return m_yValue;
}


================================================
FILE: CustomControls/UICustomSingleControl/UICustomPostionWidget.h
================================================
#ifndef UICUSTOMPOSTIONWIDGET_H
#define UICUSTOMPOSTIONWIDGET_H

#include "UICustomWidgtes/CustomWidget.h"
#include "customcontrols_global.h"
#include <QWidget>
class CUSTOMCONTROLSSHARED_EXPORT UICustomPostionWidget : public CustomWidget
{
    Q_OBJECT

public:
    UICustomPostionWidget(QWidget* parent = nullptr);
    ~UICustomPostionWidget();

    // 设置位置
    void setPostionValue(qreal xValue, qreal yValue);
    void setPostionXValue(qreal xValue);
    void setPostionYValue(qreal yValue);

    // 获取位置
    void getPostionValue(qreal& xValue, qreal &yValue);
    qreal getPostionXValue(void);
    qreal getPostionYValue(void);

protected:
    // Custom Paint Event
    void customPaint(QPainter* painter) override;
    QSize sizeHint() const override;

    void mousePressEvent(QMouseEvent* event) override;
    void mouseMoveEvent(QMouseEvent* event) override;
    void mouseReleaseEvent(QMouseEvent* event) override;

private:
    bool m_isPressed = false;
    int m_nRadius = 4;

    qreal m_xValue = 0;     // 百分比值
    qreal m_yValue = 0;
    QPoint transToThisPostion(void);
    void transToThisValue(QPoint pos);

signals:
    void postionValueChanged(qreal xValue, qreal yValue);
};

#endif


================================================
FILE: CustomControls/UICustomSingleControl/UICustomSwitchWidget.cpp
================================================
#include "UICustomSwitchWidget.h"
#include "UICustomCore/CustomStyleConfig.h"
#include <QPainter>

UICustomSwitchWidget::UICustomSwitchWidget(QWidget* parent)
    :CustomWidget(parent)
    ,m_margin(1, 1, 1, 1)
    ,m_cBgColor(223, 105, 20)
    ,m_cSliderColor(243, 125, 40)
    , m_cOnBgColor(155, 78, 15)
    , m_cOnSliderColor(226, 105, 5)
    , m_cOffBgColor(138, 138, 138)
    , m_cOffSliderColor(160, 160, 160)
{
    g_StyleConfig->setCurrentStyle(this, "Transparent");
    this->setCursor(Qt::PointingHandCursor);
    setSwitchStatus(true, false);

    m_pTimer = new QTimer;
    m_pTimer->setInterval(20);
    QObject::connect(m_pTimer, &QTimer::timeout, this, &UICustomSwitchWidget::onTimeout);
}

UICustomSwitchWidget::~UICustomSwitchWidget()
{

}

void UICustomSwitchWidget::setSwitchStatus(bool isOn, bool hasAnimation, bool cmd)
{
    if (isOn)
    {
        m_cBgColor = m_cOnBgColor;
        m_cSliderColor = m_cOnSliderColor;
    }
    else
    {
        m_cBgColor = m_cOffBgColor;
        m_cSliderColor = m_cOffSliderColor;
    }

    if (m_isSwitchOn != isOn)
    {
        m_isSwitchOn = isOn;
        emit valueChanged(isOn, cmd);
    }

    // 开启动画
    if (hasAnimation)
        m_pTimer->start();

    this->update();
}

bool UICustomSwitchWidget::getSwitchStatus(void)
{
    return m_isSwitchOn;
}

void UICustomSwitchWidget::customPaint(QPainter* painter)
{
    painter->save();
    painter->setRenderHint(QPainter::Antialiasing);

    QRect rect = this->rect();
    rect = rect.adjusted(m_margin.left(), m_margin.top(), -m_margin.right(), -m_margin.bottom());

    // 绘制背景
    painter->setPen(Qt::NoPen);
    painter->setBrush(QBrush(m_cBgColor));
    painter->drawRoundedRect(rect, 4, 4);

    // 绘制滑块
    painter->setBrush(QBrush(m_cSliderColor));
    qreal interval = (rect.height() - m_nSliderHeight) / 2.0;
    QRect sliderRect(interval + m_nCurrentXPos, rect.y() + interval, m_nSliderWidth, m_nSliderHeight);
    painter->drawRoundedRect(sliderRect, 4, 4);
    painter->restore();
}

QSize UICustomSwitchWidget::sizeHint() const
{
    QSize size(80, 30);
    return size;
}

void UICustomSwitchWidget::mousePressEvent(QMouseEvent* event)
{
    setSwitchStatus(!m_isSwitchOn, true, true);
}

void UICustomSwitchWidget::onTimeout(void)
{
    QRect rect = this->rect();
    rect = rect.adjusted(m_margin.left(), m_margin.top(), -m_margin.right(), -m_margin.bottom());
    qreal interval = (rect.height() - m_nSliderHeight) / 2.0;

    int startPos = 0;
    int endXPos = rect.right() - interval - m_nSliderWidth;
    if (m_isSwitchOn)
    {
        // 向左移动
        m_nCurrentXPos -= m_nAnimationInterval;
        if (m_nCurrentXPos <= startPos)
        {
            m_nCurrentXPos = 0;
            m_pTimer->stop();
        }
    }
    else
    {
        // 向右移动
        m_nCurrentXPos += m_nAnimationInterval;
        if (m_nCurrentXPos >= endXPos)
        {
            m_nCurrentXPos = endXPos;
            m_pTimer->stop();
        }
    }
    this->update();
}


================================================
FILE: CustomControls/UICustomSingleControl/UICustomSwitchWidget.h
================================================
#ifndef UICUSTOMSWITCHWIDGET_H
#define UICUSTOMSWITCHWIDGET_H

#include <QWidget>
#include <QTimer>
#include "UICustomWidgtes/CustomWidget.h"

class UICustomSwitchWidget : public CustomWidget
{
    Q_OBJECT

public:
    UICustomSwitchWidget(QWidget* parent = nullptr);
    ~UICustomSwitchWidget();

    void setSwitchStatus(bool isOn, bool hasAnimation = true, bool cmd = false);
    bool getSwitchStatus(void);

protected:
    // Custom Paint Event
    virtual void customPaint(QPainter* painter) override;
    virtual QSize sizeHint() const override;
    virtual void mousePressEvent(QMouseEvent* event) override;

private:
    bool m_isSwitchOn = false;

    QMargins m_margin;
    QColor m_cBgColor;                  // 背景色
    QColor m_cSliderColor;              // 滑块的颜色
    int m_nCurrentXPos = 0;             // 当前的X的位置
    int m_nSliderWidth = 40;             // 滑块大小
    int m_nSliderHeight = 22;
    int m_nAnimationInterval = 5;

    QColor m_cOnBgColor;            // 打开时背景色
    QColor m_cOnSliderColor;        // 打开时滑块颜色

    QColor m_cOffBgColor;           // 关闭时背景颜色
    QColor m_cOffSliderColor;       // 关闭时滑块颜色

    QTimer* m_pTimer = nullptr;

private slots:
    void onTimeout(void);

signals:
    void valueChanged(bool isOn, bool cmd = false);
};

#endif


================================================
FILE: CustomControls/UICustomSingleControl/UICustomTextEdit.cpp
================================================
#include "UICustomTextEdit.h"
#include <QKeyEvent>
#include <QDebug>

UICustomTextEdit::UICustomTextEdit(QWidget* parent)
    :QTextEdit(parent)
{

}

UICustomTextEdit::~UICustomTextEdit()
{

}

void UICustomTextEdit::keyPressEvent(QKeyEvent *event)
{
    if (event->key() == Qt::Key::Key_Enter)
    {
        emit pressedEnterKey();
        event->accept();
        return;
    }

    return QTextEdit::keyPressEvent(event);
}

QSize UICustomTextEdit::sizeHint(void) const
{
    QSize size(80, 180);
    return size;
}


================================================
FILE: CustomControls/UICustomSingleControl/UICustomTextEdit.h
================================================
#ifndef UICUSTOMTEXTEDIT_H
#define UICUSTOMTEXTEDIT_H

#include <QTextEdit>
#include <QWidget>
#include "customcontrols_global.h"

class CUSTOMCONTROLSSHARED_EXPORT UICustomTextEdit : public QTextEdit
{
    Q_OBJECT
public:
    UICustomTextEdit(QWidget* parent = nullptr);
    ~UICustomTextEdit() override;

protected:
    void keyPressEvent(QKeyEvent *event) override;
    QSize sizeHint(void) const override;

signals:
    void pressedEnterKey(void);         // 按下小回车时,发送此信号
};

#endif


================================================
FILE: CustomControls/UICustomSingleControl/UICustomTimeEdit.cpp
================================================
#include "UICustomTimeEdit.h"

UICustomTimeEdit::UICustomTimeEdit(QWidget* parent)
    :QTimeEdit(parent)
{

}

UICustomTimeEdit::~UICustomTimeEdit()
{

}


================================================
FILE: CustomControls/UICustomSingleControl/UICustomTimeEdit.h
================================================
#ifndef UICUSTOMTIMEEDIT_H
#define UICUSTOMTIMEEDIT_H

#include <QTimeEdit>
#include <QWidget>

class UICustomTimeEdit : public QTimeEdit
{
    Q_OBJECT

public:
    UICustomTimeEdit(QWidget* parent = nullptr);
    ~UICustomTimeEdit();
};

#endif


================================================
FILE: CustomControls/customcontrols_global.h
================================================
#ifndef CUSTOMCONTROLS_GLOBAL_H
#define CUSTOMCONTROLS_GLOBAL_H

#include <QtCore/qglobal.h>

#if defined(CUSTOMCONTROLS_LIBRARY)
#  define CUSTOMCONTROLSSHARED_EXPORT Q_DECL_EXPORT
#else
#  define CUSTOMCONTROLSSHARED_EXPORT Q_DECL_IMPORT
#endif

#endif // CUSTOMCONTROLS_GLOBAL_H


================================================
FILE: CustomWidgets/CustomWidgets.pro
================================================
#-------------------------------------------------
#
# Project created by QtCreator 2020-01-04T20:25:00
#
#-------------------------------------------------

QT       += widgets

TARGET = CustomWidgets
TEMPLATE = lib

DEFINES += CUSTOMWIDGETS_LIBRARY

DESTDIR += $$PWD/../bin
MOC_DIR += $$PWD/../CustomWidgets/temp
OBJECTS_DIR += $$PWD/../CustomWidgets/temp
CONFIG += c++11

QMAKE_CXXFLAGS_RELEASE += /Zi
QMAKE_CXXFLAGS_RELEASE += /Od
QMAKE_LFLAGS_RELEASE += /DEBUG

# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    UICustomCore/CustomStyleConfig.cpp \
    UICustomWidgtes/CustomDialog.cpp \
    UICustomWidgtes/CustomMainWindow.cpp \
    UICustomWidgtes/CustomTestWidget.cpp \
    UICustomWidgtes/CustomWidget.cpp

HEADERS += \
        UICustomCore/CustomStyleConfig.h \
        UICustomWidgtes/CustomDialog.h \
        UICustomWidgtes/CustomMainWindow.h \
        UICustomWidgtes/CustomTestWidget.h \
        UICustomWidgtes/CustomWidget.h \
        customwidgets_global.h 

unix {
    target.path = /usr/lib
    INSTALLS += target
}

RESOURCES += \
    qss.qrc


================================================
FILE: CustomWidgets/UICustomCore/CustomStyleConfig.cpp
================================================
#include "CustomStyleConfig.h"
#include <QApplication>
#include <QPalette>
#include <QFile>
#include <QStyle>
#include <QCoreApplication>
#include <QTranslator>
#include <QDebug>

CustomStyleConfig::CustomStyleConfig()
    :m_cNormalBgColor(80, 80, 80)
    ,m_cNormalTextColor(255, 255, 255)
    ,m_cNormalHighLightColor(243, 125, 40)
{
    QPalette pal;
    pal.setBrush(QPalette::Background, QBrush(m_cNormalBgColor));
    pal.setBrush(QPalette::Foreground, QBrush(m_cNormalTextColor));

    qApp->setPalette(pal);
}

CustomStyleConfig::~CustomStyleConfig()
{

}

CustomStyleConfig* CustomStyleConfig::getInstance(void)
{
    static CustomStyleConfig instance;
    return &instance;
}

void CustomStyleConfig::init(void)
{
    qDebug() << __FUNCTION__;

    m_sCurrentPropertyName = "LightStyleProperty";
    QString styleStringPath = ":/qss/light.css";

    QFile nFile(styleStringPath);
    nFile.open(QFile::ReadOnly);
    QString styleSheetStr = nFile.readAll();
    nFile.close();

    qApp->setStyleSheet(styleSheetStr);

    // init font
    QFont font;
    font.setPointSizeF(10);
    //font.setPixelSize(24);
    qApp->setFont(font);
}

void CustomStyleConfig::setCurrentStyle(QWidget* widget, const QString& propertyValue, bool needPolish)
{
    widget->setProperty(m_sCurrentPropertyName.toLocal8Bit().data(), propertyValue);
    
    if (needPolish)
    {
        qApp->style()->unpolish(widget);
        qApp->style()->polish(widget);
    }
}

void CustomStyleConfig::loadLanguage(const QString& qmFilePath)
{
    QTranslator *translator = new QTranslator(this);
    bool result = translator->load(qmFilePath);
    if (result)
        qApp->installTranslator(translator);
}

const QColor& CustomStyleConfig::getNormalBackgroundColor(void)
{
    return m_cNormalBgColor;
}

const QColor& CustomStyleConfig::getNormalTextColor(void)
{
    return m_cNormalTextColor;
}

const QColor& CustomStyleConfig::getHighLightColor(void)
{
    return m_cNormalHighLightColor;
}


================================================
FILE: CustomWidgets/UICustomCore/CustomStyleConfig.h
================================================
#ifndef CUSTOMSTYLECONFIG_H
#define CUSTOMSTYLECONFIG_H

#include <QObject>
#include <QWidget>
#include "customwidgets_global.h"
#define g_StyleConfig CustomStyleConfig::getInstance()

class CUSTOMWIDGETSSHARED_EXPORT CustomStyleConfig : public QObject
{
public:
    static CustomStyleConfig* getInstance(void);
    
    void init(void);
    void setCurrentStyle(QWidget* widget, const QString& propertyValue, bool needPolish = false);

    // 加载语言
    void loadLanguage(const QString& qmFilePath);

    // 获取颜色
    const QColor& getNormalBackgroundColor(void);
    const QColor& getNormalTextColor(void);
    const QColor& getHighLightColor(void);

private:
    CustomStyleConfig();
    ~CustomStyleConfig();

    QString m_sCurrentPropertyName;
    QColor m_cNormalBgColor;
    QColor m_cNormalTextColor;
    QColor m_cNormalHighLightColor;
};

#endif


================================================
FILE: CustomWidgets/UICustomWidgtes/CustomDialog.cpp
================================================
#include "CustomDialog.h"
#include <QVBoxLayout>
#include <QPainter>
#include <QPalette>
#include <QStyleOption>
#include <QWindow>
#include <QDebug>

#include <windowsx.h>
#include <qt_windows.h>
#include <dwmapi.h>

#include "UICustomCore/CustomStyleConfig.h"
#pragma comment(lib, "dwmapi.lib")
#pragma comment(lib, "user32.lib")

CustomDialogTitle::CustomDialogTitle() 
    :m_buttonSize(20, 20)
{
    // init Style
    g_StyleConfig->setCurrentStyle(this, "DefaultTitleBar");

    this->setFixedHeight(m_nHeight);
    this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);

    QHBoxLayout* mainLayout = new QHBoxLayout(this);
    mainLayout->setContentsMargins(20, 0, 20, 0);
    mainLayout->setSpacing(20);

    // Title
    m_pTitleText = new QLabel;
    m_pTitleText->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    mainLayout->addWidget(m_pTitleText);

    // minimize Button
    m_pMinimizeButton = new QPushButton;
    m_pMinimizeButton->setObjectName("minButton");
    m_pMinimizeButton->setFixedSize(m_buttonSize);
    m_pMinimizeButton->setDefault(false);
    mainLayout->addWidget(m_pMinimizeButton);

    // maximize Button
    m_pMaximizeButton = new QPushButton;
    g_StyleConfig->setCurrentStyle(m_pMaximizeButton, "maxNormal");
    m_pMaximizeButton->setObjectName("maxButton");
    m_pMaximizeButton->setFixedSize(m_buttonSize);
    m_pMaximizeButton->setDefault(false);
    mainLayout->addWidget(m_pMaximizeButton);

    // close Button
    m_pCloseButton = new QPushButton;
    m_pCloseButton->setObjectName("closeButton");
    m_pCloseButton->setFixedSize(m_buttonSize);
    m_pCloseButton->setDefault(false);
    mainLayout->addWidget(m_pCloseButton);
}

CustomDialogTitle::~CustomDialogTitle()
{

}

void CustomDialogTitle::paintEvent(QPaintEvent *event)
{
    QStyleOption opt;
    opt.init(this);
    QPainter p(this);
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);

    return QWidget::paintEvent(event);
}

// -----------------------------------------------------------------------
const int CustomDialog::m_nBorderWidth = 10;

CustomDialog::CustomDialog(QWidget *parent)
    : QDialog(parent)
{
    Qt::WindowFlags windowFlags = this->windowFlags() | Qt::Window | Qt::FramelessWindowHint;
    windowFlags &= ~Qt::WindowSystemMenuHint;

    setWindowFlags(windowFlags);

    // init UI
    initUi();
}

CustomDialog::~CustomDialog()
{

}

void CustomDialog::setResizeable(bool resizeable)
{
    bool visible = isVisible();
    m_bResizeable = resizeable;
    if (m_bResizeable){
        setWindowFlags(windowFlags() | Qt::WindowMaximizeButtonHint);
        //        setWindowFlag(Qt::WindowMaximizeButtonHint);

        //此行代码可以带回Aero效果,同时也带回了标题栏和边框,在nativeEvent()会再次去掉标题栏
        //
        //this line will get titlebar/thick frame/Aero back, which is exactly what we want
        //we will get rid of titlebar and thick frame again in nativeEvent() later
        HWND hwnd = (HWND)this->winId();
        DWORD style = ::GetWindowLong(hwnd, GWL_STYLE);
        ::SetWindowLong(hwnd, GWL_STYLE, style | WS_MAXIMIZEBOX | WS_THICKFRAME | WS_CAPTION);
    }
    else{
        setWindowFlags(windowFlags() & ~Qt::WindowMaximizeButtonHint);
        //        setWindowFlag(Qt::WindowMaximizeButtonHint,false);

        HWND hwnd = (HWND)this->winId();
        DWORD style = ::GetWindowLong(hwnd, GWL_STYLE);
        ::SetWindowLong(hwnd, GWL_STYLE, style & ~WS_MAXIMIZEBOX & ~WS_CAPTION);
    }

    //保留一个像素的边框宽度,否则系统不会绘制边框阴影
    //
    //we better left 1 piexl width of border untouch, so OS can draw nice shadow around it
    const MARGINS shadow = { 1, 1, 1, 1 };
    ::DwmExtendFrameIntoClientArea(HWND(winId()), &shadow);

    setVisible(visible);
}

void CustomDialog::setContentWidget(QWidget* contentWidget)
{
    if (contentWidget == nullptr)
        return;

    contentWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    m_pMainLayout->addWidget(contentWidget);
}

void CustomDialog::setWindowTitle(const QString& str)
{
    this->m_pTitleWidget->m_pTitleText->setText(str);
    QDialog::setWindowTitle(str);
}

void CustomDialog::setContentsMargins(const QMargins &margins)
{
    QDialog::setContentsMargins(margins + m_frames);
    m_margins = margins;
}

void CustomDialog::setContentsMargins(int left, int top, int right, int bottom)
{
    QDialog::setContentsMargins(left + m_frames.left(), \
        top + m_frames.top(), \
        right + m_frames.right(), \
        bottom + m_frames.bottom());
    m_margins.setLeft(left);
    m_margins.setTop(top);
    m_margins.setRight(right);
    m_margins.setBottom(bottom);
}

QMargins CustomDialog::contentsMargins() const
{
    QMargins margins = QDialog::contentsMargins();
    margins -= m_frames;
    return margins;
}

QRect CustomDialog::contentsRect() const
{
    QRect rect = QDialog::contentsRect();
    int width = rect.width();
    int height = rect.height();
    rect.setLeft(rect.left() - m_frames.left());
    rect.setTop(rect.top() - m_frames.top());
    rect.setWidth(width);
    rect.setHeight(height);
    return rect;
}

void CustomDialog::getContentsMargins(int *left, int *top, int *right, int *bottom) const
{
    QDialog::getContentsMargins(left, top, right, bottom);
    if (!(left&&top&&right&&bottom)) return;
    if (isMaximized())
    {
        *left -= m_frames.left();
        *top -= m_frames.top();
        *right -= m_frames.right();
        *bottom -= m_frames.bottom();
    }
}

void CustomDialog::showFullScreen()
{
    if (isMaximized())
    {
        QDialog::setContentsMargins(m_margins);
        m_frames = QMargins();
    }
    QDialog::showFullScreen();
}

void CustomDialog::initUi(void)
{
    this->setContentsMargins(2, 2, 2, 2);
    QVBoxLayout* mainLayout = new QVBoxLayout(this);
    m_pTotlaLayout = mainLayout;
    mainLayout->setMargin(0);
    mainLayout->setSpacing(0);
    
    // title
    m_pTitleWidget = new CustomDialogTitle;
    m_pTitleWidget->m_pTitleText->setText("My Test Title");
    mainLayout->addWidget(m_pTitleWidget);

    // content
    QWidget* pContentWidget = new QWidget;
    pContentWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    mainLayout->addWidget(pContentWidget);

    // Content Layout
    m_pMainLayout = new QVBoxLayout(pContentWidget);
    m_pMainLayout->setMargin(0);
    m_pMainLayout->setSpacing(0);

    QObject::connect(m_pTitleWidget->m_pMinimizeButton, &QPushButton::clicked, this, &CustomDialog::showMinimized);
    QObject::connect(m_pTitleWidget->m_pMaximizeButton, &QPushButton::clicked, this, &CustomDialog::onClickedMaximizeButton);
    QObject::connect(m_pTitleWidget->m_pCloseButton, &QPushButton::clicked, this, &CustomDialog::close);
    
    if (this->windowHandle())
        QObject::connect(this->windowHandle(), &QWindow::windowStateChanged, this, &CustomDialog::onWindowStatusChanged);
}

void CustomDialog::onClickedMaximizeButton(void)
{
    if (this->isMaximized())
        this->showNormal();
    else
        this->showMaximized();
}

void CustomDialog::onWindowStatusChanged(Qt::WindowState windowStatus)
{
    bool isMaxed = false;
    if (windowStatus == Qt::WindowMaximized)
    {
        isMaxed = true;
        //m_pTotlaLayout->setContentsMargins(10, 10, 1, 1);
        g_StyleConfig->setCurrentStyle(m_pTitleWidget->m_pMaximizeButton, "maxed", true);
    }
    else if (windowStatus == Qt::WindowNoState)
    {
        g_StyleConfig->setCurrentStyle(m_pTitleWidget->m_pMaximizeButton, "maxNormal", true);
    }
}

void CustomDialog::paintEvent(QPaintEvent* event)
{
    QStyleOption opt;
    opt.init(this);
    QPainter p(this);
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);

    QPen nPen;
    nPen.setWidth(2);
    nPen.setColor(QColor(0, 0, 0));
    p.setPen(nPen);
    p.drawRect(this->rect());

    return QDialog::paintEvent(event);
}

bool CustomDialog::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
    MSG *param = static_cast<MSG *>(message);

    switch (param->message)
    {
    case WM_NCCALCSIZE: {
        NCCALCSIZE_PARAMS& params = *reinterpret_cast<NCCALCSIZE_PARAMS*>(param->lParam);
        if (params.rgrc[0].top != 0)
                params.rgrc[0].top -= 1;
        //this kills the window frame and title bar we added with WS_THICKFRAME and WS_CAPTION
        *result = WVR_REDRAW;
        return true;
    }
    case WM_NCHITTEST:
    {
        const LONG border_width = m_nBorderWidth;
        RECT winrect;
        GetWindowRect(HWND(winId()), &winrect);

        long x = GET_X_LPARAM(param->lParam);
        long y = GET_Y_LPARAM(param->lParam);
        int nX = x - this->geometry().x();
        int nY = y - this->geometry().y();

        //support highdpi
        double dpr = this->devicePixelRatioF();
        if (this->childAt(mapFromGlobal(QPoint(x/dpr,y/dpr))) == m_pTitleWidget->m_pTitleText)
        {
            *result = HTCAPTION;
            return true;
        }

        QRect nRect = this->rect().adjusted(m_nBorderWidth, m_nBorderWidth, -m_nBorderWidth, -m_nBorderWidth);
        bool needDispose = this->rect().contains(nX, nY) && !nRect.contains(nX, nY);
        if (!needDispose)
            return QDialog::nativeEvent(eventType, message, result);

        // dispose window frame
        if ((nX > 0) && (nX < m_nBorderWidth))
            *result = HTLEFT;

        if ((nX > this->width() - m_nBorderWidth) && (nX < this->width()))
            *result = HTRIGHT;

        if ((nY > 0) && (nY < m_nBorderWidth))
            *result = HTTOP;

        if ((nY > this->height() - m_nBorderWidth) && (nY < this->height()))
            *result = HTBOTTOM;

        if ((nX > 0) && (nX < m_nBorderWidth) && (nY > 0)
            && (nY < m_nBorderWidth))
            *result = HTTOPLEFT;

        if ((nX > this->width() - m_nBorderWidth) && (nX < this->width())
            && (nY > 0) && (nY < m_nBorderWidth))
            *result = HTTOPRIGHT;

        if ((nX > 0) && (nX < m_nBorderWidth)
            && (nY > this->height() - m_nBorderWidth) && (nY < this->height()))
            *result = HTBOTTOMLEFT;

        if ((nX > this->width() - m_nBorderWidth) && (nX < this->width())
            && (nY > this->height() - m_nBorderWidth) && (nY < this->height()))
            *result = HTBOTTOMRIGHT;

        return true;
    }
    case WM_GETMINMAXINFO:
    {
        if (::IsZoomed(param->hwnd)) 
        {
            RECT frame = { 0, 0, 0, 0 };
            AdjustWindowRectEx(&frame, WS_OVERLAPPEDWINDOW, FALSE, 0);

            //record frame area data
#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0))
            double dpr = this->devicePixelRatioF();
#else
            double dpr = 1.0;
#endif

            m_frames.setLeft(abs(frame.left) / dpr + 0.5);
            m_frames.setTop(abs(frame.bottom) / dpr + 0.5);
            m_frames.setRight(abs(frame.right) / dpr + 0.5);
            m_frames.setBottom(abs(frame.bottom) / dpr + 0.5);

            QDialog::setContentsMargins(m_frames.left() + m_margins.left(), \
                m_frames.top() + m_margins.top(), \
                m_frames.right() + m_margins.right(), \
                m_frames.bottom() + m_margins.bottom());
            m_bJustMaximized = true;
            g_StyleConfig->setCurrentStyle(m_pTitleWidget->m_pMaximizeButton, "maxed", true);
        }
        else 
        {
            if (m_bJustMaximized)
            {
                QDialog::setContentsMargins(m_margins);
                m_frames = QMargins();
                m_bJustMaximized = false;
                g_StyleConfig->setCurrentStyle(m_pTitleWidget->m_pMaximizeButton, "maxNormal", true);
            }
        }
        return false;
    }
    }

    return QDialog::nativeEvent(eventType, message, result);
}

void CustomDialog::showEvent(QShowEvent* event)
{
    if (!m_isShowed)
    {
        m_isShowed = true;
        setResizeable(m_bResizeable);
    }

    QDialog::showEvent(event);
}



================================================
FILE: CustomWidgets/UICustomWidgtes/CustomDialog.h
================================================
#pragma once

#include <QDialog>
#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include "customwidgets_global.h"

/**
* Window Title
*/
class CustomDialog;
class CustomDialogTitle : public QWidget
{
    Q_OBJECT
public:
    CustomDialogTitle();
    ~CustomDialogTitle();
    friend class CustomDialog;

private:
    // controls
    QLabel *m_pTitleText = nullptr;
    QPushButton* m_pMinimizeButton = nullptr;
    QPushButton* m_pMaximizeButton = nullptr;
    QPushButton* m_pCloseButton = nullptr;

private:
    int m_nHeight = 30;
    QSize m_buttonSize;

protected:
    void paintEvent(QPaintEvent *event) override;
};

/**
* Windows Styles Dialog
*/
class QVBoxLayout;
class CUSTOMWIDGETSSHARED_EXPORT CustomDialog : public QDialog
{
    Q_OBJECT

public:
    CustomDialog(QWidget *parent = Q_NULLPTR);
    ~CustomDialog();

    //设置是否可以通过鼠标调整窗口大小
    //if resizeable is set to false, then the window can not be resized by mouse
    //but still can be resized programtically
    void setResizeable(bool resizeable = true);
    bool isResizeable(){ return m_bResizeable; }

    // setContentWidget
    void setContentWidget(QWidget* contentWidget);
    // 设置标题
    void setWindowTitle(const QString& str);

public:
    void setContentsMargins(const QMargins &margins);
    void setContentsMargins(int left, int top, int right, int bottom);
    QMargins contentsMargins() const;
    QRect contentsRect() const;
    void getContentsMargins(int *left, int *top, int *right, int *bottom) const;

public slots:
    void showFullScreen();

protected:
    QVBoxLayout *m_pMainLayout = nullptr;

    void paintEvent(QPaintEvent* event) override;
    bool nativeEvent(const QByteArray & eventType, void * message, long * result) override;
    void showEvent(QShowEvent* event) override;

private:
    static const int m_nBorderWidth;

    // init ui(init titlebar)
    void initUi(void);
    CustomDialogTitle* m_pTitleWidget = nullptr;

    QVBoxLayout* m_pTotlaLayout = nullptr;

    QMargins m_margins;
    QMargins m_frames;
    bool m_bJustMaximized = false;
    bool m_bResizeable = true;

    bool m_isShowed = false;

private slots:
    void onClickedMaximizeButton(void);
    void onWindowStatusChanged(Qt::WindowState windowStatus);
};


================================================
FILE: CustomWidgets/UICustomWidgtes/CustomMainWindow.cpp
================================================
#include "CustomMainWindow.h"

CustomMainWindow::CustomMainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    
}

CustomMainWindow::~CustomMainWindow()
{

}


================================================
FILE: CustomWidgets/UICustomWidgtes/CustomMainWindow.h
================================================
#pragma once

#include <QMainWindow>

class CustomMainWindow : public QMainWindow
{
    Q_OBJECT

public:
    CustomMainWindow(QWidget *parent = Q_NULLPTR);
    ~CustomMainWindow();
};


================================================
FILE: CustomWidgets/UICustomWidgtes/CustomTestWidget.cpp
================================================
#include "CustomTestWidget.h"
#include <QTabWidget>
#include <QPushButton>
#include <QComboBox>
#include <QLineEdit>
#include <QTextEdit>
#include <QVBoxLayout>
#include <QLabel>
#include <QListView>
#include <QMenuBar>
#include <QProgressBar>
#include <QGroupBox>
#include <QCheckBox>
#include <QRadioButton>
#include <QTableWidget>
#include <QTableWidgetItem>
#include <QHeaderView>
#include <QSpinBox>
#include <QDoubleSpinBox>
#include <QTimeEdit>
#include <QDateEdit>
#include <QListWidget>
#include <QTreeWidget>

CustomTestWidget::CustomTestWidget(QWidget* parent)
    :CustomWidget(parent)
{
    QVBoxLayout* mainLayout = new QVBoxLayout(this);

    m_pMenuBar = new QMenuBar;
    mainLayout->addWidget(m_pMenuBar);

    m_pTabWidget = new QTabWidget;
    mainLayout->addWidget(m_pTabWidget);

    initMenuBar();
    initCommonControls();
    initTableControls();
    initListControls();
}

CustomTestWidget::~CustomTestWidget()
{

}

void CustomTestWidget::initMenuBar(void)
{
    QMenu *fileMenu = new QMenu(tr("File"));
    fileMenu->addAction(tr("Open File"));
    fileMenu->addAction(tr("Save File"));
    fileMenu->addAction(tr("Exit"));
    m_pMenuBar->addMenu(fileMenu);

    QMenu *EditMenu = new QMenu(tr("Edit"));
    EditMenu->addAction(tr("Redo"));
    EditMenu->addAction(tr("Undo"));
    EditMenu->addAction(tr("Copy"));
    EditMenu->addAction(tr("Cut"));
    EditMenu->addAction(tr("Paste"));
    m_pMenuBar->addMenu(EditMenu);

    QMenu *otherMenu = new QMenu(tr("Other"));
    otherMenu->addAction(tr("Theme"));
    otherMenu->addAction(tr("Language"));
    otherMenu->addSeparator();
    otherMenu->addAction(tr("About"));
    m_pMenuBar->addMenu(otherMenu);
}

void CustomTestWidget::initCommonControls(void)
{
    QWidget *commonWidget = new QWidget;
    m_pTabWidget->addTab(commonWidget, tr("Common Controls"));
    QVBoxLayout* layout = new QVBoxLayout(commonWidget);

    // row1 - QLabel QLineEdit
    QHBoxLayout* topLayout = new QHBoxLayout;
    QLabel* tagWidget = new QLabel(tr("Label:"));
    QLineEdit* lineEdit = new QLineEdit(tr("Test lineEdit"));
    topLayout->addWidget(tagWidget);
    topLayout->addWidget(lineEdit);
    layout->addLayout(topLayout);

    // row2 - QPushButton
    QHBoxLayout *secondLayout = new QHBoxLayout;
    for (int i = 1; i <= 4; ++i)
    {
        QString buttonName = "%1_Button";
        buttonName = buttonName.arg(i);
        QPushButton* btn = new QPushButton;
        btn->setText(buttonName);
        //btn->setMinimumHeight(25);

        secondLayout->addWidget(btn);
    }
    layout->addLayout(secondLayout);

    // row3 - QComboBox
    QHBoxLayout *row3Layout = new QHBoxLayout;
    QComboBox* comboBox1 = new QComboBox;
    comboBox1->setView(new QListView(comboBox1));
    comboBox1->addItem(tr("Test1"));
    comboBox1->addItem(tr("Test2"));
    comboBox1->addItem(tr("Test3"));
    comboBox1->addItem(tr("Test4"));
    row3Layout->addWidget(comboBox1);
    layout->addLayout(row3Layout);

    // row4 - QSlider and QProgressBar
    QHBoxLayout* row4Layout = new QHBoxLayout;
    QSlider *slider = new QSlider(Qt::Horizontal);
    slider->setMaximum(100);
    slider->setMinimum(0);
    slider->setValue(50);
    row4Layout->addWidget(slider);
    QProgressBar *progressBar = new QProgressBar;
    progressBar->setMinimum(0);
    progressBar->setMaximum(100);
    progressBar->setValue(50);
    QObject::connect(slider, &QSlider::valueChanged, progressBar, &QProgressBar::setValue);
    row4Layout->addWidget(progressBar);
    layout->addLayout(row4Layout);

    // row5 - checkbox and radiobutton
    // checkBox
    QGroupBox *checkBoxGroupBox = new QGroupBox;
    checkBoxGroupBox->setTitle(tr("CheckBox"));
    QHBoxLayout *checkBoxLayout = new QHBoxLayout(checkBoxGroupBox);
    QCheckBox* checkBox1 = new QCheckBox(tr("CheckBox1"));
    QCheckBox* checkBox2 = new QCheckBox(tr("CheckBox2"));
    checkBoxLayout->addWidget(checkBox1);
    checkBoxLayout->addWidget(checkBox2);
    // add Widgets
    QHBoxLayout *row5Layout = new QHBoxLayout;
    row5Layout->addWidget(checkBoxGroupBox);
    layout->addLayout(row5Layout);
    // radioButton
    QGroupBox *radioButtonGroupBox = new QGroupBox;
    radioButtonGroupBox->setTitle(tr("RadioButton"));
    QHBoxLayout *radioButtonLayout = new QHBoxLayout(radioButtonGroupBox);
    QRadioButton* radioButton1 = new QRadioButton(tr("RadioButton1"));
    QRadioButton* radioButton2 = new QRadioButton(tr("RadioButton2"));
    radioButtonLayout->addWidget(radioButton1);
    radioButtonLayout->addWidget(radioButton2);
    row5Layout->addWidget(radioButtonGroupBox);

    // row6
    QHBoxLayout* row6Layout = new QHBoxLayout;
    QDoubleSpinBox* doubleSpinBox = new QDoubleSpinBox;
    QSpinBox* spinBox = new QSpinBox;
    QDateEdit *dateEdit = new QDateEdit;
    QTimeEdit* timeEdit = new QTimeEdit;
    row6Layout->addWidget(doubleSpinBox);
    row6Layout->addWidget(spinBox);
    row6Layout->addWidget(dateEdit);
    row6Layout->addWidget(timeEdit);
    layout->addLayout(row6Layout);

    // row7 - QTextEdit
    QHBoxLayout* row7Layout = new QHBoxLayout;
    QTextEdit* edit = new QTextEdit;
    row7Layout->addWidget(edit);
    layout->addLayout(row7Layout);
}

void CustomTestWidget::initTableControls(void)
{
    QTableWidget* tableWidget = new QTableWidget;
    m_pTabWidget->addTab(tableWidget, tr("TableWidget"));

    tableWidget->setRowCount(100);
    tableWidget->setColumnCount(5);
    tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);

    QStringList heads;
    heads << tr("ID") << tr("Name") << tr("Sex") << tr("Age") << tr("Score");
    tableWidget->setHorizontalHeaderLabels(heads);

    int ids[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    QString names[10] = { "douzhq", "xiaoming", "xiaohong", "xiaozhao", "xiaoli", \
        "douzhq", "xiaoming", "xiaohong", "xiaozhao", "xiaoli" };
    QString sex[10] = { "man", "man", "female", "man", "man", "female", "man", "man", "female", "man" };
    int ages[10] = { 22, 23, 24, 25, 26, 27, 28, 29, 30, 31 };
    int Score[10] = { 100, 99, 98, 97, 96, 95, 94, 93, 92, 91 };
    
    for (int i = 0; i < 100; ++i)
    {
        tableWidget->setItem(i, 0, new QTableWidgetItem(QString::number(ids[i % 10])));
        tableWidget->setItem(i, 1, new QTableWidgetItem(names[i % 10]));
        tableWidget->setItem(i, 2, new QTableWidgetItem(sex[i % 10]));
        tableWidget->setItem(i, 3, new QTableWidgetItem(QString::number(ages[i % 10])));
        tableWidget->setItem(i, 4, new QTableWidgetItem(QString::number(Score[i % 10])));
    }
}

void CustomTestWidget::initListControls(void)
{
    QWidget* w = new QWidget;
    w->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    m_pTabWidget->addTab(w, "ListWidget");

    QHBoxLayout* layout = new QHBoxLayout(w);
    QListWidget* listWidget = new QListWidget;
    listWidget->addItem(new QListWidgetItem(tr("ListWidgetItem1")));
    listWidget->addItem(new QListWidgetItem(tr("ListWidgetItem2")));
    listWidget->addItem(new QListWidgetItem(tr("ListWidgetItem3")));
    listWidget->addItem(new QListWidgetItem(tr("ListWidgetItem4")));
    layout->addWidget(listWidget);

    QTreeWidget* treeWidget = new QTreeWidget;
    layout->addWidget(treeWidget);
    QTreeWidgetItem* topItem1 = new QTreeWidgetItem();
    topItem1->setText(0, "topLevelItem1");
    topItem1->addChild(new QTreeWidgetItem(QStringList("Top1_Child1")));
    topItem1->addChild(new QTreeWidgetItem(QStringList("Top1_Child2")));
    treeWidget->addTopLevelItem(topItem1);

    QTreeWidgetItem* topItem2 = new QTreeWidgetItem();
    topItem2->setText(0, "topLevelItem2");
    topItem2->addChild(new QTreeWidgetItem(QStringList("Top2_Child1")));
    topItem2->addChild(new QTreeWidgetItem(QStringList("Top2_Child2")));
    treeWidget->addTopLevelItem(topItem2);
}


================================================
FILE: CustomWidgets/UICustomWidgtes/CustomTestWidget.h
================================================
#ifndef CUSTOMT_TEST_WIDGET_H
#define CUSTOMT_TEST_WIDGET_H

#include <QWidget>
#include "CustomWidget.h"
class QTabWidget;
class QMenuBar;
class CustomTestWidget : public CustomWidget
{
    Q_OBJECT

public:
    CustomTestWidget(QWidget* parent = nullptr);
    ~CustomTestWidget();

private:
    QTabWidget* m_pTabWidget = nullptr;
    QMenuBar* m_pMenuBar = nullptr;

    void initMenuBar(void);
    void initCommonControls(void);
    void initTableControls(void);
    void initListControls(void);
};
#endif


================================================
FILE: CustomWidgets/UICustomWidgtes/CustomWidget.cpp
================================================
#include "CustomWidget.h"
#include "UICustomCore/CustomStyleConfig.h"
#include <QStyleOption>
#include <QPainter>

CustomWidget::CustomWidget(QWidget* parent)
    :QWidget(parent)
{
    g_StyleConfig->setCurrentStyle(this, "DefaultWidget");
}

CustomWidget::~CustomWidget()
{

}

void CustomWidget::paintEvent(QPaintEvent* event)
{
    QStyleOption opt;
    opt.init(this);
    QPainter p(this);
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);

    customPaint(&p);
    return QWidget::paintEvent(event);
}

void CustomWidget::customPaint(QPainter* painter)
{

}


================================================
FILE: CustomWidgets/UICustomWidgtes/CustomWidget.h
================================================
#ifndef CUSTOMWIDGET_H
#define CUSTOMWIDGET_H

#include <QWidget>
#include "customwidgets_global.h"
class CUSTOMWIDGETSSHARED_EXPORT CustomWidget : public QWidget
{
    Q_OBJECT

public:
    CustomWidget(QWidget* parent = nullptr);
    ~CustomWidget();

protected:
    void paintEvent(QPaintEvent* event) final;

    // Custom Paint Event
    virtual void customPaint(QPainter* painter);
};

#endif


================================================
FILE: CustomWidgets/customwidgets_global.h
================================================
#ifndef CUSTOMWIDGETS_GLOBAL_H
#define CUSTOMWIDGETS_GLOBAL_H

#include <QtCore/qglobal.h>

#if defined(CUSTOMWIDGETS_LIBRARY)
#  define CUSTOMWIDGETSSHARED_EXPORT Q_DECL_EXPORT
#else
#  define CUSTOMWIDGETSSHARED_EXPORT Q_DECL_IMPORT
#endif

#endif // CUSTOMWIDGETS_GLOBAL_H


================================================
FILE: CustomWidgets/qss/light.css
================================================
/*标题*/
QWidget[LightStyleProperty='DefaultTitleBar']
{
    background-color: rgb(84, 126, 172);
}

/*通用的Widget*/
QWidget[LightStyleProperty='DefaultWidget']
{
    background-color: rgb(80, 80, 80);
}

/*有底线的Widget*/
QWidget[LightStyleProperty='BottomLineWidget']
{
    border-bottom: 1px solid rgb(200, 200, 200);
}

/*透明的Widget*/
QWidget[LightStyleProperty='TransparentBgWidget']
{
    background: transparent;
}

QMessageBox QWidget
{
    color: rgb(0, 0, 0);
}

/*关闭按钮*/
QWidget[LightStyleProperty='DefaultTitleBar'] QPushButton#closeButton
{
    background: transparent;
    border:none;
    image: url(:/qss/images/close_normal.svg);
}

QWidget[LightStyleProperty='DefaultTitleBar'] QPushButton:hover#closeButton
{
    image: url(:/qss/images/close_hover.svg);
}

QWidget[LightStyleProperty='DefaultTitleBar'] QPushButton:pressed#closeButton
{
    image: url(:/qss/images/close_pressed.svg);
}

/*最小化按钮*/
QWidget[LightStyleProperty='DefaultTitleBar'] QPushButton#minButton
{
    background: transparent;
    border: none;
    image: url(:/qss/images/minimize_normal.svg);
}

QWidget[LightStyleProperty='DefaultTitleBar'] QPushButton:hover#minButton
{
    image: url(:/qss/images/minimize_hover.svg);
}

QWidget[LightStyleProperty='DefaultTitleBar'] QPushButton:pressed#minButton
{
    image: url(:/qss/images/minimize_pressed.svg);
}

/*最大化按钮*/
QWidget[LightStyleProperty='DefaultTitleBar'] QPushButton#maxButton[LightStyleProperty='maxNormal']
{
    background: transparent;
    border: none;
    image: url(:/qss/images/maximized_normal.svg);
}

QWidget[LightStyleProperty='DefaultTitleBar'] QPushButton:hover#maxButton[LightStyleProperty='maxNormal']
{
    image: url(:/qss/images/maximized_hover.svg);
}

QWidget[LightStyleProperty='DefaultTitleBar'] QPushButton:pressed#maxButton[LightStyleProperty='maxNormal']
{
    image: url(:/qss/images/maximized_pressed.svg);
}

QWidget[LightStyleProperty='DefaultTitleBar'] QPushButton#maxButton[LightStyleProperty='maxed']
{
    background: transparent;
    border: none;
    image: url(:/qss/images/maximize_normal.svg);
}

QWidget[LightStyleProperty='DefaultTitleBar'] QPushButton:hover#maxButton[LightStyleProperty='maxed']
{
    image: url(:/qss/images/maximize_hover.svg);
}

QWidget[LightStyleProperty='DefaultTitleBar'] QPushButton:pressed#maxButton[LightStyleProperty='maxed']
{
    image: url(:/qss/images/maximize_pressed.svg);
}

/*透明Widget*/
QWidget[LightStyleProperty='Transparent']
{
	background: transparent;
}

/*GroupTitle*/
/*************************************************************************************************************/
QWidget[LightStyleProperty='GroupTitle']
{
	background-color: rgb(90, 90, 90);
	color: rgb(230, 230, 230);
}
QWidget:hover[LightStyleProperty='GroupTitle']
{
	background-color: rgb(120, 120, 120);
}

/*GroupTitle*/
/*************************************************************************************************************/
QWidget[LightStyleProperty='GroupContent']
{
	background-color: rgb(60, 60, 60);
}

/*GroupWidget*/
/*************************************************************************************************************/
QWidget[LightStyleProperty='GroupWidget']
{
	background-color: rgb(80, 80, 80);
	border: 1px solid rgb(200, 200, 200);
	border-radius: 4px;
}
/*===========================================================================================================*/
/*ImageView*/
QWidget[LightStyleProperty='ImageView']
{
	background-color: rgb(60, 60, 60);
	border-radius: 4px;
	border: 1px solid rgb(200, 200, 200);
}
/*************************************************************************************************************/

/*DownLoadItemView*/
QWidget[LightStyleProperty='DownLoadItemView']
{
	background-color: rgb(70, 70, 70);
	border: 1px solid rgb(253, 135, 50);
    margin: 2px;
    padding: 2px;
    border-radius: 4px;
}
/*************************************************************************************************************/

/*LeftBarItem*/
QWidget[LightStyleProperty='LeftBarItem']
{
    background: rgb(80, 80, 80);
    color: rgb(230, 230, 230);
    border: 1px solid rgb(200, 200, 200);
}

QWidget[LightStyleProperty='LeftBarItemSelected']
{
    background: rgb(60, 60, 60);
    color: rgb(230, 230, 230);
    border: 1px solid rgb(200, 200, 200);
}

QWidget:hover[LightStyleProperty='LeftBarItem']
{
    background: rgb(100, 100, 100);
    color: rgb(255, 255, 255);
}

QWidget[LightStyleProperty='LeftBar']
{
    background: rgb(40, 40, 40);
    border: 1px solid rgb(200, 200, 200);
    border-radius: 4px;
}

QStackedWidget
{
    background: rgb(40, 40, 40);
    border: 1px solid rgb(200, 200, 200);
    border-radius: 4px;
    padding: 4px;
}
/*************************************************************************************************************/
/*QSplitter*/
QSplitter::handle {
    background-color: rgb(40, 40, 40);
    margin: 0px 4px 0px 4px;
}

QSplitter::handle:horizontal {
    width: 5px;
}

QSplitter::handle:vertical {
    height: 5px;
}

QSplitter::handle:pressed {
    background-color: rgb(120, 120, 120);
}

QSplitter::handle:hover {
    background-color: rgb(200, 200, 200);
}

/*QLabel*/
QLabel
{
    color: rgb(255, 255, 255);
}

QLabel[LightStyleProperty='LargeTitle']
{
    color: rgb(253, 135, 50);
    border: 0px solid red;
    border-bottom: 1px solid rgb(230, 230, 230);
}

/*QTabWidget*/
QTabWidget::pane
{
    background-color: rgb(80, 80, 80);
    color: rgb(255, 255, 255);
    border: 1px solid rgb(140, 140, 140);
}

QTabWidget::tab-bar
{
    background-color: rgb(80, 80, 80);
    color: rgb(255, 255, 255);
}

QTabBar::tab
{
    background-color: rgb(100, 100, 100);
    color: rgb(255, 255, 255);
    border: 1px solid rgb(140, 140, 140);
    border-top-left-radius: 4px;
    border-top-right-radius: 4px;
    border-bottom: none;
    padding: 4px;
}

QTabBar::tab:hover
{
    background-color: rgb(80, 80, 80);
}

QTabBar::tab:selected
{
    background-color: rgb(60, 60, 60);
}

QTabBar::tab:!selected
{
    margin-top: 2px;
}

/*QLineEdit*/
QLineEdit, QTextEdit, QTimeEdit, QDateEdit, QDateTimeEdit, QDoubleSpinBox, QSpinBox
{
    background-color: rgb(60, 60, 60);
    color: rgb(255, 255, 255);
    border: 1px solid rgb(100, 100, 100);
    border-radius: 4px;
    selection-background-color: rgb(130, 130, 130);
    min-height: 20px;
    padding: 2px;
}

QLineEdit:focus, QTextEdit:focus, QTimeEdit:focus, QDateEdit:focus, QDateTimeEdit:focus, QDoubleSpinBox:focus, QSpinBox:focus
{
    border: 1px solid rgb(253, 135, 50);
}

/*QPushButton*/
QPushButton, QToolButton
{
    border: 1px solid rgb(60, 60, 60);
    color: rgb(255, 255, 255);
    border-radius: 4px;

    background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
                                stop: 0 rgb(120, 120, 120),
                                stop: 0.4 rgb(100, 100, 100),
                                stop: 1.0 rgb(80, 80, 80));
    min-height: 25px;
	padding: 2px 2px 2px 2px;
}

QPushButton:hover, QToolButton:hover
{
    background-color: rgb(90, 90, 90);
}

QPushButton:pressed, QToolButton:pressed
{
    background-color: rgb(60, 60, 60);
    border: 1px solid rgb(100, 100, 100);
}

QPushButton:disabled, QToolButton:disabled
{
    background-color: rgb(80, 80, 80);
}

QPushButton[LightStyleProperty='LinkButton']
{
    background: transparent;
    color: rgb(243, 125, 40);
    border-width: 0px;
}

QPushButton:hover[LightStyleProperty='LinkButton']
{
    color: rgb(139, 240, 40);
}

/*QComboBox*/
QComboBox
{
    background-color: rgb(90, 90, 90);
    border: 1px solid rgb(120, 120, 120);
    border-radius: 4px;
    min-height: 25px;
    color: rgb(255, 255, 255);
}

QComboBox:hover
{
    background-color: rgb(100, 100, 100);
}

QComboBox::drop-down
{
    background: transparent;
    border: none;
}

QComboBox::down-arrow
{
    image: url(:/qss/images/comboBox_bottom.png);
    margin-right: 7px;
    width: 16px;
    height: 16px;
}

QComboBox QAbstractItemView
{
    border: 1px solid rgb(120, 120, 120);
    background-color: rgb(80, 80, 80);
    outline: none;
}

QComboBox QAbstractItemView::item
{
    height: 20;
    outline: none;
    background-color: rgb(60, 60, 60);
    color: rgb(255, 255, 255);
}

QComboBox QAbstractItemView::item:hover
{
    background-color: rgb(253, 135, 50);
    color: rgb(255, 255, 255);
}

QComboBox QAbstractItemView::item:selected
{
    background-color: rgb(253, 135, 50);
}

/*QMenuBar*/
QMenuBar
{
    background-color: rgb(80, 80, 80);
    color: rgb(255, 255, 255);
}

QMenuBar::item
{
    background-color: transparent;
}

QMenuBar::item:selected
{
    background-color: rgb(60, 60, 60);
}

/*QMenu*/
QMenu
{
    background-color: rgb(80, 80, 80);
    color: rgb(255, 255, 255);
    border: 1px solid rgb(120, 120, 120);
}

QMenu::item
{
    padding: 2px 25px 2px 20px;
    border: 1px solid transparent;
    background-color: rgb(60, 60, 60);
}

QMenu::item:selected
{
    background: rgb(253, 135, 50);
}

QMenu::item:hover
{
    background: rgb(253, 135, 50);
}

QMenu::item:disabled
{
    color: rgb(160, 160, 160);
}

QMenu::separator
{
    height: 1px;
    background: rgb(120, 120, 120);
}

/*QSlider*/
QSlider::groove:horizontal
{
    border: 1px solid rgb(120, 120, 120);
    height: 8px;
    background: rgb(60, 60, 60);
    margin: 0px 4px;
    border-radius: 4px;
}

QSlider::handle:horizontal
{
    width:13px;
    margin-top:-3px;
    margin-bottom:-3px;
    border-radius:6px;
    background: rgb(243, 125, 40);
    /*border: 2px solid rgb(120, 120, 120);*/
    background:qradialgradient(spread:pad,cx:0.5,cy:0.5,radius:0.5,fx:0.5,fy:0.5,stop:0.8 rgb(243, 125, 40),stop:0.9 rgb(140, 140, 140));
}

QSlider::handle:horizontal:hover
{
    background: rgb(253, 135, 50);
    background:qradialgradient(spread:pad,cx:0.5,cy:0.5,radius:0.5,fx:0.5,fy:0.5,stop:0.8 rgb(253, 135, 50),stop:0.9 rgb(140, 140, 140));
}

QSlider::add-page:horizontal
{

}

QSlider::sub-page:horizontal
{
    height:8px;
    margin: 2px 2px 2px 7px;
    background: rgb(243, 125, 40);
    border-radius: 2px;
}

/*QProgressBar*/
QProgressBar
{
    text-align: center;
    border: 1px solid rgb(120, 120, 120);
    border-radius: 4px;
    background-color: rgb(60, 60, 60);
    color: rgb(255, 255, 255);
}

QProgressBar::chunk
{
    background-color: rgb(253, 135, 50);
    margin: 2px 2px 2px 2px;
    border-radius: 2px;
}

/*QGroupBox*/
QGroupBox
{
    margin-top: 5px;
    background-color: rgb(80, 80, 80);
    border: 1px solid rgb(120, 120, 120);
    border-radius: 4px;
    padding: 4px;
}

QGroupBox::title
{
    left:10px;
    position:relative;
    subcontrol-origin:margin;
    color: rgb(255, 255, 255);
}

/*QCheckBox*/
QGroupBox::indicator,QTreeWidget::indicator,QListWidget::indicator{
    padding:0px -3px 0px 3px;
}

QCheckBox::indicator,QGroupBox::indicator,QTreeWidget::indicator,QListWidget::indicator{
    width:13px;
    height:13px;
}

QCheckBox::indicator:unchecked,QGroupBox::indicator:unchecked,QTreeWidget::indicator:unchecked,QListWidget::indicator:unchecked{
    image:url(:/qss/images/checkbox_unchecked.png);
}

QCheckBox::indicator:unchecked:disabled,QGroupBox::indicator:unchecked:disabled,QTreeWidget::indicator:unchecked:disabled,QListWidget::indicator:disabled{
    image:url(:/qss/images/checkbox_unchecked_disable.png);
}

QCheckBox::indicator:checked,QGroupBox::indicator:checked,QTreeWidget::indicator:checked,QListWidget::indicator:checked{
    image:url(:/qss/images/checkbox_checked.png);
}

QCheckBox::indicator:checked:disabled,QGroupBox::indicator:checked:disabled,QTreeWidget::indicator:checked:disabled,QListWidget::indicator:checked:disabled{
    image:url(:/qss/images/checkbox_checked_disable.png);
}

QCheckBox::indicator:indeterminate,QGroupBox::indicator:indeterminate,QTreeWidget::indicator:indeterminate,QListWidget::indicator:indeterminate{
    image:url(:/qss/images/checkbox_parcial.png);
}

QCheckBox::indicator:indeterminate:disabled,QGroupBox::indicator:indeterminate:disabled,QTreeWidget::indicator:indeterminate:disabled,QListWidget::indicator:indeterminate:disabled{
    image:url(:/qss/images/checkbox_parcial_disable.png);
}

/*QRadioButton*/
QRadioButton::indicator{
    width:15px;
    height:15px;
}

QRadioButton::indicator::unchecked{
    image:url(:/qss/images/radiobutton_unchecked.png);
}

QRadioButton::indicator::unchecked:disabled{
    image:url(:/qss/images/radiobutton_unchecked_disable.png);
}

QRadioButton::indicator::checked{
    image:url(:/qss/images/radiobutton_checked.png);
}

QRadioButton::indicator::checked:disabled{
    image:url(:/qss/images/radiobutton_checked_disable.png);
}

/*TableView、QListView、QTreeView*/
QTableView
{
    background-color: rgb(80, 80, 80);
    color: rgb(255, 255, 255);
    gridline-color: rgb(120, 120, 120);
    outline: none;
}

QTreeView
{
    show-decoration-selected: 1;
    background-color: rgb(80, 80, 80);
    color: rgb(255, 255, 255);
    outline: none;
    border-radius: 4px;
}

QListView, QListWidget
{
    show-decoration-selected: 1;
    background-color: rgb(60, 60, 60);
    color: rgb(255, 255, 255);
    outline: none;
    border-radius: 4px;
}

QTreeView::item, QTableView::item
{
    background: rgb(80, 80, 80);
    color: rgb(255, 255, 255);
    outline: none;
}

QListView::item, QListWidget::item
{
    background: rgb(100, 100, 100);
    color: rgb(255, 255, 255);
    outline: none;
    border: 1px solid rgb(253, 135, 50);
    border-radius: 4px;
}

QTreeView::item:hover, QListView::item:hover, QListWidget::item:hover, QTableView::item:hover
{
    background: rgba(253, 135, 50, 100);
}

QTreeView::item:selected, QListView::item:selected, QListWidget::item:selected, QTableView::item:selected
{
    background: rgb(253, 135, 50);
    outline: none;
}

/*QHeaderView*/
QHeaderView, QTableCornerButton:section
{
    background-color: rgb(80, 80, 80);
}

QHeaderView::section
{
    background-color: rgb(40, 40, 40);
    color: rgb(230, 230, 230);
    padding: 4px;
    border: 1px solid rgb(100, 100, 100);
}

QHeaderView::section:checked
{
    color: rgb(255, 255, 255);
}

/*QScrollBar*/
QScrollBar:vertical
{
    border: 1px solid rgb(140, 140, 140);
    background: rgb(40, 40, 40);
    width: 12px;
    border-radius: 4px;
}

QScrollBar:horizontal
{
    border: 1px solid rgb(140, 140, 140);
    background: rgb(40, 40, 40);
    height: 12px;
    border-radius: 4px;
}

QScrollBar::handle:vertical
{
    min-height: 30px;
    background: rgb(100, 100, 100);
    border: none;
    border-radius: 4px;
}

QScrollBar::handle:horizontal
{
    min-width: 30px;
    background: rgb(100, 100, 100);
    border: none;
    border-radius: 4px;
}

QScrollBar::handle:hover
{
    background: rgb(160, 160, 160);
}

/* add-line, sub-line */
QScrollBar::add-line:vertical {
    border: none;
    height: 0px;
    subcontrol-position: bottom;
    subcontrol-origin: margin;
}
QScrollBar::sub-line:vertical {
    border: none;
    height: 0px;
    subcontrol-position: top;
    subcontrol-origin: margin;
}
QScrollBar::add-line:horizontal {
    border: none;
    width: 0px;
    subcontrol-position: right;
    subcontrol-origin: margin;
}
QScrollBar::sub-line:horizontal {
    border: none;
    width: 0px;
    subcontrol-position: left;
    subcontrol-origin: margin;
}


QScrollBar::add-page, QScrollBar::sub-page
{
    background: transparent;
}

/*up-button and down-button*/
QTimeEdit::up-button,QDateEdit::up-button,QDateTimeEdit::up-button,QDoubleSpinBox::up-button,QSpinBox::up-button
{
    image: url(:/qss/images/add_top.png);
    width: 10px;
    height: 10px;
    margin: 2px 2px 1px 0px;
}

QDoubleSpinBox::up-button,QSpinBox::up-button
{
	width: 0px;
}

QTimeEdit::down-button,QDateEdit::down-button,QDateTimeEdit::down-button,QDoubleSpinBox::down-button,QSpinBox::down-button
{
    image: url(:/qss/images/add_bottom.png);
    width: 10px;
    height: 10px;
    margin: 1px 2px 2px 0px;
}

QDoubleSpinBox::down-button,QSpinBox::down-button
{
	width: 0px;
}

/*---------------------------------Tree Branch Abourt---------------------------------*/
QTreeView::branch
{
    background: rgb(80, 80, 80);
}

QTreeView::branch:hover
{
    background: rgba(235, 135, 50, 100);
}

QTreeView::branch:selected
{
    background: rgb(235, 135, 50);
}

QTreeView::branch:has-siblings:!adjoins-item {
      border-image: url(:/qss/images/vline.png) 0;
}

QTreeView::branch:has-siblings:adjoins-item {
  border-image: url(:/qss/images/branch_more.png) 0;
}

QTreeView::branch:!has-children:!has-siblings:adjoins-item {
  border-image: url(:/qss/images/branch_end.png) 0;
}

QTreeView::branch:has-children:!has-siblings:closed,
QTreeView::branch:closed:has-children:has-siblings {
      border-image: none;
      image: url(:/qss/images/branch_closed.png);
}

QTreeView::branch:open:has-children:!has-siblings,
QTreeView::branch:open:has-children:has-siblings  {
      border-image: none;
      image: url(:/qss/images/branch_open.png);
}


================================================
FILE: CustomWidgets/qss.qrc
================================================
<RCC>
    <qresource prefix="/">
        <file>qss/light.css</file>
        <file>qss/images/add_bottom.png</file>
        <file>qss/images/add_left.png</file>
        <file>qss/images/add_right.png</file>
        <file>qss/images/add_top.png</file>
        <file>qss/images/branch_open.png</file>
        <file>qss/images/calendar_nextmonth.png</file>
        <file>qss/images/calendar_prevmonth.png</file>
        <file>qss/images/checkbox_checked.png</file>
        <file>qss/images/checkbox_checked_disable.png</file>
        <file>qss/images/checkbox_parcial.png</file>
        <file>qss/images/checkbox_parcial_disable.png</file>
        <file>qss/images/checkbox_unchecked.png</file>
        <file>qss/images/checkbox_unchecked_disable.png</file>
        <file>qss/images/close_hover.svg</file>
        <file>qss/images/close_normal.svg</file>
        <file>qss/images/close_pressed.svg</file>
        <file>qss/images/comboBox_bottom.png</file>
        <file>qss/images/maximize_hover.svg</file>
        <file>qss/images/maximize_normal.svg</file>
        <file>qss/images/maximize_pressed.svg</file>
        <file>qss/images/maximized_hover.svg</file>
        <file>qss/images/maximized_normal.svg</file>
        <file>qss/images/maximized_pressed.svg</file>
        <file>qss/images/minimize_hover.svg</file>
        <file>qss/images/minimize_normal.svg</file>
        <file>qss/images/minimize_pressed.svg</file>
        <file>qss/images/radiobutton_checked.png</file>
        <file>qss/images/radiobutton_checked_disable.png</file>
        <file>qss/images/radiobutton_unchecked.png</file>
        <file>qss/images/radiobutton_unchecked_disable.png</file>
        <file>qss/images/branch_end.png</file>
        <file>qss/images/branch_more.png</file>
        <file>qss/images/stylesheet-branch-open.png</file>
        <file>qss/images/vline.png</file>
        <file>qss/images/branch_closed.png</file>
        <file>qss/images/branch_closed2.png</file>
    </qresource>
</RCC>


================================================
FILE: EasyCanvas/EasyCanvas.pro
================================================
#-------------------------------------------------
#
# Project created by QtCreator 2020-03-20T10:38:32
#
#-------------------------------------------------

QT       += core gui multimedia

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = EasyCanvas
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

QMAKE_CXXFLAGS_RELEASE += /Zi
QMAKE_CXXFLAGS_RELEASE += /Od
QMAKE_LFLAGS_RELEASE += /DEBUG

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

CONFIG += c++11
RC_ICONS = EasyCanvas.ico

MOC_DIR += $$PWD/../temp/EasyCanvas
OBJECTS_DIR += $$PWD/../temp/EasyCanvas
DESTDIR += $$PWD/../bin

LIBS += -L$$PWD/../bin -lCustomWidgets
LIBS += -L$$PWD/../bin -lCustomControls
LIBS += -L$$PWD/../bin -lUtils
LIBS += -L$$PWD/../bin -lNDNodeAttribute
LIBS += -L$$PWD/../bin -lNodeAttributeControl
LIBS += -L$$PWD/../bin -lAudioVideoCore
LIBS += -L$$PWD/../bin -lPythonWrap
LIBS += -L$$PWD/../bin -lEasyCanvasCore

INCLUDEPATH += $$PWD/../CustomWidgets
INCLUDEPATH += $$PWD/../CustomControls
INCLUDEPATH += $$PWD/../NDNodeAttribute
INCLUDEPATH += $$PWD/../NodeAttributeControl
INCLUDEPATH += $$PWD/../Utils
INCLUDEPATH += $$PWD/../AudioVideoCore
INCLUDEPATH += $$PWD/../PythonWrap
INCLUDEPATH += $$PWD/../EasyCanvasCore
INCLUDEPATH += $$PWD/UICanvas
INCLUDEPATH += $$PWD/UICore
INCLUDEPATH += $$PWD/../thirdLibs/ffmpeg/include

INCLUDEPATH += $$PWD/../thirdLibs/PythonQt_3_10/include
INCLUDEPATH += $$PWD/../thirdLibs/python3_10/include
CONFIG(debug, debug|release) {
    LIBS += -L$$PWD/../thirdLibs/PythonQt/libs/debug -lPythonQt_QtAll-Qt5-Python38_d -lPythonQt-Qt5-Python38_d
    LIBS += -L$$PWD/../thirdLibs/python3_8/libs -lpython3_d -lpython38_d
} else {
    LIBS += -L$$PWD/../thirdLibs/PythonQt/libs/release -lPythonQt_QtAll-Qt5-Python38 -lPythonQt-Qt5-Python38
    LIBS += -L$$PWD/../thirdLibs/python3_8/libs -lpython3 -lpython38

    # python3.10 , VS2019
    #LIBS += -L$$PWD/../thirdLibs/PythonQt_3_10/libs/release -lPythonQt_QtAll-Qt5-Python3.10 -lPythonQt-Qt5-Python3.10
    #LIBS += -L$$PWD/../thirdLibs/python3_10/libs -lpython3 -lpython310
}

SOURCES += \
    GlobalHotKey/GlobalHotKeyFilter.cpp \
    GlobalHotKey/GlobalHotKeyInfo.cpp \
    GlobalHotKey/GlobalH
Download .txt
gitextract_u8hxl36n/

├── AudioVideoCore/
│   ├── AudioData.cpp
│   ├── AudioData.h
│   ├── AudioDecodec.cpp
│   ├── AudioDecodec.h
│   ├── AudioPlayer.cpp
│   ├── AudioPlayer.h
│   ├── AudioPlayerThread.cpp
│   ├── AudioPlayerThread.h
│   ├── AudioVideoCore.pro
│   └── audiovideocore_global.h
├── CustomControls/
│   ├── CustomCombineControl/
│   │   ├── UICustomColorControl.cpp
│   │   ├── UICustomColorControl.h
│   │   ├── UICustomCombineControlBase.cpp
│   │   ├── UICustomCombineControlBase.h
│   │   ├── UICustomComboBoxControl.cpp
│   │   ├── UICustomComboBoxControl.h
│   │   ├── UICustomDateEditControl.cpp
│   │   ├── UICustomDateEditControl.h
│   │   ├── UICustomDoubleControl.cpp
│   │   ├── UICustomDoubleControl.h
│   │   ├── UICustomFontComboBoxControl.cpp
│   │   ├── UICustomFontComboBoxControl.h
│   │   ├── UICustomGroupControl.cpp
│   │   ├── UICustomGroupControl.h
│   │   ├── UICustomIntControl.cpp
│   │   ├── UICustomIntControl.h
│   │   ├── UICustomLineEditControl.cpp
│   │   ├── UICustomLineEditControl.h
│   │   ├── UICustomOrientationControl.cpp
│   │   ├── UICustomOrientationControl.h
│   │   ├── UICustomPostionControl.cpp
│   │   ├── UICustomPostionControl.h
│   │   ├── UICustomSwitchControl.cpp
│   │   ├── UICustomSwitchControl.h
│   │   ├── UICustomTextEditTagControl.cpp
│   │   ├── UICustomTextEditTagControl.h
│   │   ├── UICustomTimeEditControl.cpp
│   │   └── UICustomTimeEditControl.h
│   ├── CustomControls.pro
│   ├── UICurtomLeftBarControl/
│   │   ├── UICustomLefTabsControl.h
│   │   ├── UICustomLeftItemWidget.cpp
│   │   ├── UICustomLeftItemWidget.h
│   │   ├── UICustomLeftTabsControl.cpp
│   │   ├── UICustomLeftWidget.cpp
│   │   └── UICustomLeftWidget.h
│   ├── UICustomColorControl/
│   │   ├── UICustomColorCircle.cpp
│   │   ├── UICustomColorCircle.h
│   │   ├── UICustomColorSlider.cpp
│   │   ├── UICustomColorSlider.h
│   │   ├── UICustomColorSliderItem.cpp
│   │   ├── UICustomColorSliderItem.h
│   │   ├── UICustomColorWidget.cpp
│   │   ├── UICustomColorWidget.h
│   │   ├── UICustomCustomColorOperator.cpp
│   │   ├── UICustomCustomColorOperator.h
│   │   ├── UICustonColorDialog.cpp
│   │   └── UICustonColorDialog.h
│   ├── UICustomSingleControl/
│   │   ├── UICustomCalendarWidget.cpp
│   │   ├── UICustomCalendarWidget.h
│   │   ├── UICustomColorViewWidget.cpp
│   │   ├── UICustomColorViewWidget.h
│   │   ├── UICustomComboBox.cpp
│   │   ├── UICustomComboBox.h
│   │   ├── UICustomDateEdit.cpp
│   │   ├── UICustomDateEdit.h
│   │   ├── UICustomDoubleSpinBox.cpp
│   │   ├── UICustomDoubleSpinBox.h
│   │   ├── UICustomImageViewer.cpp
│   │   ├── UICustomImageViewer.h
│   │   ├── UICustomIntSpinBox.cpp
│   │   ├── UICustomIntSpinBox.h
│   │   ├── UICustomLineEdit.cpp
│   │   ├── UICustomLineEdit.h
│   │   ├── UICustomPostionWidget.cpp
│   │   ├── UICustomPostionWidget.h
│   │   ├── UICustomSwitchWidget.cpp
│   │   ├── UICustomSwitchWidget.h
│   │   ├── UICustomTextEdit.cpp
│   │   ├── UICustomTextEdit.h
│   │   ├── UICustomTimeEdit.cpp
│   │   └── UICustomTimeEdit.h
│   └── customcontrols_global.h
├── CustomWidgets/
│   ├── CustomWidgets.pro
│   ├── UICustomCore/
│   │   ├── CustomStyleConfig.cpp
│   │   └── CustomStyleConfig.h
│   ├── UICustomWidgtes/
│   │   ├── CustomDialog.cpp
│   │   ├── CustomDialog.h
│   │   ├── CustomMainWindow.cpp
│   │   ├── CustomMainWindow.h
│   │   ├── CustomTestWidget.cpp
│   │   ├── CustomTestWidget.h
│   │   ├── CustomWidget.cpp
│   │   └── CustomWidget.h
│   ├── customwidgets_global.h
│   ├── qss/
│   │   └── light.css
│   └── qss.qrc
├── EasyCanvas/
│   ├── EasyCanvas.pro
│   ├── GlobalHotKey/
│   │   ├── GlobalHotKeyFilter.cpp
│   │   ├── GlobalHotKeyFilter.h
│   │   ├── GlobalHotKeyInfo.cpp
│   │   ├── GlobalHotKeyInfo.h
│   │   ├── GlobalHotKeyManager.cpp
│   │   └── GlobalHotKeyManager.h
│   ├── UICore/
│   │   ├── MainWindow.cpp
│   │   ├── MainWindow.h
│   │   ├── UIAboutMeDialog.cpp
│   │   ├── UIAboutMeDialog.h
│   │   ├── UIAttributWidget.cpp
│   │   └── UIAttributWidget.h
│   └── main.cpp
├── EasyCanvas.pro
├── EasyCanvasCore/
│   ├── EasyCanvasCore.pro
│   ├── Scheme/
│   │   ├── CanvasSchemeManager.cpp
│   │   ├── CanvasSchemeManager.h
│   │   ├── SQLCore.cpp
│   │   ├── SQLCore.h
│   │   ├── SchemeDataInfo.h
│   │   ├── UISchemeManagerDialog.cpp
│   │   ├── UISchemeManagerDialog.h
│   │   ├── UISchemeManagerWidget.cpp
│   │   └── UISchemeManagerWidget.h
│   ├── UICanvas/
│   │   ├── UICanvasAudioItem.cpp
│   │   ├── UICanvasAudioItem.h
│   │   ├── UICanvasEllipseItem.cpp
│   │   ├── UICanvasEllipseItem.h
│   │   ├── UICanvasImageItem.cpp
│   │   ├── UICanvasImageItem.h
│   │   ├── UICanvasItemBase.cpp
│   │   ├── UICanvasItemBase.h
│   │   ├── UICanvasItemManager.cpp
│   │   ├── UICanvasItemManager.h
│   │   ├── UICanvasOperators.cpp
│   │   ├── UICanvasOperators.h
│   │   ├── UICanvasPathItem.cpp
│   │   ├── UICanvasPathItem.h
│   │   ├── UICanvasRectItem.cpp
│   │   ├── UICanvasRectItem.h
│   │   ├── UICanvasScene.cpp
│   │   ├── UICanvasScene.h
│   │   ├── UICanvasTextItem.cpp
│   │   ├── UICanvasTextItem.h
│   │   ├── UICanvasView.cpp
│   │   └── UICanvasView.h
│   ├── UINodeTree/
│   │   ├── UINodeItem.cpp
│   │   ├── UINodeItem.h
│   │   ├── UINodeSortFilterProxyModel.cpp
│   │   ├── UINodeSortFilterProxyModel.h
│   │   ├── UINodeTreeDelegate.cpp
│   │   ├── UINodeTreeDelegate.h
│   │   ├── UINodeTreeView.cpp
│   │   ├── UINodeTreeView.h
│   │   ├── UINodeTreeViewModel.cpp
│   │   ├── UINodeTreeViewModel.h
│   │   ├── UINodeTreeWidget.cpp
│   │   └── UINodeTreeWidget.h
│   ├── UndoCmd/
│   │   ├── ItemAttributeChangedCmd.cpp
│   │   ├── ItemAttributeChangedCmd.h
│   │   ├── ItemChangeNameCmd.cpp
│   │   ├── ItemChangeNameCmd.h
│   │   ├── ItemCreateCmd.cpp
│   │   ├── ItemCreateCmd.h
│   │   ├── ItemDeleteCmd.cpp
│   │   ├── ItemDeleteCmd.h
│   │   ├── ItemPasteCmd.cpp
│   │   ├── ItemPasteCmd.h
│   │   ├── UndoCmdCore.cpp
│   │   └── UndoCmdCore.h
│   └── easycanvascore_global.h
├── EasyCanvas_zh_CH.ts
├── NDNodeAttribute/
│   ├── NDAttributeBase.cpp
│   ├── NDAttributeBase.h
│   ├── NDAttributeData.cpp
│   ├── NDAttributeData.h
│   ├── NDAttributeGroup.cpp
│   ├── NDAttributeGroup.h
│   ├── NDBoolAttribute.cpp
│   ├── NDBoolAttribute.h
│   ├── NDColorAttribute.cpp
│   ├── NDColorAttribute.h
│   ├── NDIntAttribute.cpp
│   ├── NDIntAttribute.h
│   ├── NDNodeAttribute.pro
│   ├── NDNodeBase.cpp
│   ├── NDNodeBase.h
│   ├── NDNodeManager.cpp
│   ├── NDNodeManager.h
│   ├── NDPostionAttribute.cpp
│   ├── NDPostionAttribute.h
│   ├── NDRealAttribute.cpp
│   ├── NDRealAttribute.h
│   ├── NDStringAttribute.cpp
│   ├── NDStringAttribute.h
│   ├── NDTextNode.cpp
│   ├── NDTextNode.h
│   └── ndnodeattribute_global.h
├── NodeAttributeControl/
│   ├── NodeAttributeControl.pro
│   ├── UIAttrBoolControl.cpp
│   ├── UIAttrBoolControl.h
│   ├── UIAttrColorControl.cpp
│   ├── UIAttrColorControl.h
│   ├── UIAttrFloatControl.cpp
│   ├── UIAttrFloatControl.h
│   ├── UIAttrIntControl.cpp
│   ├── UIAttrIntControl.h
│   ├── UIAttrTextControl.cpp
│   ├── UIAttrTextControl.h
│   ├── UINodeAttrControl.cpp
│   ├── UINodeAttrControl.h
│   └── nodeattributecontrol_global.h
├── PythonWrap/
│   ├── PythonWrap.pro
│   ├── PythonWrapCore.cpp
│   ├── PythonWrapCore.h
│   ├── pythonwrap.cpp
│   ├── pythonwrap.h
│   └── pythonwrap_global.h
├── Utils/
│   ├── RALLBlockSignal.cpp
│   ├── RALLBlockSignal.h
│   ├── Utils.cpp
│   ├── Utils.h
│   ├── Utils.pro
│   └── utils_global.h
├── bin/
│   ├── CustomColor.xml
│   └── Script/
│       └── SetColorAlphaScript.py
├── readme.md
└── thirdLibs/
    ├── PythonQt/
    │   ├── include/
    │   │   ├── PythonQt.h
    │   │   ├── PythonQtBoolResult.h
    │   │   ├── PythonQtClassInfo.h
    │   │   ├── PythonQtClassWrapper.h
    │   │   ├── PythonQtConversion.h
    │   │   ├── PythonQtCppWrapperFactory.h
    │   │   ├── PythonQtDoc.h
    │   │   ├── PythonQtImportFileInterface.h
    │   │   ├── PythonQtImporter.h
    │   │   ├── PythonQtInstanceWrapper.h
    │   │   ├── PythonQtMethodInfo.h
    │   │   ├── PythonQtMisc.h
    │   │   ├── PythonQtObjectPtr.h
    │   │   ├── PythonQtProperty.h
    │   │   ├── PythonQtPythonInclude.h
    │   │   ├── PythonQtQFileImporter.h
    │   │   ├── PythonQtSignal.h
    │   │   ├── PythonQtSignalReceiver.h
    │   │   ├── PythonQtSlot.h
    │   │   ├── PythonQtSlotDecorator.h
    │   │   ├── PythonQtStdDecorators.h
    │   │   ├── PythonQtStdIn.h
    │   │   ├── PythonQtStdOut.h
    │   │   ├── PythonQtSystem.h
    │   │   ├── PythonQtThreadSupport.h
    │   │   ├── PythonQtUtils.h
    │   │   ├── PythonQtVariants.h
    │   │   ├── PythonQt_QtAll.h
    │   │   └── gui/
    │   │       └── PythonQtScriptingConsole.h
    │   └── libs/
    │       ├── debug/
    │       │   ├── PythonQt-Qt5-Python38_d.lib
    │       │   └── PythonQt_QtAll-Qt5-Python38_d.lib
    │       └── release/
    │           ├── PythonQt-Qt5-Python38.lib
    │           └── PythonQt_QtAll-Qt5-Python38.lib
    ├── ffmpeg/
    │   ├── include/
    │   │   ├── libavcodec/
    │   │   │   ├── ac3_parser.h
    │   │   │   ├── adts_parser.h
    │   │   │   ├── avcodec.h
    │   │   │   ├── avdct.h
    │   │   │   ├── avfft.h
    │   │   │   ├── d3d11va.h
    │   │   │   ├── dirac.h
    │   │   │   ├── dv_profile.h
    │   │   │   ├── dxva2.h
    │   │   │   ├── jni.h
    │   │   │   ├── mediacodec.h
    │   │   │   ├── qsv.h
    │   │   │   ├── vaapi.h
    │   │   │   ├── vdpau.h
    │   │   │   ├── version.h
    │   │   │   ├── videotoolbox.h
    │   │   │   ├── vorbis_parser.h
    │   │   │   └── xvmc.h
    │   │   ├── libavdevice/
    │   │   │   ├── avdevice.h
    │   │   │   └── version.h
    │   │   ├── libavfilter/
    │   │   │   ├── avfilter.h
    │   │   │   ├── buffersink.h
    │   │   │   ├── buffersrc.h
    │   │   │   └── version.h
    │   │   ├── libavformat/
    │   │   │   ├── avformat.h
    │   │   │   ├── avio.h
    │   │   │   └── version.h
    │   │   ├── libavutil/
    │   │   │   ├── adler32.h
    │   │   │   ├── aes.h
    │   │   │   ├── aes_ctr.h
    │   │   │   ├── attributes.h
    │   │   │   ├── audio_fifo.h
    │   │   │   ├── avassert.h
    │   │   │   ├── avconfig.h
    │   │   │   ├── avstring.h
    │   │   │   ├── avutil.h
    │   │   │   ├── base64.h
    │   │   │   ├── blowfish.h
    │   │   │   ├── bprint.h
    │   │   │   ├── bswap.h
    │   │   │   ├── buffer.h
    │   │   │   ├── camellia.h
    │   │   │   ├── cast5.h
    │   │   │   ├── channel_layout.h
    │   │   │   ├── common.h
    │   │   │   ├── cpu.h
    │   │   │   ├── crc.h
    │   │   │   ├── des.h
    │   │   │   ├── dict.h
    │   │   │   ├── display.h
    │   │   │   ├── downmix_info.h
    │   │   │   ├── encryption_info.h
    │   │   │   ├── error.h
    │   │   │   ├── eval.h
    │   │   │   ├── ffversion.h
    │   │   │   ├── fifo.h
    │   │   │   ├── file.h
    │   │   │   ├── frame.h
    │   │   │   ├── hash.h
    │   │   │   ├── hdr_dynamic_metadata.h
    │   │   │   ├── hmac.h
    │   │   │   ├── hwcontext.h
    │   │   │   ├── hwcontext_cuda.h
    │   │   │   ├── hwcontext_d3d11va.h
    │   │   │   ├── hwcontext_drm.h
    │   │   │   ├── hwcontext_dxva2.h
    │   │   │   ├── hwcontext_mediacodec.h
    │   │   │   ├── hwcontext_qsv.h
    │   │   │   ├── hwcontext_vaapi.h
    │   │   │   ├── hwcontext_vdpau.h
    │   │   │   ├── hwcontext_videotoolbox.h
    │   │   │   ├── imgutils.h
    │   │   │   ├── intfloat.h
    │   │   │   ├── intreadwrite.h
    │   │   │   ├── lfg.h
    │   │   │   ├── log.h
    │   │   │   ├── lzo.h
    │   │   │   ├── macros.h
    │   │   │   ├── mastering_display_metadata.h
    │   │   │   ├── mathematics.h
    │   │   │   ├── md5.h
    │   │   │   ├── mem.h
    │   │   │   ├── motion_vector.h
    │   │   │   ├── murmur3.h
    │   │   │   ├── opt.h
    │   │   │   ├── parseutils.h
    │   │   │   ├── pixdesc.h
    │   │   │   ├── pixelutils.h
    │   │   │   ├── pixfmt.h
    │   │   │   ├── random_seed.h
    │   │   │   ├── rational.h
    │   │   │   ├── rc4.h
    │   │   │   ├── replaygain.h
    │   │   │   ├── ripemd.h
    │   │   │   ├── samplefmt.h
    │   │   │   ├── sha.h
    │   │   │   ├── sha512.h
    │   │   │   ├── spherical.h
    │   │   │   ├── stereo3d.h
    │   │   │   ├── tea.h
    │   │   │   ├── threadmessage.h
    │   │   │   ├── time.h
    │   │   │   ├── timecode.h
    │   │   │   ├── timestamp.h
    │   │   │   ├── tree.h
    │   │   │   ├── twofish.h
    │   │   │   ├── tx.h
    │   │   │   ├── version.h
    │   │   │   └── xtea.h
    │   │   ├── libpostproc/
    │   │   │   ├── postprocess.h
    │   │   │   └── version.h
    │   │   ├── libswresample/
    │   │   │   ├── swresample.h
    │   │   │   └── version.h
    │   │   └── libswscale/
    │   │       ├── swscale.h
    │   │       └── version.h
    │   └── libs/
    │       ├── avcodec-58.def
    │       ├── avcodec.lib
    │       ├── avdevice-58.def
    │       ├── avdevice.lib
    │       ├── avfilter-7.def
    │       ├── avfilter.lib
    │       ├── avformat-58.def
    │       ├── avformat.lib
    │       ├── avutil-56.def
    │       ├── avutil.lib
    │       ├── postproc-55.def
    │       ├── postproc.lib
    │       ├── swresample-3.def
    │       ├── swresample.lib
    │       ├── swscale-5.def
    │       └── swscale.lib
    └── python3_8/
        ├── include/
        │   ├── Python-ast.h
        │   ├── Python.h
        │   ├── abstract.h
        │   ├── asdl.h
        │   ├── ast.h
        │   ├── bitset.h
        │   ├── bltinmodule.h
        │   ├── boolobject.h
        │   ├── bytearrayobject.h
        │   ├── bytes_methods.h
        │   ├── bytesobject.h
        │   ├── cellobject.h
        │   ├── ceval.h
        │   ├── classobject.h
        │   ├── code.h
        │   ├── codecs.h
        │   ├── compile.h
        │   ├── complexobject.h
        │   ├── context.h
        │   ├── cpython/
        │   │   ├── abstract.h
        │   │   ├── dictobject.h
        │   │   ├── fileobject.h
        │   │   ├── initconfig.h
        │   │   ├── interpreteridobject.h
        │   │   ├── object.h
        │   │   ├── objimpl.h
        │   │   ├── pyerrors.h
        │   │   ├── pylifecycle.h
        │   │   ├── pymem.h
        │   │   ├── pystate.h
        │   │   ├── sysmodule.h
        │   │   ├── traceback.h
        │   │   ├── tupleobject.h
        │   │   └── unicodeobject.h
        │   ├── datetime.h
        │   ├── descrobject.h
        │   ├── dictobject.h
        │   ├── dtoa.h
        │   ├── dynamic_annotations.h
        │   ├── enumobject.h
        │   ├── errcode.h
        │   ├── eval.h
        │   ├── fileobject.h
        │   ├── fileutils.h
        │   ├── floatobject.h
        │   ├── frameobject.h
        │   ├── funcobject.h
        │   ├── genobject.h
        │   ├── graminit.h
        │   ├── grammar.h
        │   ├── import.h
        │   ├── internal/
        │   │   ├── pycore_accu.h
        │   │   ├── pycore_atomic.h
        │   │   ├── pycore_ceval.h
        │   │   ├── pycore_code.h
        │   │   ├── pycore_condvar.h
        │   │   ├── pycore_context.h
        │   │   ├── pycore_fileutils.h
        │   │   ├── pycore_getopt.h
        │   │   ├── pycore_gil.h
        │   │   ├── pycore_hamt.h
        │   │   ├── pycore_initconfig.h
        │   │   ├── pycore_object.h
        │   │   ├── pycore_pathconfig.h
        │   │   ├── pycore_pyerrors.h
        │   │   ├── pycore_pyhash.h
        │   │   ├── pycore_pylifecycle.h
        │   │   ├── pycore_pymem.h
        │   │   ├── pycore_pystate.h
        │   │   ├── pycore_traceback.h
        │   │   ├── pycore_tupleobject.h
        │   │   └── pycore_warnings.h
        │   ├── interpreteridobject.h
        │   ├── intrcheck.h
        │   ├── iterobject.h
        │   ├── listobject.h
        │   ├── longintrepr.h
        │   ├── longobject.h
        │   ├── marshal.h
        │   ├── memoryobject.h
        │   ├── methodobject.h
        │   ├── modsupport.h
        │   ├── moduleobject.h
        │   ├── namespaceobject.h
        │   ├── node.h
        │   ├── object.h
        │   ├── objimpl.h
        │   ├── odictobject.h
        │   ├── opcode.h
        │   ├── osdefs.h
        │   ├── osmodule.h
        │   ├── parsetok.h
        │   ├── patchlevel.h
        │   ├── picklebufobject.h
        │   ├── py_curses.h
        │   ├── pyarena.h
        │   ├── pycapsule.h
        │   ├── pyconfig.h
        │   ├── pyctype.h
        │   ├── pydebug.h
        │   ├── pydtrace.h
        │   ├── pyerrors.h
        │   ├── pyexpat.h
        │   ├── pyfpe.h
        │   ├── pyhash.h
        │   ├── pylifecycle.h
        │   ├── pymacconfig.h
        │   ├── pymacro.h
        │   ├── pymath.h
        │   ├── pymem.h
        │   ├── pyport.h
        │   ├── pystate.h
        │   ├── pystrcmp.h
        │   ├── pystrhex.h
        │   ├── pystrtod.h
        │   ├── pythonrun.h
        │   ├── pythread.h
        │   ├── pytime.h
        │   ├── rangeobject.h
        │   ├── setobject.h
        │   ├── sliceobject.h
        │   ├── structmember.h
        │   ├── structseq.h
        │   ├── symtable.h
        │   ├── sysmodule.h
        │   ├── token.h
        │   ├── traceback.h
        │   ├── tracemalloc.h
        │   ├── tupleobject.h
        │   ├── typeslots.h
        │   ├── ucnhash.h
        │   ├── unicodeobject.h
        │   ├── warnings.h
        │   └── weakrefobject.h
        └── libs/
            ├── _tkinter.lib
            ├── _tkinter_d.lib
            ├── python3.lib
            ├── python38.lib
            ├── python38_d.lib
            └── python3_d.lib
Download .txt
SYMBOL INDEX (1332 symbols across 325 files)

FILE: AudioVideoCore/AudioData.h
  type AudioData (line 10) | struct AudioData

FILE: AudioVideoCore/AudioPlayer.h
  function Q_OBJECT (line 10) | Q_OBJECT
  type PlayStatus (line 22) | enum PlayStatus

FILE: AudioVideoCore/AudioPlayerThread.h
  function class (line 23) | class AudioPlayerThread : public QThread

FILE: CustomControls/CustomCombineControl/UICustomColorControl.cpp
  function QColor (line 52) | const QColor& UICustomColorControl::getCurrentColor(void)

FILE: CustomControls/CustomCombineControl/UICustomCombineControlBase.cpp
  function QSize (line 112) | QSize UICustomCombineControlBase::sizeHint() const

FILE: CustomControls/CustomCombineControl/UICustomComboBoxControl.cpp
  function QString (line 34) | QString UICustomComboBoxControl::getCurrentItem(void)
  function QVariant (line 54) | QVariant UICustomComboBoxControl::getCurrentItemData(void)

FILE: CustomControls/CustomCombineControl/UICustomDateEditControl.cpp
  function QDate (line 22) | QDate UICustomDateEditControl::getCurrentDate(void)

FILE: CustomControls/CustomCombineControl/UICustomDoubleControl.cpp
  function qreal (line 49) | qreal UICustomDoubleControl::getCurrentValue(void)
  function qreal (line 98) | qreal UICustomDoubleControl::getValuesBySlider(void)

FILE: CustomControls/CustomCombineControl/UICustomGroupControl.cpp
  function QSize (line 63) | QSize UICustomGroupTitleItem::sizeHint() const
  function QSize (line 96) | QSize UICustomGroupContentItem::sizeHint() const
  function QSize (line 161) | QSize UICustomGroupControl::sizeHint() const

FILE: CustomControls/CustomCombineControl/UICustomGroupControl.h
  function class (line 42) | class UICustomGroupTitleItem : public CustomWidget
  function class (line 70) | class UICustomGroupContentItem : public CustomWidget

FILE: CustomControls/CustomCombineControl/UICustomLineEditControl.cpp
  function QString (line 49) | QString UICustomLineEditControl::getText(void)

FILE: CustomControls/CustomCombineControl/UICustomOrientationControl.cpp
  function QSize (line 48) | QSize UICustomOrientationItemWidget::sizeHint() const

FILE: CustomControls/CustomCombineControl/UICustomOrientationControl.h
  function class (line 23) | class UICustomOrientationItemWidget : public CustomWidget
  function class (line 47) | class UICustomOrientationWidget : public CustomWidget

FILE: CustomControls/CustomCombineControl/UICustomTextEditTagControl.cpp
  function QString (line 18) | QString UICustomTextEditTagControl::getCurrentText(void)

FILE: CustomControls/CustomCombineControl/UICustomTimeEditControl.cpp
  function QTime (line 22) | QTime UICustomTimeEditControl::getCurrentTime(void)

FILE: CustomControls/UICurtomLeftBarControl/UICustomLeftItemWidget.cpp
  function QSize (line 66) | QSize UICustomLeftItemWidget::sizeHint(void) const
  function QString (line 95) | QString UICustomLeftItemWidget::getText(void)

FILE: CustomControls/UICurtomLeftBarControl/UICustomLeftWidget.h
  function class (line 9) | class UICutomLeftWidget : public CustomWidget

FILE: CustomControls/UICustomColorControl/UICustomColorCircle.cpp
  function qreal (line 101) | qreal UICustomColorCircle::distance(QPoint p1, QPoint p2)
  function QColor (line 139) | QColor UICustomColorCircle::getCurrentColor(void)
  function QSize (line 247) | QSize UICustomColorCircle::sizeHint() const

FILE: CustomControls/UICustomColorControl/UICustomColorCircle.h
  function class (line 5) | class UICustomColorCircle : public CustomWidget

FILE: CustomControls/UICustomColorControl/UICustomColorSlider.h
  function class (line 10) | class UICustomColorSlider : public UICustomCombineControlBase

FILE: CustomControls/UICustomColorControl/UICustomColorSliderItem.cpp
  function QSize (line 106) | QSize UICustomColorSliderItem::sizeHint() const

FILE: CustomControls/UICustomColorControl/UICustomColorSliderItem.h
  function class (line 7) | class UICustomColorSliderItem : public CustomWidget

FILE: CustomControls/UICustomColorControl/UICustomColorWidget.cpp
  function QColor (line 362) | QColor UICustomColorWidget::getCurrentColor(void)

FILE: CustomControls/UICustomColorControl/UICustomColorWidget.h
  function class (line 13) | class UICustomColorWidget : public CustomWidget

FILE: CustomControls/UICustomColorControl/UICustomCustomColorOperator.h
  function class (line 9) | class UICustomCustomColorOperator : public QObject

FILE: CustomControls/UICustomColorControl/UICustonColorDialog.cpp
  function QColor (line 33) | QColor UICustomColorDialog::getCurrentColor(void)

FILE: CustomControls/UICustomColorControl/UICustonColorDialog.h
  function class (line 8) | class UICustomColorDialog : public CustomDialog

FILE: CustomControls/UICustomSingleControl/UICustomCalendarWidget.h
  function class (line 6) | class UICustomCalendarWidget : public QCalendarWidget

FILE: CustomControls/UICustomSingleControl/UICustomColorViewWidget.cpp
  function QSize (line 42) | QSize UICustomColorViewWidget::sizeHint() const
  function QColor (line 102) | const QColor& UICustomColorViewWidget::getCurrentColor(void)

FILE: CustomControls/UICustomSingleControl/UICustomColorViewWidget.h
  function class (line 7) | class UICustomColorViewWidget : public CustomWidget

FILE: CustomControls/UICustomSingleControl/UICustomComboBox.cpp
  function QSize (line 15) | QSize UICustomComboBox::sizeHint(void) const

FILE: CustomControls/UICustomSingleControl/UICustomComboBox.h
  function class (line 5) | class UICustomComboBox : public QComboBox

FILE: CustomControls/UICustomSingleControl/UICustomDateEdit.h
  function class (line 5) | class UICutomDateEdit : public QDateEdit

FILE: CustomControls/UICustomSingleControl/UICustomDoubleSpinBox.cpp
  function QSize (line 15) | QSize UICustomDoubleSpinBox::sizeHint() const

FILE: CustomControls/UICustomSingleControl/UICustomDoubleSpinBox.h
  function class (line 7) | class UICustomDoubleSpinBox : public QDoubleSpinBox

FILE: CustomControls/UICustomSingleControl/UICustomImageViewer.cpp
  function QSize (line 104) | QSize UICustomImageViewer::sizeHint() const
  function qreal (line 117) | qreal UICustomImageViewer::getZoomValue(void)

FILE: CustomControls/UICustomSingleControl/UICustomIntSpinBox.cpp
  function QSize (line 15) | QSize UICustomIntSpinBox::sizeHint() const

FILE: CustomControls/UICustomSingleControl/UICustomLineEdit.h
  function class (line 37) | class UICustomCloseButton : public CustomWidget

FILE: CustomControls/UICustomSingleControl/UICustomPostionWidget.cpp
  function QSize (line 37) | QSize UICustomPostionWidget::sizeHint() const
  function QPoint (line 74) | QPoint UICustomPostionWidget::transToThisPostion(void)
  function qreal (line 125) | qreal UICustomPostionWidget::getPostionXValue(void)
  function qreal (line 130) | qreal UICustomPostionWidget::getPostionYValue(void)

FILE: CustomControls/UICustomSingleControl/UICustomSwitchWidget.cpp
  function QSize (line 81) | QSize UICustomSwitchWidget::sizeHint() const

FILE: CustomControls/UICustomSingleControl/UICustomSwitchWidget.h
  function class (line 8) | class UICustomSwitchWidget : public CustomWidget

FILE: CustomControls/UICustomSingleControl/UICustomTextEdit.cpp
  function QSize (line 28) | QSize UICustomTextEdit::sizeHint(void) const

FILE: CustomControls/UICustomSingleControl/UICustomTimeEdit.h
  function class (line 7) | class UICustomTimeEdit : public QTimeEdit

FILE: CustomWidgets/UICustomCore/CustomStyleConfig.cpp
  function CustomStyleConfig (line 27) | CustomStyleConfig* CustomStyleConfig::getInstance(void)
  function QColor (line 73) | const QColor& CustomStyleConfig::getNormalBackgroundColor(void)
  function QColor (line 78) | const QColor& CustomStyleConfig::getNormalTextColor(void)
  function QColor (line 83) | const QColor& CustomStyleConfig::getHighLightColor(void)

FILE: CustomWidgets/UICustomWidgtes/CustomDialog.cpp
  function QMargins (line 160) | QMargins CustomDialog::contentsMargins() const
  function QRect (line 167) | QRect CustomDialog::contentsRect() const

FILE: CustomWidgets/UICustomWidgtes/CustomDialog.h
  function class (line 13) | class CustomDialogTitle : public QWidget
  function isResizeable (line 52) | bool isResizeable(){ return m_bResizeable; }

FILE: CustomWidgets/UICustomWidgtes/CustomMainWindow.h
  function class (line 5) | class CustomMainWindow : public QMainWindow

FILE: CustomWidgets/UICustomWidgtes/CustomTestWidget.h
  function class (line 8) | class CustomTestWidget : public CustomWidget

FILE: EasyCanvas/GlobalHotKey/GlobalHotKeyFilter.h
  function class (line 8) | class GlobalHotKeyFilter : public QAbstractNativeEventFilter

FILE: EasyCanvas/GlobalHotKey/GlobalHotKeyInfo.cpp
  function GlobalHotKeyInfo (line 5) | GlobalHotKeyInfo* GlobalHotKeyInfo::createInstance(Qt::KeyboardModifiers...

FILE: EasyCanvas/GlobalHotKey/GlobalHotKeyInfo.h
  function class (line 7) | class GlobalHotKeyInfo : public QObject
  function getId (line 26) | inline int getId(void) const{

FILE: EasyCanvas/GlobalHotKey/GlobalHotKeyManager.h
  function class (line 8) | class GlobalHotKeyManager : public QObject

FILE: EasyCanvas/UICore/MainWindow.cpp
  function QWidget (line 85) | QWidget* MainWindow::createScriptConsoleWidget(void)

FILE: EasyCanvas/UICore/MainWindow.h
  function class (line 13) | class MainWindow : public QMainWindow

FILE: EasyCanvas/UICore/UIAboutMeDialog.h
  function class (line 8) | class UIAboutMeDialog : public CustomDialog

FILE: EasyCanvas/UICore/UIAttributWidget.h
  function class (line 7) | class UIAttributeWidget : public QWidget

FILE: EasyCanvas/main.cpp
  function myMessageOutput (line 11) | void myMessageOutput(QtMsgType type, const QMessageLogContext& context, ...
  function main (line 42) | int main(int argc, char* argv[])

FILE: EasyCanvasCore/Scheme/CanvasSchemeManager.cpp
  function CanvasSchemeManager (line 7) | CanvasSchemeManager* CanvasSchemeManager::getInstance(void)
  function QString (line 40) | QString CanvasSchemeManager::getCurrentSchemeName(void)
  function QString (line 141) | QString CanvasSchemeManager::getSchemeName(int index)
  function foreach (line 158) | foreach(auto info, m_schemeInfos)
  function QImage (line 174) | QImage CanvasSchemeManager::converToSamllImage(const QImage& image)

FILE: EasyCanvasCore/Scheme/SQLCore.cpp
  function foreach (line 96) | foreach(const QString & nodeName, nodeNames)
  function QString (line 173) | QString SQLCore::getCurrentIndexCountString(void)

FILE: EasyCanvasCore/Scheme/SQLCore.h
  function class (line 11) | class SQLCore : public QObject

FILE: EasyCanvasCore/Scheme/SchemeDataInfo.h
  function class (line 9) | class SchemeDataInfo

FILE: EasyCanvasCore/Scheme/UISchemeManagerWidget.cpp
  function QString (line 38) | QString UISchemeManagerWidget::getCurrentSelectedSchemeName(void)
  function QVariant (line 65) | QVariant SchemeManagerModel::data(const QModelIndex &index, int role) const
  function QWidget (line 162) | QWidget *SchemeManagerDelegate::createEditor(QWidget *parent, const QSty...
  function QSize (line 200) | QSize SchemeManagerDelegate::sizeHint(const QStyleOptionViewItem &option...

FILE: EasyCanvasCore/Scheme/UISchemeManagerWidget.h
  function class (line 32) | class SchemeManagerModel : public QAbstractListModel
  function class (line 49) | class SchemeManagerDelegate : public QStyledItemDelegate

FILE: EasyCanvasCore/UICanvas/UICanvasAudioItem.h
  function class (line 10) | class UICanvasAudioItem : public UICanvasItemBase

FILE: EasyCanvasCore/UICanvas/UICanvasEllipseItem.h
  function class (line 10) | class UICanvasEllipseItem : public UICanvasItemBase

FILE: EasyCanvasCore/UICanvas/UICanvasImageItem.h
  function class (line 8) | class UICanvasImageItem : public UICanvasItemBase

FILE: EasyCanvasCore/UICanvas/UICanvasItemBase.cpp
  function NDNodeBase (line 55) | NDNodeBase* UICanvasItemBase::getCurrentNode(void) const
  function QRectF (line 66) | QRectF UICanvasItemBase::boundingRect() const
  function QPainterPath (line 129) | QPainterPath UICanvasItemBase::shape() const
  function QVariant (line 217) | QVariant UICanvasItemBase::itemChange(QGraphicsItem::GraphicsItemChange ...
  function QRectF (line 344) | QRectF UICanvasItemBase::getCustomRect(void) const
  function QJsonObject (line 440) | QJsonObject UICanvasItemBase::getStoreJson(int interval)

FILE: EasyCanvasCore/UICanvas/UICanvasItemBase.h
  type ItemOperator (line 20) | enum ItemOperator

FILE: EasyCanvasCore/UICanvas/UICanvasItemManager.cpp
  function QString (line 42) | QString UICanvasItemManager::getTypeName(CanvasItemType type)
  function QJsonObject (line 93) | QJsonObject UICanvasItemManager::getNodeStoreJson(NDNodeBase* pNode)
  function QIcon (line 160) | QIcon UICanvasItemManager::getTypeIcon(CanvasItemType type)
  function foreach (line 332) | foreach(const QString & nodeName, nodeNames)
  function QStringList (line 387) | QStringList UICanvasItemManager::getAllNodeNames(void)
  function NDNodeBase (line 392) | NDNodeBase* UICanvasItemManager::getNode(const QString& name)
  function QString (line 423) | QString UICanvasItemManager::getNodeTypeDisplayName(CanvasItemType type)
  function QIcon (line 428) | QIcon UICanvasItemManager::getNodeTypeDisplayIcon(CanvasItemType type)
  function UICanvasItemManager (line 437) | UICanvasItemManager* UICanvasItemManager::getCurrentCanvasManager(void)
  function UICanvasView (line 465) | UICanvasView* UICanvasItemManager::getCurrentCanvasView(void)
  function foreach (line 518) | foreach(const QString & nodeName, nodeNames)
  function QStringList (line 528) | QStringList UICanvasItemManager::getSelectedNodes(void)
  function UndoCmdCore (line 601) | UndoCmdCore* UICanvasItemManager::getCurrentUndoCmdCore(void)

FILE: EasyCanvasCore/UICanvas/UICanvasItemManager.h
  type CanvasItemType (line 25) | enum CanvasItemType
  type TypeNodeInfo (line 39) | struct TypeNodeInfo

FILE: EasyCanvasCore/UICanvas/UICanvasOperators.cpp
  function foreach (line 73) | foreach (auto item, items)
  function foreach (line 332) | foreach (auto item, m_items)
  function foreach (line 359) | foreach (auto item, m_items)

FILE: EasyCanvasCore/UICanvas/UICanvasOperators.h
  function class (line 10) | class UICanvasOperBase
  function class (line 27) | class UICanvasDefaultOper : public UICanvasOperBase
  function class (line 42) | class UICanvasPenOper : public UICanvasOperBase
  function class (line 58) | class UICanvasRectSelectOper : public UICanvasOperBase
  function class (line 75) | class UICanvasMoveSelectedItem : public UICanvasOperBase
  function class (line 100) | class UICanvasDeleteOperator : public UICanvasOperBase

FILE: EasyCanvasCore/UICanvas/UICanvasPathItem.cpp
  function QJsonObject (line 100) | QJsonObject UICanvasPathItem::getStoreJson(int interval)

FILE: EasyCanvasCore/UICanvas/UICanvasPathItem.h
  function class (line 10) | class UICanvasPathItem : public UICanvasItemBase

FILE: EasyCanvasCore/UICanvas/UICanvasRectItem.h
  function class (line 8) | class UICanvasRectItem : public UICanvasItemBase

FILE: EasyCanvasCore/UICanvas/UICanvasScene.cpp
  function NDNodeBase (line 70) | NDNodeBase* UICanvasScene::getCurrentNode(void)

FILE: EasyCanvasCore/UICanvas/UICanvasScene.h
  function class (line 8) | class UICanvasScene : public QGraphicsScene

FILE: EasyCanvasCore/UICanvas/UICanvasTextItem.h
  function class (line 14) | class UICanvasTextItem : public UICanvasItemBase

FILE: EasyCanvasCore/UICanvas/UICanvasView.cpp
  function NDNodeBase (line 161) | NDNodeBase* UICanvasView::getCurrentSelectedNode(void)
  function NDNodeBase (line 206) | NDNodeBase* UICanvasView::getCurrentSceneNode(void)
  function QPointF (line 216) | QPointF UICanvasView::getCenterPos(void)
  function foreach (line 271) | foreach(auto item, items)

FILE: EasyCanvasCore/UICanvas/UICanvasView.h
  type CanvasMode (line 19) | enum CanvasMode

FILE: EasyCanvasCore/UINodeTree/UINodeItem.cpp
  function UINodeItem (line 39) | UINodeItem* UINodeItem::getChildNode(int index)
  function UINodeItem (line 47) | UINodeItem* UINodeItem::getChildNode(const QString& nodeName)
  function UINodeItem (line 65) | UINodeItem* UINodeItem::getParentNode(void)
  function QString (line 76) | QString UINodeItem::getName(void)

FILE: EasyCanvasCore/UINodeTree/UINodeItem.h
  function class (line 8) | class UINodeItem : public QObject

FILE: EasyCanvasCore/UINodeTree/UINodeSortFilterProxyModel.h
  function class (line 7) | class UINodeSortFilterProxyModel : public QSortFilterProxyModel

FILE: EasyCanvasCore/UINodeTree/UINodeTreeDelegate.cpp
  function QWidget (line 22) | QWidget *UINodeTreeDelegate::createEditor(QWidget *parent, const QStyleO...
  function QSize (line 65) | QSize UINodeTreeDelegate::sizeHint(const QStyleOptionViewItem &option, c...

FILE: EasyCanvasCore/UINodeTree/UINodeTreeDelegate.h
  function class (line 7) | class UINodeTreeDelegate : public QStyledItemDelegate

FILE: EasyCanvasCore/UINodeTree/UINodeTreeView.cpp
  function foreach (line 75) | foreach(NDNodeBase* pNode ,nodes)

FILE: EasyCanvasCore/UINodeTree/UINodeTreeViewModel.cpp
  function QModelIndex (line 23) | QModelIndex UINodeTreeViewModel::index(int row, int column, const QModel...
  function QModelIndex (line 48) | QModelIndex UINodeTreeViewModel::parent(const QModelIndex &child) const
  function QVariant (line 80) | QVariant UINodeTreeViewModel::data(const QModelIndex &index, int role) c...
  function QModelIndex (line 138) | QModelIndex UINodeTreeViewModel::getIndexByName(const QString nodeName)

FILE: EasyCanvasCore/UINodeTree/UINodeTreeViewModel.h
  function class (line 10) | class UINodeTreeViewModel : public QAbstractItemModel

FILE: EasyCanvasCore/UndoCmd/ItemAttributeChangedCmd.h
  function class (line 11) | class ItemAttributeChangedCmd : public QUndoCommand

FILE: EasyCanvasCore/UndoCmd/ItemChangeNameCmd.h
  function class (line 8) | class ItemChangeNameCmd : public QUndoCommand

FILE: EasyCanvasCore/UndoCmd/ItemCreateCmd.h
  function class (line 8) | class ItemCreateCmd : public QUndoCommand

FILE: EasyCanvasCore/UndoCmd/ItemDeleteCmd.cpp
  function foreach (line 26) | foreach (auto canvasItem, m_pCanvasItems)
  function foreach (line 38) | foreach (auto canvasItem, m_pCanvasItems)

FILE: EasyCanvasCore/UndoCmd/ItemDeleteCmd.h
  function class (line 8) | class ItemDeleteCmd : public QUndoCommand

FILE: EasyCanvasCore/UndoCmd/ItemPasteCmd.h
  function class (line 8) | class ItemPasteCmd : public QUndoCommand

FILE: EasyCanvasCore/UndoCmd/UndoCmdCore.cpp
  function foreach (line 33) | foreach (const QString& nodeName, nodeNames)
  function QAction (line 105) | QAction* UndoCmdCore::createRedoAction(void)
  function QAction (line 110) | QAction* UndoCmdCore::createUndoAction(void)
  function QUndoView (line 115) | QUndoView* UndoCmdCore::createUndoView(void)

FILE: EasyCanvasCore/UndoCmd/UndoCmdCore.h
  type UndoCmdType (line 15) | enum UndoCmdType

FILE: NDNodeAttribute/NDAttributeBase.cpp
  function QString (line 32) | QString NDAttributeBase::getName(void)
  function QString (line 43) | QString NDAttributeBase::getDisplayName(void)
  function QString (line 48) | QString NDAttributeBase::getFullName(void)
  function NDAttributeGroup (line 66) | NDAttributeGroup* NDAttributeBase::getParentGroup(void)
  function NDNodeBase (line 77) | NDNodeBase* NDAttributeBase::getParentNode(void)
  function NDAttributeBase (line 97) | NDAttributeBase* NDAttributeBase::createAttribute(const QString& name, A...
  function QVariant (line 142) | QVariant NDAttributeBase::getLastValue(void)
  function QString (line 147) | QString NDAttributeBase::getTypeName(void)
  function QVariant (line 196) | QVariant NDAttributeBase::getValue(void)

FILE: NDNodeAttribute/NDAttributeBase.h
  type AttributeType (line 14) | enum AttributeType

FILE: NDNodeAttribute/NDAttributeData.h
  function class (line 10) | class NDAttributeData

FILE: NDNodeAttribute/NDAttributeGroup.cpp
  function NDAttributeBase (line 45) | NDAttributeBase* NDAttributeGroup::getAttribute(const QString& name)
  function NDNodeBase (line 61) | NDNodeBase* NDAttributeGroup::getParentNode(void)
  function QString (line 72) | QString NDAttributeGroup::getName(void)
  function QString (line 82) | QString NDAttributeGroup::getDisplayName(void)

FILE: NDNodeAttribute/NDBoolAttribute.h
  function AttributeType (line 14) | AttributeType Type(void) const override{

FILE: NDNodeAttribute/NDColorAttribute.h
  function AttributeType (line 15) | AttributeType Type(void) const override{

FILE: NDNodeAttribute/NDIntAttribute.h
  function AttributeType (line 14) | AttributeType Type(void) const{

FILE: NDNodeAttribute/NDNodeBase.cpp
  function foreach (line 49) | foreach(auto item, m_groupList)
  function foreach (line 84) | foreach (auto item, m_groupList)
  function NDAttributeBase (line 98) | NDAttributeBase* NDNodeBase::getAttribute(const QString& attrName)
  function QString (line 117) | QString NDNodeBase::getNodeName(void)
  function NDAttributeGroup (line 136) | NDAttributeGroup* NDNodeBase::addAttributeGroup(const QString& name)
  function NDAttributeGroup (line 146) | NDAttributeGroup* NDNodeBase::addAttributeGroup(const QString& name, con...

FILE: NDNodeAttribute/NDNodeBase.h
  type NodeType (line 13) | enum NodeType

FILE: NDNodeAttribute/NDNodeManager.cpp
  function NDNodeManager (line 16) | NDNodeManager* NDNodeManager::getInstance(void)

FILE: NDNodeAttribute/NDPostionAttribute.cpp
  function QPoint (line 28) | QPoint NDPostionAttribute::getCurrentValue(void)

FILE: NDNodeAttribute/NDPostionAttribute.h
  function class (line 6) | class NDPostionAttribute : public NDAttributeBase

FILE: NDNodeAttribute/NDRealAttribute.h
  function AttributeType (line 15) | AttributeType Type(void) const override{

FILE: NDNodeAttribute/NDStringAttribute.cpp
  function QString (line 32) | QString NDStringAttribute::getButtonString(void)

FILE: NDNodeAttribute/NDStringAttribute.h
  function AttributeType (line 15) | AttributeType Type(void) const override{

FILE: NDNodeAttribute/NDTextNode.cpp
  function NDRealAttribute (line 55) | NDRealAttribute* NDTextNode::getXPostionAttr(void)
  function NDRealAttribute (line 60) | NDRealAttribute* NDTextNode::getYPostionAttr(void)
  function NDStringAttribute (line 65) | NDStringAttribute* NDTextNode::getTextAttr(void)
  function NDColorAttribute (line 70) | NDColorAttribute* NDTextNode::getTextColorAttr(void)

FILE: NDNodeAttribute/NDTextNode.h
  function class (line 15) | class NDTextNode : public NDNodeBase

FILE: NodeAttributeControl/UIAttrColorControl.h
  function class (line 8) | class UIAttrColorControl : public UICustomColorControl

FILE: NodeAttributeControl/UIAttrFloatControl.h
  function class (line 8) | class UIAttrFloatControl : public UICustomDoubleControl

FILE: NodeAttributeControl/UIAttrIntControl.h
  function class (line 7) | class UIAttrIntControl : public UICustomIntControl

FILE: NodeAttributeControl/UIAttrTextControl.h
  function class (line 8) | class UIAttrTextControl : public UICustomLineEditControl

FILE: NodeAttributeControl/UINodeAttrControl.cpp
  function QWidget (line 23) | QWidget* UINodeAttrControl::createNodeWidget(NDNodeBase* node)
  function QWidget (line 51) | QWidget* UINodeAttrControl::createAttributeControl(NDAttributeBase* attr...
  function QWidget (line 86) | QWidget* UINodeAttrControl::createAttributeGroupControl(NDAttributeGroup...

FILE: PythonWrap/PythonWrapCore.cpp
  function PythonWrapCore (line 31) | PythonWrapCore* PythonWrapCore::getInstace(void)
  function QString (line 97) | QString PythonWrapCore::createNode(const QString& typeName)
  function QStringList (line 138) | QStringList PythonWrapCore::getAllNodes(void)
  function QStringList (line 143) | QStringList PythonWrapCore::getSelectedNodes(void)
  function QString (line 148) | QString PythonWrapCore::getNodeType(const QString& nodeName)
  function QStringList (line 160) | QStringList PythonWrapCore::getAttributeNames(const QString& nodeName)
  function Q_INVOKABLE (line 185) | Q_INVOKABLE QVariant PythonWrapCore::getValue(const QString& attributeName)
  function QString (line 229) | QString PythonWrapCore::getAttributeType(const QString& attributeName)
  function QWidget (line 278) | QWidget* PythonWrapCore::getScriptConsole(void)
  function NDAttributeBase (line 310) | NDAttributeBase* PythonWrapCore::getAttributeByName(NDNodeBase* node, co...

FILE: PythonWrap/pythonwrap.h
  function class (line 5) | class PYTHONWRAPSHARED_EXPORT PythonWrap

FILE: Utils/RALLBlockSignal.h
  function class (line 7) | class UTILSSHARED_EXPORT RALLBlockSingal

FILE: Utils/Utils.cpp
  function Utils (line 13) | Utils* Utils::getInstance(void)
  function qreal (line 20) | qreal Utils::getDistance(const QPointF& p1, const QPointF& p2)

FILE: Utils/Utils.h
  function class (line 10) | class UTILSSHARED_EXPORT Utils

FILE: bin/Script/SetColorAlphaScript.py
  function onClickedLoadButton (line 46) | def onClickedLoadButton():
  function onMClickedOKButton (line 59) | def onMClickedOKButton():
  function onSliderChanged (line 70) | def onSliderChanged(value):
  function onComboBoxIndexChanged (line 74) | def onComboBoxIndexChanged(str):

FILE: thirdLibs/PythonQt/include/PythonQt.h
  type QString (line 77) | typedef QString PythonQtQObjectMissingAttributeCB(QObject* object, const...
  type QObject (line 144) | typedef QObject* PythonQtQObjectCreatorFunctionCB();
  type InitFlags (line 176) | enum InitFlags {
  type TypeSlots (line 184) | enum TypeSlots {
  type ProfilingCallbackState (line 218) | enum ProfilingCallbackState {
  type ObjectType (line 245) | enum ObjectType {
  function installDefaultImporter (line 537) | void installDefaultImporter() { setImporter(NULL); }
  function PythonQtPrivate (line 555) | static PythonQtPrivate* priv() { return _self->_p; }
  function hadError (line 566) | bool hadError()const;

FILE: thirdLibs/PythonQt/include/PythonQtBoolResult.h
  type PythonQtBoolResultObject (line 54) | typedef struct {

FILE: thirdLibs/PythonQt/include/PythonQtClassInfo.h
  type PythonQtDynamicClassInfo (line 47) | struct PythonQtDynamicClassInfo
  function typeSlots (line 56) | struct PythonQtMemberInfo {
  function QMetaObject (line 142) | const QMetaObject* metaObject() { return _meta; }
  function metaTypeId (line 168) | int metaTypeId() { return _metaTypeId; }
  function addParentClass (line 177) | void addParentClass(const ParentClassInfo& info) { _parentClasses.append...
  function setPythonQtClassWrapper (line 180) | void setPythonQtClassWrapper(PyObject* obj) { _pythonQtClassWrapper = ob...
  function PyObject (line 183) | PyObject* pythonQtClassWrapper() { return _pythonQtClassWrapper; }
  function setShellSetInstanceWrapperCB (line 186) | void setShellSetInstanceWrapperCB(PythonQtShellSetInstanceWrapperCB* cb) {
  function PythonQtShellSetInstanceWrapperCB (line 191) | PythonQtShellSetInstanceWrapperCB* shellSetInstanceWrapperCB() {
  function addPolymorphicHandler (line 196) | void addPolymorphicHandler(PythonQtPolymorphicHandlerCB* cb) { _polymorp...
  function QList (line 208) | const QList<PythonQtClassInfo*>& nestedClasses() { return _nestedClasses; }

FILE: thirdLibs/PythonQt/include/PythonQtClassWrapper.h
  type PythonQtDynamicClassInfo (line 60) | struct PythonQtDynamicClassInfo
  type PythonQtDynamicClassInfo (line 66) | typedef struct {

FILE: thirdLibs/PythonQt/include/PythonQtConversion.h
  type PyObject (line 54) | typedef PyObject* PythonQtConvertMetaTypeToPythonCB(const void* inObject...
  type QVariant (line 56) | typedef QVariant PythonQtConvertPythonSequenceToQVariantListCB(PyObject*...
  function class (line 101) | class PYTHONQT_EXPORT PythonQtConv {
  type QPair (line 407) | typedef const QPair<T1, T2> Pair;

FILE: thirdLibs/PythonQt/include/PythonQtCppWrapperFactory.h
  function class (line 56) | class PYTHONQT_EXPORT PythonQtCppWrapperFactory
  function class (line 69) | class PYTHONQT_EXPORT PythonQtForeignWrapperFactory

FILE: thirdLibs/PythonQt/include/PythonQtImportFileInterface.h
  function class (line 52) | class PythonQtImportFileInterface {

FILE: thirdLibs/PythonQt/include/PythonQtImporter.h
  type PythonQtImporter (line 58) | typedef struct _PythonQtImporter {
  function class (line 67) | class PythonQtImport

FILE: thirdLibs/PythonQt/include/PythonQtInstanceWrapper.h
  type inline (line 63) | typedef struct PythonQtInstanceWrapperStruct {
  function PythonQtDynamicClassInfo (line 70) | PythonQtDynamicClassInfo* dynamicClassInfo()
  function setQObject (line 74) | void setQObject(QObject* object) {
  function passOwnershipToCPP (line 80) | void passOwnershipToCPP() {
  function passOwnershipToPython (line 95) | void passOwnershipToPython() {

FILE: thirdLibs/PythonQt/include/PythonQtMethodInfo.h
  type _object (line 54) | struct _object
  type PyObject (line 55) | typedef struct _object PyObject;
  function class (line 58) | class PYTHONQT_EXPORT PythonQtMethodInfo
  type Type (line 155) | enum Type {
  function QMetaMethod (line 190) | const QMetaMethod* metaMethod() const { return &_meta; }
  function setUpcastingOffset (line 192) | void setUpcastingOffset(int upcastingOffset) { _upcastingOffset = upcast...
  function PythonQtSlotInfo (line 200) | PythonQtSlotInfo* nextInfo()  const { return _next; }
  function setNextInfo (line 203) | void setNextInfo(PythonQtSlotInfo* next) { _next = next; }
  function QObject (line 211) | QObject* decorator() const { return _decorator; }

FILE: thirdLibs/PythonQt/include/PythonQtMisc.h
  function class (line 78) | class PythonQtArgumentFrame {

FILE: thirdLibs/PythonQt/include/PythonQtObjectPtr.h
  function class (line 56) | class PYTHONQT_EXPORT PythonQtObjectPtr
  function class (line 197) | class PYTHONQT_EXPORT PythonQtSafeObjectPtr
  function operator (line 265) | bool operator!= (const PythonQtSafeObjectPtr& p) const {
  function operator (line 273) | bool operator!= (PyObject* p) const {

FILE: thirdLibs/PythonQt/include/PythonQtProperty.h
  type PythonQtPropertyData (line 46) | struct PythonQtPropertyData
  type PythonQtProperty (line 91) | typedef struct {

FILE: thirdLibs/PythonQt/include/PythonQtQFileImporter.h
  function class (line 49) | class PythonQtQFileImporter : public PythonQtImportFileInterface {

FILE: thirdLibs/PythonQt/include/PythonQtSignal.h
  type PythonQtDynamicSignalInfo (line 59) | struct PythonQtDynamicSignalInfo
  type PythonQtSignalFunctionObject (line 66) | typedef struct {

FILE: thirdLibs/PythonQt/include/PythonQtSignalReceiver.h
  function class (line 56) | class PYTHONQT_EXPORT PythonQtSignalTarget {
  function PythonQtMethodInfo (line 82) | const PythonQtMethodInfo* methodInfo()  const { return _methodInfo; }
  function class (line 103) | class PythonQtSignalReceiverBase : public QObject {
  function class (line 112) | class PythonQtSignalReceiver : public PythonQtSignalReceiverBase {

FILE: thirdLibs/PythonQt/include/PythonQtSlot.h
  type PythonQtPassThisOwnershipType (line 52) | enum PythonQtPassThisOwnershipType
  type PythonQtSlotFunctionObject (line 84) | typedef struct {

FILE: thirdLibs/PythonQt/include/PythonQtSlotDecorator.h
  type PythonQtSlotDecorator (line 46) | typedef struct {

FILE: thirdLibs/PythonQt/include/PythonQtStdDecorators.h
  function static_QObject_connect (line 70) | bool static_QObject_connect(QObject* sender, const QByteArray& signal, P...
  function static_QObject_disconnect (line 75) | bool static_QObject_disconnect(QObject* sender, const QByteArray& signal...
  function static_Qt_qAbs (line 90) | double static_Qt_qAbs(double a) { return qAbs(a); }
  function static_Qt_qBound (line 91) | double static_Qt_qBound(double a,double b,double c) { return qBound(a,b,...
  function static_Qt_qDebug (line 92) | void static_Qt_qDebug(const QByteArray& msg) { qDebug("%s", msg.constDat...
  function static_Qt_qWarning (line 94) | void static_Qt_qWarning(const QByteArray& msg) { qWarning("%s", msg.cons...
  function static_Qt_qCritical (line 96) | void static_Qt_qCritical(const QByteArray& msg) { qCritical("%s", msg.co...
  function static_Qt_qFatal (line 98) | void static_Qt_qFatal(const QByteArray& msg) { qFatal("%s", msg.constDat...
  function static_Qt_qFuzzyCompare (line 100) | bool static_Qt_qFuzzyCompare(double a, double b) { return qFuzzyCompare(...
  function static_Qt_qMax (line 101) | double static_Qt_qMax(double a, double b) { return qMax(a, b); }
  function static_Qt_qMin (line 102) | double static_Qt_qMin(double a, double b) { return qMin(a, b); }
  function static_Qt_qRound (line 103) | int static_Qt_qRound(double a) { return qRound(a); }
  function qint64 (line 104) | qint64 static_Qt_qRound64(double a) { return qRound64(a); }
  function static_Qt_qrand (line 106) | int static_Qt_qrand() { return qrand(); }
  function static_Qt_qsrand (line 107) | void static_Qt_qsrand(uint a) { qsrand(a); }
  function QString (line 111) | QString static_Qt_SIGNAL(const QString& s) { return QString("2") + s; }
  function QString (line 112) | QString static_Qt_SLOT(const QString& s) { return QString("1") + s; }
  function class (line 122) | class PythonQtSingleShotTimer : public QTimer
  function class (line 135) | class PythonQtWrapper_QMetaObject : public QObject
  function Q_OBJECT (line 179) | Q_OBJECT

FILE: thirdLibs/PythonQt/include/PythonQtStdIn.h
  type QString (line 54) | typedef QString PythonQtInputChangedCB(void* callData);
  type PythonQtStdInRedirect (line 57) | typedef struct {

FILE: thirdLibs/PythonQt/include/PythonQtStdOut.h
  type PythonQtStdOutRedirect (line 58) | typedef struct {

FILE: thirdLibs/PythonQt/include/PythonQtThreadSupport.h
  function class (line 60) | class PYTHONQT_EXPORT PythonQtGILScope
  function class (line 88) | class PythonQtGILScope
  function class (line 104) | class PythonQtThreadStateSaver
  function class (line 135) | class PythonQtThreadStateSaver

FILE: thirdLibs/PythonQt/include/PythonQtUtils.h
  function namespace (line 51) | namespace PythonQtUtils

FILE: thirdLibs/PythonQt/include/PythonQt_QtAll.h
  function namespace (line 46) | namespace PythonQt_QtAll

FILE: thirdLibs/PythonQt/include/gui/PythonQtScriptingConsole.h
  function QStringList (line 73) | QStringList history() { return _history; }
  function setHistory (line 76) | void setHistory(const QStringList& h) { _history = h; _historyPosition =...
  function clearError (line 99) | void clearError() {

FILE: thirdLibs/ffmpeg/include/libavcodec/avcodec.h
  type AVCodecID (line 215) | enum AVCodecID {
  type AVCodecDescriptor (line 716) | typedef struct AVCodecDescriptor {
  type AVDiscard (line 802) | enum AVDiscard{
  type AVAudioServiceType (line 814) | enum AVAudioServiceType {
  type RcOverride (line 830) | typedef struct RcOverride{
  type AVPanScan (line 1099) | typedef struct AVPanScan {
  type AVCPBProperties (line 1128) | typedef struct AVCPBProperties {
  type AVPacketSideDataType (line 1184) | enum AVPacketSideDataType {
  type AVPacketSideData (line 1420) | typedef struct AVPacketSideData {
  type AVPacket (line 1454) | typedef struct AVPacket {
  type AVSideDataParamChangeFlags (line 1531) | enum AVSideDataParamChangeFlags {
  type AVCodecInternal (line 1541) | struct AVCodecInternal
  type AVFieldOrder (line 1543) | enum AVFieldOrder {
  type AVCodecContext (line 1565) | typedef struct AVCodecContext {
  type AVProfile (line 3414) | typedef struct AVProfile {
  type AVCodecHWConfig (line 3455) | typedef struct AVCodecHWConfig {
  type AVCodecDefault (line 3474) | typedef struct AVCodecDefault AVCodecDefault;
  type AVSubtitle (line 3476) | struct AVSubtitle
  type AVCodec (line 3481) | typedef struct AVCodec {
  type MpegEncContext (line 3630) | struct MpegEncContext
  type AVHWAccel (line 3649) | typedef struct AVHWAccel {
  type AVPicture (line 3866) | typedef struct AVPicture {
  type AVSubtitleType (line 3878) | enum AVSubtitleType {
  type AVSubtitleRect (line 3898) | typedef struct AVSubtitleRect {
  type AVSubtitle (line 3933) | typedef struct AVSubtitle {
  type AVCodecParameters (line 3949) | typedef struct AVCodecParameters {
  type AVPacketSideDataType (line 4483) | enum AVPacketSideDataType
  type AVPacketSideDataType (line 4499) | enum AVPacketSideDataType
  type AVPacketSideDataType (line 4510) | enum AVPacketSideDataType
  type AVPacketSideDataType (line 4521) | enum AVPacketSideDataType
  type AVPacketSideDataType (line 4532) | enum AVPacketSideDataType
  type AVCodecID (line 4667) | enum AVCodecID
  type AVChromaLocation (line 4712) | enum AVChromaLocation
  type AVChromaLocation (line 4723) | enum AVChromaLocation
  type AVPixelFormat (line 5091) | enum AVPixelFormat
  type AVPictureStructure (line 5101) | enum AVPictureStructure {
  type AVCodecParserContext (line 5108) | typedef struct AVCodecParserContext {
  type AVCodecParser (line 5275) | typedef struct AVCodecParser {
  type AVCodecID (line 5372) | enum AVCodecID
  type AVPixelFormat (line 5483) | enum AVPixelFormat
  type AVPixelFormat (line 5496) | enum AVPixelFormat
  type AVPixelFormat (line 5502) | enum AVPixelFormat
  type AVPixelFormat (line 5510) | enum AVPixelFormat
  type AVPixelFormat (line 5517) | enum AVPixelFormat
  type AVPixelFormat (line 5524) | enum AVPixelFormat
  type AVPixelFormat (line 5530) | enum AVPixelFormat
  type AVPixelFormat (line 5560) | enum AVPixelFormat
  type AVPixelFormat (line 5568) | enum AVPixelFormat
  type AVPixelFormat (line 5573) | enum AVPixelFormat
  type AVPixelFormat (line 5573) | enum AVPixelFormat
  type AVPixelFormat (line 5593) | enum AVPixelFormat
  type AVPixelFormat (line 5593) | enum AVPixelFormat
  type AVPixelFormat (line 5594) | enum AVPixelFormat
  type AVPixelFormat (line 5600) | enum AVPixelFormat
  type AVPixelFormat (line 5600) | enum AVPixelFormat
  type AVPixelFormat (line 5600) | enum AVPixelFormat
  type AVPixelFormat (line 5601) | enum AVPixelFormat
  type AVPixelFormat (line 5604) | enum AVPixelFormat
  type AVPixelFormat (line 5604) | enum AVPixelFormat
  type AVPixelFormat (line 5605) | enum AVPixelFormat
  type AVPixelFormat (line 5607) | enum AVPixelFormat
  type AVCodecContext (line 5607) | struct AVCodecContext
  type AVPixelFormat (line 5607) | enum AVPixelFormat
  type AVCodecID (line 5651) | enum AVCodecID
  type AVSampleFormat (line 5681) | enum AVSampleFormat
  type AVCodecID (line 5701) | enum AVCodecID
  type AVCodecID (line 5709) | enum AVCodecID
  type AVSampleFormat (line 5709) | enum AVSampleFormat
  type AVCodecID (line 5719) | enum AVCodecID
  type AVBitStreamFilterContext (line 5738) | typedef struct AVBitStreamFilterContext {
  type AVBSFInternal (line 5751) | typedef struct AVBSFInternal AVBSFInternal;
  type AVBSFContext (line 5763) | typedef struct AVBSFContext {
  type AVBitStreamFilter (line 5812) | typedef struct AVBitStreamFilter {
  type AVBSFList (line 5995) | typedef struct AVBSFList AVBSFList;
  type AVLockOp (line 6129) | enum AVLockOp {
  type AVLockOp (line 6163) | enum AVLockOp
  type AVMediaType (line 6169) | enum AVMediaType
  type AVCodecID (line 6169) | enum AVCodecID
  type AVCodecID (line 6175) | enum AVCodecID
  type AVCodecID (line 6196) | enum AVCodecID

FILE: thirdLibs/ffmpeg/include/libavcodec/avdct.h
  type AVDCT (line 29) | typedef struct AVDCT {

FILE: thirdLibs/ffmpeg/include/libavcodec/avfft.h
  type FFTSample (line 35) | typedef float FFTSample;
  type FFTComplex (line 37) | typedef struct FFTComplex {
  type FFTContext (line 41) | typedef struct FFTContext FFTContext;
  type RDFTransformType (line 71) | enum RDFTransformType {
  type RDFTContext (line 78) | typedef struct RDFTContext RDFTContext;
  type RDFTransformType (line 85) | enum RDFTransformType
  type DCTContext (line 91) | typedef struct DCTContext DCTContext;
  type DCTTransformType (line 93) | enum DCTTransformType {
  type DCTTransformType (line 110) | enum DCTTransformType

FILE: thirdLibs/ffmpeg/include/libavcodec/d3d11va.h
  type AVD3D11VAContext (line 59) | typedef struct AVD3D11VAContext {

FILE: thirdLibs/ffmpeg/include/libavcodec/dirac.h
  type DiracParseCodes (line 57) | enum DiracParseCodes {
  type DiracVersionInfo (line 76) | typedef struct DiracVersionInfo {
  type AVDiracSeqHeader (line 81) | typedef struct AVDiracSeqHeader {

FILE: thirdLibs/ffmpeg/include/libavcodec/dv_profile.h
  type AVDVProfile (line 39) | typedef struct AVDVProfile {
  type AVPixelFormat (line 75) | enum AVPixelFormat
  type AVPixelFormat (line 81) | enum AVPixelFormat

FILE: thirdLibs/ffmpeg/include/libavcodec/dxva2.h
  type dxva_context (line 57) | struct dxva_context {

FILE: thirdLibs/ffmpeg/include/libavcodec/mediacodec.h
  type AVMediaCodecContext (line 33) | typedef struct AVMediaCodecContext {
  type AVMediaCodecBuffer (line 73) | typedef struct MediaCodecBuffer AVMediaCodecBuffer;

FILE: thirdLibs/ffmpeg/include/libavcodec/qsv.h
  type AVQSVContext (line 36) | typedef struct AVQSVContext {

FILE: thirdLibs/ffmpeg/include/libavcodec/vaapi.h
  function vaapi_context (line 56) | struct attribute_deprecated vaapi_context {

FILE: thirdLibs/ffmpeg/include/libavcodec/vdpau.h
  type AVCodecContext (line 60) | struct AVCodecContext
  type AVFrame (line 61) | struct AVFrame
  type AVCodecContext (line 63) | struct AVCodecContext
  type AVFrame (line 63) | struct AVFrame
  type AVVDPAUContext (line 81) | typedef struct AVVDPAUContext {

FILE: thirdLibs/ffmpeg/include/libavcodec/videotoolbox.h
  type AVVideotoolboxContext (line 46) | typedef struct AVVideotoolboxContext {

FILE: thirdLibs/ffmpeg/include/libavcodec/vorbis_parser.h
  type AVVorbisParseContext (line 31) | typedef struct AVVorbisParseContext AVVorbisParseContext;

FILE: thirdLibs/ffmpeg/include/libavcodec/xvmc.h
  function xvmc_pix_fmt (line 46) | struct attribute_deprecated xvmc_pix_fmt {

FILE: thirdLibs/ffmpeg/include/libavdevice/avdevice.h
  type AVDeviceRect (line 109) | typedef struct AVDeviceRect {
  type AVAppToDevMessageType (line 119) | enum AVAppToDevMessageType {
  type AVDevToAppMessageType (line 198) | enum AVDevToAppMessageType {
  type AVFormatContext (line 306) | struct AVFormatContext
  type AVAppToDevMessageType (line 307) | enum AVAppToDevMessageType
  type AVFormatContext (line 320) | struct AVFormatContext
  type AVDevToAppMessageType (line 321) | enum AVDevToAppMessageType
  type AVDeviceCapabilitiesQuery (line 400) | typedef struct AVDeviceCapabilitiesQuery {
  type AVDeviceInfo (line 452) | typedef struct AVDeviceInfo {
  type AVDeviceInfoList (line 460) | typedef struct AVDeviceInfoList {
  type AVFormatContext (line 479) | struct AVFormatContext
  type AVInputFormat (line 505) | struct AVInputFormat
  type AVOutputFormat (line 507) | struct AVOutputFormat

FILE: thirdLibs/ffmpeg/include/libavfilter/avfilter.h
  type AVFilterContext (line 67) | typedef struct AVFilterContext AVFilterContext;
  type AVFilterLink (line 68) | typedef struct AVFilterLink    AVFilterLink;
  type AVFilterPad (line 69) | typedef struct AVFilterPad     AVFilterPad;
  type AVFilterFormats (line 70) | typedef struct AVFilterFormats AVFilterFormats;
  type AVMediaType (line 98) | enum AVMediaType
  type AVFilter (line 144) | typedef struct AVFilter {
  type AVFilterInternal (line 335) | typedef struct AVFilterInternal AVFilterInternal;
  type AVFilterContext (line 338) | struct AVFilterContext {
  type AVFilterLink (line 439) | struct AVFilterLink {
  type AVFilterGraphInternal (line 809) | typedef struct AVFilterGraphInternal AVFilterGraphInternal;
  type AVFilterGraph (line 840) | typedef struct AVFilterGraph {
  type AVFilterInOut (line 1003) | typedef struct AVFilterInOut {

FILE: thirdLibs/ffmpeg/include/libavfilter/buffersink.h
  type AVBufferSinkParams (line 65) | typedef struct AVBufferSinkParams {
  type AVABufferSinkParams (line 79) | typedef struct AVABufferSinkParams {
  type AVMediaType (line 109) | enum AVMediaType

FILE: thirdLibs/ffmpeg/include/libavfilter/buffersrc.h
  type AVBufferSrcParameters (line 73) | typedef struct AVBufferSrcParameters {

FILE: thirdLibs/ffmpeg/include/libavformat/avformat.h
  type AVFormatContext (line 324) | struct AVFormatContext
  type AVDeviceInfoList (line 326) | struct AVDeviceInfoList
  type AVDeviceCapabilitiesQuery (line 327) | struct AVDeviceCapabilitiesQuery
  type AVCodecTag (line 441) | struct AVCodecTag
  type AVProbeData (line 446) | typedef struct AVProbeData {
  type AVOutputFormat (line 495) | typedef struct AVOutputFormat {
  type AVInputFormat (line 640) | typedef struct AVInputFormat {
  type AVStreamParseType (line 789) | enum AVStreamParseType {
  type AVIndexEntry (line 800) | typedef struct AVIndexEntry {
  type AVStreamInternal (line 847) | typedef struct AVStreamInternal AVStreamInternal;
  type AVStream (line 872) | typedef struct AVStream {
  type AVCodecParserContext (line 1249) | struct AVCodecParserContext
  type AVProgram (line 1266) | typedef struct AVProgram {
  type AVChapter (line 1301) | typedef struct AVChapter {
  type AVFormatContext (line 1312) | struct AVFormatContext
  type AVFormatContext (line 1315) | struct AVFormatContext
  type AVDurationEstimationMethod (line 1322) | enum AVDurationEstimationMethod {
  type AVFormatInternal (line 1328) | typedef struct AVFormatInternal AVFormatInternal;
  type AVFormatContext (line 1344) | typedef struct AVFormatContext {
  type AVDurationEstimationMethod (line 2008) | enum AVDurationEstimationMethod
  type AVPacketList (line 2010) | typedef struct AVPacketList {
  type AVPacketSideDataType (line 2174) | enum AVPacketSideDataType
  type AVPacketSideDataType (line 2186) | enum AVPacketSideDataType
  type AVPacketSideDataType (line 2196) | enum AVPacketSideDataType
  type AVMediaType (line 2379) | enum AVMediaType
  type AVCodecID (line 2704) | enum AVCodecID
  type AVMediaType (line 2706) | enum AVMediaType
  type AVFormatContext (line 2723) | struct AVFormatContext
  type AVCodecID (line 2799) | enum AVCodecID
  type AVCodecTag (line 2799) | struct AVCodecTag
  type AVCodecTag (line 2809) | struct AVCodecTag
  type AVCodecID (line 2809) | enum AVCodecID
  type AVCodecTag (line 2820) | struct AVCodecTag
  type AVCodecID (line 2820) | enum AVCodecID
  type AVCodecID (line 2958) | enum AVCodecID
  type AVCodecTag (line 2976) | struct AVCodecTag
  type AVCodecTag (line 2980) | struct AVCodecTag
  type AVCodecTag (line 2984) | struct AVCodecTag
  type AVCodecTag (line 2988) | struct AVCodecTag
  type AVTimebaseSource (line 3058) | enum AVTimebaseSource {
  type AVTimebaseSource (line 3079) | enum AVTimebaseSource

FILE: thirdLibs/ffmpeg/include/libavformat/avio.h
  type AVIOInterruptCB (line 58) | typedef struct AVIOInterruptCB {
  type AVIODirEntryType (line 66) | enum AVIODirEntryType {
  type AVIODirEntry (line 86) | typedef struct AVIODirEntry {
  type AVIODirContext (line 103) | typedef struct AVIODirContext {
  type AVIODataMarkerType (line 111) | enum AVIODataMarkerType {
  type AVIOContext (line 161) | typedef struct AVIOContext {
  type AVIODataMarkerType (line 524) | enum AVIODataMarkerType
  function av_always_inline (line 557) | static av_always_inline int64_t avio_tell(AVIOContext *s)
  type AVBPrint (line 822) | struct AVBPrint
  type AVBPrint (line 830) | struct AVBPrint

FILE: thirdLibs/ffmpeg/include/libavutil/aes.h
  type AVAES (line 37) | struct AVAES
  type AVAES (line 42) | struct AVAES
  type AVAES (line 49) | struct AVAES
  type AVAES (line 59) | struct AVAES

FILE: thirdLibs/ffmpeg/include/libavutil/aes_ctr.h
  type AVAESCTR (line 33) | struct AVAESCTR
  type AVAESCTR (line 38) | struct AVAESCTR
  type AVAESCTR (line 44) | struct AVAESCTR
  type AVAESCTR (line 49) | struct AVAESCTR
  type AVAESCTR (line 57) | struct AVAESCTR
  type AVAESCTR (line 62) | struct AVAESCTR
  type AVAESCTR (line 67) | struct AVAESCTR
  type AVAESCTR (line 72) | struct AVAESCTR
  type AVAESCTR (line 77) | struct AVAESCTR
  type AVAESCTR (line 82) | struct AVAESCTR

FILE: thirdLibs/ffmpeg/include/libavutil/audio_fifo.h
  type AVAudioFifo (line 49) | typedef struct AVAudioFifo AVAudioFifo;
  type AVSampleFormat (line 66) | enum AVSampleFormat

FILE: thirdLibs/ffmpeg/include/libavutil/avstring.h
  function av_strnlen (line 140) | static inline size_t av_strnlen(const char *s, size_t len)
  function av_const (line 206) | static inline av_const int av_isdigit(int c)
  function av_const (line 214) | static inline av_const int av_isgraph(int c)
  function av_const (line 222) | static inline av_const int av_isspace(int c)
  function av_const (line 231) | static inline av_const int av_toupper(int c)
  function av_const (line 241) | static inline av_const int av_tolower(int c)
  function av_const (line 251) | static inline av_const int av_isxdigit(int c)
  type AVEscapeMode (line 313) | enum AVEscapeMode {
  type AVEscapeMode (line 354) | enum AVEscapeMode

FILE: thirdLibs/ffmpeg/include/libavutil/avutil.h
  type AVMediaType (line 199) | enum AVMediaType {
  type AVMediaType (line 213) | enum AVMediaType
  type AVPictureType (line 272) | enum AVPictureType {
  type AVPictureType (line 290) | enum AVPictureType

FILE: thirdLibs/ffmpeg/include/libavutil/blowfish.h
  type AVBlowfish (line 35) | typedef struct AVBlowfish {
  type AVBlowfish (line 52) | struct AVBlowfish
  type AVBlowfish (line 62) | struct AVBlowfish
  type AVBlowfish (line 75) | struct AVBlowfish

FILE: thirdLibs/ffmpeg/include/libavutil/bprint.h
  type tm (line 148) | struct tm
  type tm (line 160) | struct tm
  function av_bprint_is_complete (line 185) | static inline int av_bprint_is_complete(const AVBPrint *buf)
  type AVEscapeMode (line 217) | enum AVEscapeMode

FILE: thirdLibs/ffmpeg/include/libavutil/bswap.h
  function av_bswap16 (line 58) | uint16_t av_bswap16(uint16_t x)
  function av_bswap32 (line 66) | uint32_t av_bswap32(uint32_t x)
  function av_bswap64 (line 73) | static inline uint64_t av_const av_bswap64(uint64_t x)

FILE: thirdLibs/ffmpeg/include/libavutil/buffer.h
  type AVBuffer (line 73) | typedef struct AVBuffer AVBuffer;
  type AVBufferRef (line 81) | typedef struct AVBufferRef {
  type AVBufferPool (line 238) | typedef struct AVBufferPool AVBufferPool;

FILE: thirdLibs/ffmpeg/include/libavutil/camellia.h
  type AVCAMELLIA (line 38) | struct AVCAMELLIA
  type AVCAMELLIA (line 44) | struct AVCAMELLIA
  type AVCAMELLIA (line 53) | struct AVCAMELLIA
  type AVCAMELLIA (line 65) | struct AVCAMELLIA

FILE: thirdLibs/ffmpeg/include/libavutil/cast5.h
  type AVCAST5 (line 38) | struct AVCAST5
  type AVCAST5 (line 44) | struct AVCAST5
  type AVCAST5 (line 53) | struct AVCAST5
  type AVCAST5 (line 64) | struct AVCAST5
  type AVCAST5 (line 76) | struct AVCAST5

FILE: thirdLibs/ffmpeg/include/libavutil/channel_layout.h
  type AVMatrixEncoding (line 114) | enum AVMatrixEncoding {
  type AVBPrint (line 167) | struct AVBPrint
  type AVBPrint (line 171) | struct AVBPrint

FILE: thirdLibs/ffmpeg/include/libavutil/common.h
  function av_clip_c (line 127) | int av_clip_c(int a, int amin, int amax)
  function av_clip64_c (line 144) | int64_t av_clip64_c(int64_t a, int64_t amin, int64_t amax)
  function av_clip_uint8_c (line 159) | uint8_t av_clip_uint8_c(int a)
  function av_clip_int8_c (line 170) | int8_t av_clip_int8_c(int a)
  function av_clip_uint16_c (line 181) | uint16_t av_clip_uint16_c(int a)
  function av_clip_int16_c (line 192) | int16_t av_clip_int16_c(int a)
  function av_clipl_int32_c (line 203) | int32_t av_clipl_int32_c(int64_t a)
  function av_clip_intp2_c (line 215) | int av_clip_intp2_c(int a, int p)
  function av_clip_uintp2_c (line 229) | unsigned av_clip_uintp2_c(int a, int p)
  function av_mod_uintp2_c (line 241) | unsigned av_mod_uintp2_c(unsigned a, unsigned p)
  function av_always_inline (line 253) | static av_always_inline int av_sat_add32_c(int a, int b)
  function av_always_inline (line 265) | static av_always_inline int av_sat_dadd32_c(int a, int b)
  function av_always_inline (line 277) | static av_always_inline int av_sat_sub32_c(int a, int b)
  function av_always_inline (line 289) | static av_always_inline int av_sat_dsub32_c(int a, int b)
  function av_clipf_c (line 301) | float av_clipf_c(float a, float amin, float amax)
  function av_clipd_c (line 318) | double av_clipd_c(double a, double amin, double amax)
  function av_ceil_log2_c (line 332) | int av_ceil_log2_c(int x)
  function av_popcount_c (line 342) | int av_popcount_c(uint32_t x)
  function av_popcount64_c (line 356) | int av_popcount64_c(uint64_t x)
  function av_parity_c (line 361) | int av_parity_c(uint32_t v)

FILE: thirdLibs/ffmpeg/include/libavutil/crc.h
  type AVCRC (line 47) | typedef uint32_t AVCRC;
  type AVCRCId (line 49) | typedef enum {

FILE: thirdLibs/ffmpeg/include/libavutil/des.h
  type AVDES (line 33) | typedef struct AVDES {
  type AVDES (line 50) | struct AVDES
  type AVDES (line 62) | struct AVDES
  type AVDES (line 71) | struct AVDES

FILE: thirdLibs/ffmpeg/include/libavutil/dict.h
  type AVDictionaryEntry (line 81) | typedef struct AVDictionaryEntry {
  type AVDictionary (line 86) | typedef struct AVDictionary AVDictionary;

FILE: thirdLibs/ffmpeg/include/libavutil/downmix_info.h
  type AVDownmixType (line 44) | enum AVDownmixType {
  type AVDownmixInfo (line 58) | typedef struct AVDownmixInfo {

FILE: thirdLibs/ffmpeg/include/libavutil/encryption_info.h
  type AVSubsampleEncryptionInfo (line 25) | typedef struct AVSubsampleEncryptionInfo {
  type AVEncryptionInfo (line 43) | typedef struct AVEncryptionInfo {
  type AVEncryptionInitInfo (line 88) | typedef struct AVEncryptionInitInfo {

FILE: thirdLibs/ffmpeg/include/libavutil/eval.h
  type AVExpr (line 31) | typedef struct AVExpr AVExpr;

FILE: thirdLibs/ffmpeg/include/libavutil/fifo.h
  type AVFifoBuffer (line 31) | typedef struct AVFifoBuffer {

FILE: thirdLibs/ffmpeg/include/libavutil/frame.h
  type AVFrameSideDataType (line 48) | enum AVFrameSideDataType {
  type AVActiveFormatDescription (line 184) | enum AVActiveFormatDescription {
  type AVFrameSideData (line 201) | typedef struct AVFrameSideData {
  type AVRegionOfInterest (line 220) | typedef struct AVRegionOfInterest {
  type AVFrame (line 295) | typedef struct AVFrame {
  type AVColorSpace (line 727) | enum AVColorSpace
  type AVColorRange (line 731) | enum AVColorRange
  type AVColorSpace (line 738) | enum AVColorSpace
  type AVFrameSideDataType (line 896) | enum AVFrameSideDataType
  type AVFrameSideDataType (line 912) | enum AVFrameSideDataType
  type AVFrameSideDataType (line 920) | enum AVFrameSideDataType
  type AVFrameSideDataType (line 926) | enum AVFrameSideDataType
  type AVFrameSideDataType (line 965) | enum AVFrameSideDataType

FILE: thirdLibs/ffmpeg/include/libavutil/hash.h
  type AVHashContext (line 116) | struct AVHashContext
  type AVHashContext (line 126) | struct AVHashContext
  type AVHashContext (line 141) | struct AVHashContext
  type AVHashContext (line 168) | struct AVHashContext
  type AVHashContext (line 175) | struct AVHashContext
  type AVHashContext (line 185) | struct AVHashContext
  type AVHashContext (line 187) | struct AVHashContext
  type AVHashContext (line 204) | struct AVHashContext
  type AVHashContext (line 219) | struct AVHashContext
  type AVHashContext (line 237) | struct AVHashContext
  type AVHashContext (line 255) | struct AVHashContext
  type AVHashContext (line 262) | struct AVHashContext

FILE: thirdLibs/ffmpeg/include/libavutil/hdr_dynamic_metadata.h
  type AVHDRPlusOverlapProcessOption (line 30) | enum AVHDRPlusOverlapProcessOption {
  type AVHDRPlusPercentile (line 39) | typedef struct AVHDRPlusPercentile {
  type AVHDRPlusColorTransformParams (line 59) | typedef struct AVHDRPlusColorTransformParams {
  type AVDynamicHDRPlus (line 243) | typedef struct AVDynamicHDRPlus {

FILE: thirdLibs/ffmpeg/include/libavutil/hmac.h
  type AVHMACType (line 33) | enum AVHMACType {
  type AVHMAC (line 42) | typedef struct AVHMAC AVHMAC;
  type AVHMACType (line 48) | enum AVHMACType

FILE: thirdLibs/ffmpeg/include/libavutil/hwcontext.h
  type AVHWDeviceType (line 27) | enum AVHWDeviceType {
  type AVHWDeviceInternal (line 41) | typedef struct AVHWDeviceInternal AVHWDeviceInternal;
  type AVHWDeviceContext (line 60) | typedef struct AVHWDeviceContext {
  type AVHWFramesInternal (line 111) | typedef struct AVHWFramesInternal AVHWFramesInternal;
  type AVHWFramesContext (line 123) | typedef struct AVHWFramesContext {
  type AVHWDeviceType (line 238) | enum AVHWDeviceType
  type AVHWDeviceType (line 246) | enum AVHWDeviceType
  type AVHWDeviceType (line 256) | enum AVHWDeviceType
  type AVHWDeviceType (line 256) | enum AVHWDeviceType
  type AVHWDeviceType (line 265) | enum AVHWDeviceType
  type AVHWDeviceType (line 302) | enum AVHWDeviceType
  type AVHWDeviceType (line 327) | enum AVHWDeviceType
  type AVHWFrameTransferDirection (line 394) | enum AVHWFrameTransferDirection {
  type AVHWFrameTransferDirection (line 422) | enum AVHWFrameTransferDirection
  type AVPixelFormat (line 423) | enum AVPixelFormat
  type AVHWFramesConstraints (line 432) | typedef struct AVHWFramesConstraints {
  type AVPixelFormat (line 579) | enum AVPixelFormat

FILE: thirdLibs/ffmpeg/include/libavutil/hwcontext_cuda.h
  type AVCUDADeviceContextInternal (line 37) | typedef struct AVCUDADeviceContextInternal AVCUDADeviceContextInternal;
  type AVCUDADeviceContext (line 42) | typedef struct AVCUDADeviceContext {

FILE: thirdLibs/ffmpeg/include/libavutil/hwcontext_d3d11va.h
  type AVD3D11VADeviceContext (line 45) | typedef struct AVD3D11VADeviceContext {
  type AVD3D11FrameDescriptor (line 109) | typedef struct AVD3D11FrameDescriptor {
  type AVD3D11VAFramesContext (line 131) | typedef struct AVD3D11VAFramesContext {

FILE: thirdLibs/ffmpeg/include/libavutil/hwcontext_drm.h
  type AVDRMObjectDescriptor (line 48) | typedef struct AVDRMObjectDescriptor {
  type AVDRMPlaneDescriptor (line 74) | typedef struct AVDRMPlaneDescriptor {
  type AVDRMLayerDescriptor (line 96) | typedef struct AVDRMLayerDescriptor {
  type AVDRMFrameDescriptor (line 133) | typedef struct AVDRMFrameDescriptor {
  type AVDRMDeviceContext (line 157) | typedef struct AVDRMDeviceContext {

FILE: thirdLibs/ffmpeg/include/libavutil/hwcontext_dxva2.h
  type AVDXVA2DeviceContext (line 39) | typedef struct AVDXVA2DeviceContext {
  type AVDXVA2FramesContext (line 46) | typedef struct AVDXVA2FramesContext {

FILE: thirdLibs/ffmpeg/include/libavutil/hwcontext_mediacodec.h
  type AVMediaCodecDeviceContext (line 27) | typedef struct AVMediaCodecDeviceContext {

FILE: thirdLibs/ffmpeg/include/libavutil/hwcontext_qsv.h
  type AVQSVDeviceContext (line 35) | typedef struct AVQSVDeviceContext {
  type AVQSVFramesContext (line 42) | typedef struct AVQSVFramesContext {

FILE: thirdLibs/ffmpeg/include/libavutil/hwcontext_vaapi.h
  type AVVAAPIDeviceContext (line 68) | typedef struct AVVAAPIDeviceContext {
  type AVVAAPIFramesContext (line 88) | typedef struct AVVAAPIFramesContext {
  type AVVAAPIHWConfig (line 110) | typedef struct AVVAAPIHWConfig {

FILE: thirdLibs/ffmpeg/include/libavutil/hwcontext_vdpau.h
  type AVVDPAUDeviceContext (line 35) | typedef struct AVVDPAUDeviceContext {

FILE: thirdLibs/ffmpeg/include/libavutil/hwcontext_videotoolbox.h
  type AVPixelFormat (line 46) | enum AVPixelFormat
  type AVPixelFormat (line 52) | enum AVPixelFormat

FILE: thirdLibs/ffmpeg/include/libavutil/imgutils.h
  type AVPixelFormat (line 59) | enum AVPixelFormat
  type AVPixelFormat (line 68) | enum AVPixelFormat
  type AVPixelFormat (line 81) | enum AVPixelFormat
  type AVPixelFormat (line 95) | enum AVPixelFormat
  type AVPixelFormat (line 121) | enum AVPixelFormat
  type AVPixelFormat (line 139) | enum AVPixelFormat
  type AVPixelFormat (line 169) | enum AVPixelFormat
  type AVPixelFormat (line 181) | enum AVPixelFormat
  type AVPixelFormat (line 202) | enum AVPixelFormat
  type AVPixelFormat (line 229) | enum AVPixelFormat
  type AVPixelFormat (line 269) | enum AVPixelFormat
  type AVColorRange (line 269) | enum AVColorRange

FILE: thirdLibs/ffmpeg/include/libavutil/intfloat.h
  function av_always_inline (line 40) | static av_always_inline float av_int2float(uint32_t i)
  function av_always_inline (line 50) | static av_always_inline uint32_t av_float2int(float f)
  function av_always_inline (line 60) | static av_always_inline double av_int2double(uint64_t i)
  function av_always_inline (line 70) | static av_always_inline uint64_t av_double2int(double f)

FILE: thirdLibs/ffmpeg/include/libavutil/intreadwrite.h
  type av_alias64 (line 27) | typedef union {
  type av_alias32 (line 36) | typedef union {
  type av_alias16 (line 43) | typedef union {

FILE: thirdLibs/ffmpeg/include/libavutil/lfg.h
  type AVLFG (line 27) | typedef struct AVLFG {
  function av_lfg_get (line 47) | static inline unsigned int av_lfg_get(AVLFG *c){
  function av_mlfg_get (line 57) | static inline unsigned int av_mlfg_get(AVLFG *c){

FILE: thirdLibs/ffmpeg/include/libavutil/log.h
  type AVClassCategory (line 29) | typedef enum {
  type AVOptionRanges (line 60) | struct AVOptionRanges
  type AVClass (line 67) | typedef struct AVClass {

FILE: thirdLibs/ffmpeg/include/libavutil/mastering_display_metadata.h
  type AVMasteringDisplayMetadata (line 38) | typedef struct AVMasteringDisplayMetadata {
  type AVContentLightMetadata (line 98) | typedef struct AVContentLightMetadata {

FILE: thirdLibs/ffmpeg/include/libavutil/mathematics.h
  type AVRounding (line 79) | enum AVRounding {
  type AVRounding (line 140) | enum AVRounding
  type AVRounding (line 161) | enum AVRounding

FILE: thirdLibs/ffmpeg/include/libavutil/md5.h
  type AVMD5 (line 46) | struct AVMD5
  type AVMD5 (line 51) | struct AVMD5
  type AVMD5 (line 58) | struct AVMD5
  type AVMD5 (line 68) | struct AVMD5
  type AVMD5 (line 70) | struct AVMD5
  type AVMD5 (line 79) | struct AVMD5

FILE: thirdLibs/ffmpeg/include/libavutil/mem.h
  function av_size_mult (line 669) | static inline int av_size_mult(size_t a, size_t b, size_t *r)

FILE: thirdLibs/ffmpeg/include/libavutil/motion_vector.h
  type AVMotionVector (line 24) | typedef struct AVMotionVector {

FILE: thirdLibs/ffmpeg/include/libavutil/murmur3.h
  type AVMurMur3 (line 68) | struct AVMurMur3
  type AVMurMur3 (line 80) | struct AVMurMur3
  type AVMurMur3 (line 93) | struct AVMurMur3
  type AVMurMur3 (line 103) | struct AVMurMur3
  type AVMurMur3 (line 105) | struct AVMurMur3
  type AVMurMur3 (line 114) | struct AVMurMur3

FILE: thirdLibs/ffmpeg/include/libavutil/opt.h
  type AVOptionType (line 221) | enum AVOptionType{
  type AVOption (line 246) | typedef struct AVOption {
  type AVOptionRange (line 306) | typedef struct AVOptionRange {
  type AVOptionRanges (line 329) | typedef struct AVOptionRanges {
  type AVDictionary (line 479) | struct AVDictionary
  type AVDictionary (line 497) | struct AVDictionary
  type AVPixelFormat (line 687) | enum AVPixelFormat
  type AVSampleFormat (line 688) | enum AVSampleFormat
  type AVPixelFormat (line 741) | enum AVPixelFormat
  type AVSampleFormat (line 742) | enum AVSampleFormat

FILE: thirdLibs/ffmpeg/include/libavutil/parseutils.h
  type tm (line 186) | struct tm
  type tm (line 191) | struct tm

FILE: thirdLibs/ffmpeg/include/libavutil/pixdesc.h
  type AVComponentDescriptor (line 31) | typedef struct AVComponentDescriptor {
  type AVPixFmtDescriptor (line 81) | typedef struct AVPixFmtDescriptor {
  type AVPixelFormat (line 211) | enum AVPixelFormat
  type AVPixelFormat (line 226) | enum AVPixelFormat
  type AVPixelFormat (line 238) | enum AVPixelFormat
  type AVPixelFormat (line 245) | enum AVPixelFormat
  type AVColorRange (line 250) | enum AVColorRange
  type AVColorPrimaries (line 260) | enum AVColorPrimaries
  type AVColorTransferCharacteristic (line 270) | enum AVColorTransferCharacteristic
  type AVColorSpace (line 280) | enum AVColorSpace
  type AVChromaLocation (line 290) | enum AVChromaLocation
  type AVPixelFormat (line 308) | enum AVPixelFormat
  type AVPixelFormat (line 316) | enum AVPixelFormat
  type AVPixelFormat (line 329) | enum AVPixelFormat
  type AVPixelFormat (line 388) | enum AVPixelFormat
  type AVPixelFormat (line 388) | enum AVPixelFormat
  type AVPixelFormat (line 415) | enum AVPixelFormat
  type AVPixelFormat (line 416) | enum AVPixelFormat
  type AVPixelFormat (line 437) | enum AVPixelFormat
  type AVPixelFormat (line 437) | enum AVPixelFormat
  type AVPixelFormat (line 437) | enum AVPixelFormat
  type AVPixelFormat (line 438) | enum AVPixelFormat

FILE: thirdLibs/ffmpeg/include/libavutil/pixfmt.h
  type AVPixelFormat (line 64) | enum AVPixelFormat {
  type AVColorPrimaries (line 443) | enum AVColorPrimaries {
  type AVColorTransferCharacteristic (line 467) | enum AVColorTransferCharacteristic {
  type AVColorSpace (line 496) | enum AVColorSpace {
  type AVColorRange (line 519) | enum AVColorRange {
  type AVChromaLocation (line 541) | enum AVChromaLocation {

FILE: thirdLibs/ffmpeg/include/libavutil/rational.h
  type AVRational (line 58) | typedef struct AVRational{
  function AVRational (line 71) | static inline AVRational av_make_q(int num, int den)
  function av_cmp_q (line 89) | static inline int av_cmp_q(AVRational a, AVRational b){
  function av_q2d (line 104) | static inline double av_q2d(AVRational a){
  function av_always_inline (line 159) | static av_always_inline AVRational av_inv_q(AVRational q)

FILE: thirdLibs/ffmpeg/include/libavutil/rc4.h
  type AVRC4 (line 32) | typedef struct AVRC4 {
  type AVRC4 (line 49) | struct AVRC4
  type AVRC4 (line 60) | struct AVRC4

FILE: thirdLibs/ffmpeg/include/libavutil/replaygain.h
  type AVReplayGain (line 29) | typedef struct AVReplayGain {

FILE: thirdLibs/ffmpeg/include/libavutil/ripemd.h
  type AVRIPEMD (line 46) | struct AVRIPEMD
  type AVRIPEMD (line 51) | struct AVRIPEMD
  type AVRIPEMD (line 60) | struct AVRIPEMD
  type AVRIPEMD (line 70) | struct AVRIPEMD
  type AVRIPEMD (line 72) | struct AVRIPEMD
  type AVRIPEMD (line 81) | struct AVRIPEMD

FILE: thirdLibs/ffmpeg/include/libavutil/samplefmt.h
  type AVSampleFormat (line 58) | enum AVSampleFormat {
  type AVSampleFormat (line 81) | enum AVSampleFormat
  type AVSampleFormat (line 87) | enum AVSampleFormat
  type AVSampleFormat (line 95) | enum AVSampleFormat
  type AVSampleFormat (line 95) | enum AVSampleFormat
  type AVSampleFormat (line 106) | enum AVSampleFormat
  type AVSampleFormat (line 106) | enum AVSampleFormat
  type AVSampleFormat (line 117) | enum AVSampleFormat
  type AVSampleFormat (line 117) | enum AVSampleFormat
  type AVSampleFormat (line 131) | enum AVSampleFormat
  type AVSampleFormat (line 140) | enum AVSampleFormat
  type AVSampleFormat (line 148) | enum AVSampleFormat
  type AVSampleFormat (line 161) | enum AVSampleFormat
  type AVSampleFormat (line 205) | enum AVSampleFormat
  type AVSampleFormat (line 227) | enum AVSampleFormat
  type AVSampleFormat (line 239) | enum AVSampleFormat
  type AVSampleFormat (line 254) | enum AVSampleFormat
  type AVSampleFormat (line 266) | enum AVSampleFormat

FILE: thirdLibs/ffmpeg/include/libavutil/sha.h
  type AVSHA (line 54) | struct AVSHA
  type AVSHA (line 59) | struct AVSHA
  type AVSHA (line 68) | struct AVSHA
  type AVSHA (line 78) | struct AVSHA
  type AVSHA (line 80) | struct AVSHA
  type AVSHA (line 89) | struct AVSHA

FILE: thirdLibs/ffmpeg/include/libavutil/sha512.h
  type AVSHA512 (line 56) | struct AVSHA512
  type AVSHA512 (line 61) | struct AVSHA512
  type AVSHA512 (line 70) | struct AVSHA512
  type AVSHA512 (line 80) | struct AVSHA512
  type AVSHA512 (line 82) | struct AVSHA512
  type AVSHA512 (line 91) | struct AVSHA512

FILE: thirdLibs/ffmpeg/include/libavutil/spherical.h
  type AVSphericalProjection (line 51) | enum AVSphericalProjection {
  type AVSphericalMapping (line 82) | typedef struct AVSphericalMapping {
  type AVSphericalProjection (line 217) | enum AVSphericalProjection

FILE: thirdLibs/ffmpeg/include/libavutil/stereo3d.h
  type AVStereo3DType (line 51) | enum AVStereo3DType {
  type AVStereo3DView (line 147) | enum AVStereo3DView {
  type AVStereo3D (line 176) | typedef struct AVStereo3D {

FILE: thirdLibs/ffmpeg/include/libavutil/tea.h
  type AVTEA (line 37) | struct AVTEA
  type AVTEA (line 43) | struct AVTEA
  type AVTEA (line 52) | struct AVTEA
  type AVTEA (line 64) | struct AVTEA

FILE: thirdLibs/ffmpeg/include/libavutil/threadmessage.h
  type AVThreadMessageQueue (line 22) | typedef struct AVThreadMessageQueue AVThreadMessageQueue;
  type AVThreadMessageFlags (line 24) | typedef enum AVThreadMessageFlags {

FILE: thirdLibs/ffmpeg/include/libavutil/timecode.h
  type AVTimecodeFlag (line 35) | enum AVTimecodeFlag {
  type AVTimecode (line 41) | typedef struct {

FILE: thirdLibs/ffmpeg/include/libavutil/tree.h
  type AVTreeNode (line 45) | struct AVTreeNode
  type AVTreeNode (line 51) | struct AVTreeNode
  type AVTreeNode (line 67) | struct AVTreeNode
  type AVTreeNode (line 114) | struct AVTreeNode
  type AVTreeNode (line 116) | struct AVTreeNode
  type AVTreeNode (line 118) | struct AVTreeNode
  type AVTreeNode (line 130) | struct AVTreeNode

FILE: thirdLibs/ffmpeg/include/libavutil/twofish.h
  type AVTWOFISH (line 38) | struct AVTWOFISH
  type AVTWOFISH (line 44) | struct AVTWOFISH
  type AVTWOFISH (line 53) | struct AVTWOFISH
  type AVTWOFISH (line 65) | struct AVTWOFISH

FILE: thirdLibs/ffmpeg/include/libavutil/tx.h
  type AVTXContext (line 25) | typedef struct AVTXContext AVTXContext;
  type AVComplexFloat (line 27) | typedef struct AVComplexFloat {
  type AVTXType (line 31) | enum AVTXType {
  type AVTXType (line 73) | enum AVTXType

FILE: thirdLibs/ffmpeg/include/libavutil/xtea.h
  type AVXTEA (line 35) | typedef struct AVXTEA {
  type AVXTEA (line 51) | struct AVXTEA
  type AVXTEA (line 60) | struct AVXTEA
  type AVXTEA (line 73) | struct AVXTEA
  type AVXTEA (line 87) | struct AVXTEA

FILE: thirdLibs/ffmpeg/include/libpostproc/postprocess.h
  type pp_context (line 58) | typedef void pp_context;
  type pp_mode (line 59) | typedef void pp_mode;
  type pp_context (line 62) | typedef pp_context pp_context_t;
  type pp_mode (line 63) | typedef pp_mode pp_mode_t;

FILE: thirdLibs/ffmpeg/include/libswresample/swresample.h
  type SwrDitherType (line 141) | enum SwrDitherType {
  type SwrEngine (line 159) | enum SwrEngine {
  type SwrFilterType (line 166) | enum SwrFilterType {
  type SwrContext (line 182) | typedef struct SwrContext SwrContext;
  type SwrContext (line 207) | struct SwrContext
  type SwrContext (line 219) | struct SwrContext
  type SwrContext (line 228) | struct SwrContext
  type SwrContext (line 250) | struct SwrContext
  type SwrContext (line 250) | struct SwrContext
  type AVSampleFormat (line 251) | enum AVSampleFormat
  type AVSampleFormat (line 252) | enum AVSampleFormat
  type SwrContext (line 267) | struct SwrContext
  type SwrContext (line 279) | struct SwrContext
  type SwrContext (line 306) | struct SwrContext
  type SwrContext (line 326) | struct SwrContext
  type SwrContext (line 353) | struct SwrContext
  type SwrContext (line 363) | struct SwrContext
  type AVMatrixEncoding (line 392) | enum AVMatrixEncoding
  type SwrContext (line 404) | struct SwrContext
  type SwrContext (line 424) | struct SwrContext
  type SwrContext (line 437) | struct SwrContext
  type SwrContext (line 463) | struct SwrContext
  type SwrContext (line 481) | struct SwrContext

FILE: thirdLibs/ffmpeg/include/libswscale/swscale.h
  type SwsVector (line 109) | typedef struct SwsVector {
  type SwsFilter (line 115) | typedef struct SwsFilter {
  type SwsContext (line 122) | struct SwsContext
  type AVPixelFormat (line 128) | enum AVPixelFormat
  type AVPixelFormat (line 134) | enum AVPixelFormat
  type AVPixelFormat (line 141) | enum AVPixelFormat
  type SwsContext (line 148) | struct SwsContext
  type SwsContext (line 157) | struct SwsContext
  type SwsContext (line 163) | struct SwsContext
  type SwsContext (line 186) | struct SwsContext
  type AVPixelFormat (line 186) | enum AVPixelFormat
  type AVPixelFormat (line 187) | enum AVPixelFormat
  type SwsContext (line 217) | struct SwsContext
  type SwsContext (line 231) | struct SwsContext
  type SwsContext (line 238) | struct SwsContext
  type SwsContext (line 294) | struct SwsContext
  type SwsContext (line 294) | struct SwsContext
  type AVPixelFormat (line 295) | enum AVPixelFormat
  type AVPixelFormat (line 296) | enum AVPixelFormat

FILE: thirdLibs/python3_8/include/Python-ast.h
  type _mod (line 13) | struct _mod
  type _stmt (line 15) | struct _stmt
  type _expr (line 17) | struct _expr
  type expr_context_ty (line 19) | typedef enum _expr_context { Load=1, Store=2, Del=3, AugLoad=4, AugStore=5,
  type _slice (line 22) | struct _slice
  type boolop_ty (line 24) | typedef enum _boolop { And=1, Or=2 } boolop_ty;
  type operator_ty (line 26) | typedef enum _operator { Add=1, Sub=2, Mult=3, MatMult=4, Div=5, Mod=6, ...
  type unaryop_ty (line 30) | typedef enum _unaryop { Invert=1, Not=2, UAdd=3, USub=4 } unaryop_ty;
  type cmpop_ty (line 32) | typedef enum _cmpop { Eq=1, NotEq=2, Lt=3, LtE=4, Gt=5, GtE=6, Is=7, IsN...
  type _comprehension (line 35) | struct _comprehension
  type _excepthandler (line 37) | struct _excepthandler
  type _arguments (line 39) | struct _arguments
  type _arg (line 41) | struct _arg
  type _keyword (line 43) | struct _keyword
  type _alias (line 45) | struct _alias
  type _withitem (line 47) | struct _withitem
  type _type_ignore (line 49) | struct _type_ignore
  type _mod_kind (line 52) | enum _mod_kind {Module_kind=1, Interactive_kind=2, Expression_kind=3,
  type _mod (line 54) | struct _mod {
  type _stmt_kind (line 82) | enum _stmt_kind {FunctionDef_kind=1, AsyncFunctionDef_kind=2, ClassDef_k...
  type _stmt (line 90) | struct _stmt {
  type _expr_kind (line 232) | enum _expr_kind {BoolOp_kind=1, NamedExpr_kind=2, BinOp_kind=3, UnaryOp_...
  type _expr (line 240) | struct _expr {
  type _slice_kind (line 383) | enum _slice_kind {Slice_kind=1, ExtSlice_kind=2, Index_kind=3}
  type _slice (line 384) | struct _slice {
  type _comprehension (line 404) | struct _comprehension {
  type _excepthandler_kind (line 411) | enum _excepthandler_kind {ExceptHandler_kind=1}
  type _excepthandler (line 412) | struct _excepthandler {
  type _arguments (line 428) | struct _arguments {
  type _arg (line 438) | struct _arg {
  type _keyword (line 448) | struct _keyword {
  type _alias (line 453) | struct _alias {
  type _withitem (line 458) | struct _withitem {
  type _type_ignore_kind (line 463) | enum _type_ignore_kind {TypeIgnore_kind=1}
  type _type_ignore (line 464) | struct _type_ignore {

FILE: thirdLibs/python3_8/include/asdl.h
  type PyObject (line 4) | typedef PyObject * identifier;
  type PyObject (line 5) | typedef PyObject * string;
  type PyObject (line 6) | typedef PyObject * bytes;
  type PyObject (line 7) | typedef PyObject * object;
  type PyObject (line 8) | typedef PyObject * singleton;
  type PyObject (line 9) | typedef PyObject * constant;
  type asdl_seq (line 19) | typedef struct {
  type asdl_int_seq (line 24) | typedef struct {

FILE: thirdLibs/python3_8/include/bitset.h
  type BYTE (line 11) | typedef BYTE *bitset;

FILE: thirdLibs/python3_8/include/boolobject.h
  type _longobject (line 18) | struct _longobject

FILE: thirdLibs/python3_8/include/bytearrayobject.h
  type PyByteArrayObject (line 23) | typedef struct {

FILE: thirdLibs/python3_8/include/bytesobject.h
  type PyBytesObject (line 31) | typedef struct {
  type _PyBytesWriter (line 144) | typedef struct {

FILE: thirdLibs/python3_8/include/cellobject.h
  type PyCellObject (line 9) | typedef struct {

FILE: thirdLibs/python3_8/include/ceval.h
  type _frame (line 42) | struct _frame
  type _frame (line 47) | struct _frame
  type _frame (line 136) | struct _frame
  type _frame (line 137) | struct _frame
  type _frame (line 139) | struct _frame

FILE: thirdLibs/python3_8/include/classobject.h
  type PyMethodObject (line 12) | typedef struct {
  type PyInstanceMethodObject (line 38) | typedef struct {

FILE: thirdLibs/python3_8/include/code.h
  type _Py_CODEUNIT (line 10) | typedef uint16_t _Py_CODEUNIT;
  type _PyOpcache (line 20) | typedef struct _PyOpcache _PyOpcache;
  type PyCodeObject (line 23) | typedef struct {
  type PyAddrPair (line 143) | typedef struct _addr_pair {

FILE: thirdLibs/python3_8/include/compile.h
  type _node (line 12) | struct _node
  type _node (line 13) | struct _node
  type PyCompilerFlags (line 29) | typedef struct {
  type PyFutureFeatures (line 40) | typedef struct {
  type _mod (line 56) | struct _mod
  type _mod (line 59) | struct _mod
  type _mod (line 65) | struct _mod
  type _mod (line 71) | struct _mod
  type _mod (line 75) | struct _mod
  type _mod (line 86) | struct _mod

FILE: thirdLibs/python3_8/include/complexobject.h
  type Py_complex (line 10) | typedef struct {
  type PyComplexObject (line 33) | typedef struct {

FILE: thirdLibs/python3_8/include/context.h
  type PyContext (line 11) | typedef struct _pycontextobject PyContext;
  type PyContextVar (line 14) | typedef struct _pycontextvarobject PyContextVar;
  type PyContextToken (line 17) | typedef struct _pycontexttokenobject PyContextToken;

FILE: thirdLibs/python3_8/include/cpython/abstract.h
  function Py_ssize_t (line 74) | static inline Py_ssize_t
  function vectorcallfunc (line 80) | static inline vectorcallfunc
  function PyObject (line 114) | static inline PyObject *
  function PyObject (line 144) | static inline PyObject *
  function PyObject (line 151) | static inline PyObject *
  type _Py_Identifier (line 181) | struct _Py_Identifier

FILE: thirdLibs/python3_8/include/cpython/dictobject.h
  type PyDictKeysObject (line 9) | typedef struct _dictkeysobject PyDictKeysObject;
  type PyDictObject (line 14) | typedef struct {
  type _Py_Identifier (line 37) | struct _Py_Identifier
  type _Py_Identifier (line 73) | struct _Py_Identifier
  type _Py_Identifier (line 74) | struct _Py_Identifier
  type _Py_Identifier (line 76) | struct _Py_Identifier
  type _PyDictViewObject (line 84) | typedef struct {

FILE: thirdLibs/python3_8/include/cpython/fileobject.h
  type PyObject (line 24) | typedef PyObject * (*Py_OpenCodeHookFunction)(PyObject *, void *);

FILE: thirdLibs/python3_8/include/cpython/initconfig.h
  type PyStatus (line 10) | typedef struct {
  type PyWideStringList (line 31) | typedef struct {
  type PyPreConfig (line 47) | typedef struct {
  type PyConfig (line 129) | typedef struct {

FILE: thirdLibs/python3_8/include/cpython/object.h
  type _Py_Identifier (line 29) | typedef struct _Py_Identifier {
  type Py_buffer (line 40) | typedef struct bufferinfo {
  type PyObject (line 58) | typedef PyObject *(*vectorcallfunc)(PyObject *callable, PyObject *const ...
  type PyNumberMethods (line 95) | typedef struct {
  type PySequenceMethods (line 142) | typedef struct {
  type PyMappingMethods (line 156) | typedef struct {
  type PyAsyncMethods (line 162) | typedef struct {
  type PyBufferProcs (line 168) | typedef struct {
  type Py_ssize_t (line 175) | typedef Py_ssize_t printfunc;
  type PyTypeObject (line 177) | typedef struct _typeobject {
  type PyHeapTypeObject (line 273) | typedef struct _heaptypeobject {
  type _Py_Identifier (line 303) | struct _Py_Identifier
  type _Py_Identifier (line 310) | struct _Py_Identifier
  type _Py_Identifier (line 311) | struct _Py_Identifier
  type _Py_Identifier (line 312) | struct _Py_Identifier
  type _Py_Identifier (line 323) | struct _Py_Identifier
  function _Py_Dealloc_inline (line 339) | static inline void _Py_Dealloc_inline(PyObject *op)

FILE: thirdLibs/python3_8/include/cpython/objimpl.h
  type PyObjectArenaAllocator (line 18) | typedef struct {
  type PyGC_Head (line 46) | typedef struct {

FILE: thirdLibs/python3_8/include/cpython/pyerrors.h
  type PyBaseExceptionObject (line 17) | typedef struct {
  type PySyntaxErrorObject (line 21) | typedef struct {
  type PyImportErrorObject (line 31) | typedef struct {
  type PyUnicodeErrorObject (line 38) | typedef struct {
  type PySystemExitObject (line 47) | typedef struct {
  type PyOSErrorObject (line 52) | typedef struct {
  type PyStopIterationObject (line 64) | typedef struct {
  type PyOSErrorObject (line 70) | typedef PyOSErrorObject PyEnvironmentErrorObject;
  type PyOSErrorObject (line 72) | typedef PyOSErrorObject PyWindowsErrorObject;

FILE: thirdLibs/python3_8/include/cpython/pymem.h
  type PyMemAllocatorDomain (line 29) | typedef enum {
  type PyMemAllocatorName (line 40) | typedef enum {
  type PyMemAllocatorEx (line 53) | typedef struct {

FILE: thirdLibs/python3_8/include/cpython/pystate.h
  type _frame (line 19) | struct _frame
  type _PyErr_StackItem (line 36) | typedef struct _err_stackitem {
  type _ts (line 51) | struct _ts {
  type PyModuleDef (line 150) | struct PyModuleDef
  type _frame (line 188) | struct _frame
  type _xid (line 192) | struct _xid
  type _PyCrossInterpreterData (line 197) | typedef struct _xid {
  type _xid (line 244) | struct _xid

FILE: thirdLibs/python3_8/include/cpython/traceback.h
  type PyTracebackObject (line 9) | typedef struct _traceback {

FILE: thirdLibs/python3_8/include/cpython/tupleobject.h
  type PyTupleObject (line 9) | typedef struct {

FILE: thirdLibs/python3_8/include/cpython/unicodeobject.h
  type wchar_t (line 14) | typedef wchar_t Py_UNICODE;
  type PyASCIIObject (line 88) | typedef struct {
  type PyCompactUnicodeObject (line 227) | typedef struct {
  type PyUnicodeObject (line 239) | typedef struct {
  type PyUnicode_Kind (line 320) | enum PyUnicode_Kind {
  type _PyUnicodeWriter (line 605) | typedef struct {
  type PyUnicode_Kind (line 668) | enum PyUnicode_Kind

FILE: thirdLibs/python3_8/include/datetime.h
  type PyDateTime_Delta (line 34) | typedef struct
  type PyDateTime_TZInfo (line 43) | typedef struct
  type _PyDateTime_BaseTZInfo (line 61) | typedef struct
  type _PyDateTime_BaseTime (line 76) | typedef struct
  type PyDateTime_Time (line 81) | typedef struct
  type PyDateTime_Date (line 94) | typedef struct
  type _PyDateTime_BaseDateTime (line 104) | typedef struct
  type PyDateTime_DateTime (line 109) | typedef struct
  type PyDateTime_CAPI (line 150) | typedef struct {

FILE: thirdLibs/python3_8/include/descrobject.h
  type PyObject (line 8) | typedef PyObject *(*getter)(PyObject *, void *);
  type PyGetSetDef (line 11) | typedef struct PyGetSetDef {
  type PyObject (line 20) | typedef PyObject *(*wrapperfunc)(PyObject *self, PyObject *args,
  type PyObject (line 23) | typedef PyObject *(*wrapperfunc_kwds)(PyObject *self, PyObject *args,
  type wrapperbase (line 26) | struct wrapperbase {
  type PyDescrObject (line 41) | typedef struct {
  type PyMethodDescrObject (line 53) | typedef struct {
  type PyMemberDescrObject (line 59) | typedef struct {
  type PyGetSetDescrObject (line 64) | typedef struct {
  type PyWrapperDescrObject (line 69) | typedef struct {
  type PyMemberDef (line 88) | struct PyMemberDef
  type PyMemberDef (line 90) | struct PyMemberDef
  type PyGetSetDef (line 92) | struct PyGetSetDef
  type wrapperbase (line 95) | struct wrapperbase

FILE: thirdLibs/python3_8/include/dynamic_annotations.h
  function T (line 473) | T _Py_ANNOTATE_UNPROTECTED_READ(const volatile T &x) {

FILE: thirdLibs/python3_8/include/fileutils.h
  type _Py_error_handler (line 23) | typedef enum {
  type _Py_stat_struct (line 71) | struct _Py_stat_struct {
  type _Py_stat_struct (line 95) | struct _Py_stat_struct
  type _Py_stat_struct (line 99) | struct _Py_stat_struct
  type stat (line 103) | struct stat

FILE: thirdLibs/python3_8/include/floatobject.h
  type PyFloatObject (line 15) | typedef struct {

FILE: thirdLibs/python3_8/include/frameobject.h
  type PyTryBlock (line 10) | typedef struct {
  type PyFrameObject (line 16) | typedef struct _frame {

FILE: thirdLibs/python3_8/include/funcobject.h
  type PyFunctionObject (line 21) | typedef struct {

FILE: thirdLibs/python3_8/include/genobject.h
  type _frame (line 13) | struct _frame
  type PyGenObject (line 33) | typedef struct {
  type _frame (line 43) | struct _frame
  type _frame (line 44) | struct _frame
  type PyCoroObject (line 54) | typedef struct {
  type _frame (line 66) | struct _frame
  type PyAsyncGenObject (line 71) | typedef struct {
  type _frame (line 92) | struct _frame

FILE: thirdLibs/python3_8/include/grammar.h
  type label (line 14) | typedef struct {
  type labellist (line 23) | typedef struct {
  type arc (line 30) | typedef struct {
  type state (line 37) | typedef struct {
  type dfa (line 50) | typedef struct {
  type grammar (line 60) | typedef struct {

FILE: thirdLibs/python3_8/include/import.h
  type _Py_Identifier (line 44) | struct _Py_Identifier
  type _inittab (line 118) | struct _inittab {
  type _inittab (line 122) | struct _inittab
  type _inittab (line 123) | struct _inittab
  type _frozen (line 134) | struct _frozen {
  type _frozen (line 143) | struct _frozen

FILE: thirdLibs/python3_8/include/internal/pycore_accu.h
  type _PyAccu (line 24) | typedef struct {

FILE: thirdLibs/python3_8/include/internal/pycore_atomic.h
  type _Py_memory_order (line 38) | typedef enum _Py_memory_order {
  type _Py_atomic_address (line 46) | typedef struct _Py_atomic_address {
  type _Py_atomic_int (line 50) | typedef struct _Py_atomic_int {
  type _Py_memory_order (line 69) | typedef enum _Py_memory_order {
  type _Py_atomic_address (line 77) | typedef struct _Py_atomic_address {
  type _Py_atomic_int (line 81) | typedef struct _Py_atomic_int {
  type _Py_memory_order (line 107) | typedef enum _Py_memory_order {
  type _Py_atomic_address (line 115) | typedef struct _Py_atomic_address {
  type _Py_atomic_int (line 119) | typedef struct _Py_atomic_int {
  function _Py_atomic_signal_fence (line 124) | static __inline__ void
  function _Py_atomic_thread_fence (line 131) | static __inline__ void
  function _Py_ANNOTATE_MEMORY_ORDER (line 139) | static __inline__ void
  type _Py_memory_order (line 243) | typedef enum _Py_memory_order {
  type _Py_atomic_address (line 251) | typedef struct _Py_atomic_address {
  type _Py_atomic_int (line 255) | typedef struct _Py_atomic_int {
  function _Py_atomic_load_64bit_impl (line 295) | inline intptr_t _Py_atomic_load_64bit_impl(volatile uintptr_t* value, in...
  function _Py_atomic_load_32bit_impl (line 333) | inline int _Py_atomic_load_32bit_impl(volatile int* value, int order) {
  type _Py_memory_order (line 379) | typedef enum _Py_memory_order {
  type _Py_atomic_address (line 387) | typedef struct _Py_atomic_address {
  type _Py_atomic_int (line 391) | typedef struct _Py_atomic_int {
  function _Py_atomic_load_64bit_impl (line 431) | inline intptr_t _Py_atomic_load_64bit_impl(volatile uintptr_t* value, in...
  function _Py_atomic_load_32bit_impl (line 469) | inline int _Py_atomic_load_32bit_impl(volatile int* value, int order) {
  type _Py_memory_order (line 516) | typedef enum _Py_memory_order {
  type _Py_atomic_address (line 524) | typedef struct _Py_atomic_address {
  type _Py_atomic_int (line 528) | typedef struct _Py_atomic_int {

FILE: thirdLibs/python3_8/include/internal/pycore_ceval.h
  type _ceval_runtime_state (line 16) | struct _ceval_runtime_state
  type _ceval_runtime_state (line 18) | struct _ceval_runtime_state
  type _ceval_runtime_state (line 20) | struct _ceval_runtime_state
  type _ceval_runtime_state (line 23) | struct _ceval_runtime_state
  type _ceval_runtime_state (line 27) | struct _ceval_runtime_state

FILE: thirdLibs/python3_8/include/internal/pycore_code.h
  type _PyOpcache_LoadGlobal (line 7) | typedef struct {
  type _PyOpcache (line 13) | struct _PyOpcache {

FILE: thirdLibs/python3_8/include/internal/pycore_condvar.h
  type CRITICAL_SECTION (line 57) | typedef CRITICAL_SECTION PyMUTEX_T;
  type PyCOND_T (line 76) | typedef struct _PyCOND_T
  type SRWLOCK (line 87) | typedef SRWLOCK PyMUTEX_T;
  type CONDITION_VARIABLE (line 89) | typedef CONDITION_VARIABLE  PyCOND_T;

FILE: thirdLibs/python3_8/include/internal/pycore_context.h
  type _pycontextobject (line 10) | struct _pycontextobject {
  type _pycontextvarobject (line 19) | struct _pycontextvarobject {
  type _pycontexttokenobject (line 30) | struct _pycontexttokenobject {

FILE: thirdLibs/python3_8/include/internal/pycore_fileutils.h
  type lconv (line 47) | struct lconv

FILE: thirdLibs/python3_8/include/internal/pycore_getopt.h
  type _PyOS_LongOption (line 14) | typedef struct {

FILE: thirdLibs/python3_8/include/internal/pycore_gil.h
  type _gil_runtime_state (line 23) | struct _gil_runtime_state {

FILE: thirdLibs/python3_8/include/internal/pycore_hamt.h
  type PyHamtNode (line 15) | typedef struct {
  type PyHamtObject (line 21) | typedef struct {
  type PyHamtIteratorState (line 41) | typedef struct {
  type PyHamtIterator (line 56) | typedef struct {

FILE: thirdLibs/python3_8/include/internal/pycore_initconfig.h
  type _PyArgv (line 63) | typedef struct {
  type _PyPreCmdline (line 96) | typedef struct {
  type _PyConfigInitEnum (line 140) | typedef enum {

FILE: thirdLibs/python3_8/include/internal/pycore_object.h
  function _PyObject_GC_TRACK_impl (line 27) | static inline void _PyObject_GC_TRACK_impl(const char *filename, int lin...
  function _PyObject_GC_UNTRACK_impl (line 59) | static inline void _PyObject_GC_UNTRACK_impl(const char *filename, int l...

FILE: thirdLibs/python3_8/include/internal/pycore_pathconfig.h
  type _PyPathConfig (line 11) | typedef struct _PyPathConfig {
  type _PyPathConfig (line 51) | struct _PyPathConfig

FILE: thirdLibs/python3_8/include/internal/pycore_pyerrors.h
  function PyObject (line 11) | static inline PyObject* _PyErr_Occurred(PyThreadState *tstate)

FILE: thirdLibs/python3_8/include/internal/pycore_pymem.h
  type gc_generation (line 97) | struct gc_generation {
  type gc_generation_stats (line 105) | struct gc_generation_stats {
  type _gc_runtime_state (line 114) | struct _gc_runtime_state {
  type _gc_runtime_state (line 148) | struct _gc_runtime_state
  function _PyMem_IsPtrFreed (line 182) | static inline int _PyMem_IsPtrFreed(void *ptr)

FILE: thirdLibs/python3_8/include/internal/pycore_pystate.h
  type _pending_calls (line 25) | struct _pending_calls {
  type _ceval_runtime_state (line 43) | struct _ceval_runtime_state {
  type PyObject (line 64) | typedef PyObject* (*_PyFrameEvalFunction)(struct _frame *, int);
  type _is (line 67) | struct _is {
  type _is (line 140) | struct _is
  type _is (line 142) | struct _is
  type _is (line 143) | struct _is
  type _is (line 144) | struct _is
  type _xidregitem (line 153) | struct _xidregitem
  type _xidregitem (line 155) | struct _xidregitem {
  type _Py_AuditHookEntry (line 163) | typedef struct _Py_AuditHookEntry {
  type _gilstate_runtime_state (line 171) | struct _gilstate_runtime_state {
  type _PyRuntimeState (line 195) | typedef struct pyruntimestate {
  type _gilstate_runtime_state (line 312) | struct _gilstate_runtime_state

FILE: thirdLibs/python3_8/include/internal/pycore_traceback.h
  type _frame (line 91) | struct _frame

FILE: thirdLibs/python3_8/include/internal/pycore_warnings.h
  type _warnings_runtime_state (line 13) | struct _warnings_runtime_state {

FILE: thirdLibs/python3_8/include/listobject.h
  type PyListObject (line 23) | typedef struct {

FILE: thirdLibs/python3_8/include/longintrepr.h
  type digit (line 45) | typedef uint32_t digit;
  type sdigit (line 46) | typedef int32_t sdigit;
  type twodigits (line 47) | typedef uint64_t twodigits;
  type stwodigits (line 48) | typedef int64_t stwodigits;
  type digit (line 53) | typedef unsigned short digit;
  type sdigit (line 54) | typedef short sdigit;
  type twodigits (line 55) | typedef unsigned long twodigits;
  type stwodigits (line 56) | typedef long stwodigits;
  type _longobject (line 85) | struct _longobject {

FILE: thirdLibs/python3_8/include/longobject.h
  type PyLongObject (line 10) | typedef struct _longobject PyLongObject;

FILE: thirdLibs/python3_8/include/memoryobject.h
  type _PyManagedBufferObject (line 42) | typedef struct {
  type PyMemoryViewObject (line 57) | typedef struct {

FILE: thirdLibs/python3_8/include/methodobject.h
  type PyObject (line 18) | typedef PyObject *(*PyCFunction)(PyObject *, PyObject *);
  type PyObject (line 19) | typedef PyObject *(*_PyCFunctionFast) (PyObject *, PyObject *const *, Py...
  type PyObject (line 20) | typedef PyObject *(*PyCFunctionWithKeywords)(PyObject *, PyObject *,
  type PyObject (line 22) | typedef PyObject *(*_PyCFunctionFastWithKeywords) (PyObject *,
  type PyObject (line 25) | typedef PyObject *(*PyNoArgsFunction)(PyObject *);
  type PyMethodDef (line 51) | struct PyMethodDef {
  type PyMethodDef (line 58) | typedef struct PyMethodDef PyMethodDef;
  type PyCFunctionObject (line 97) | typedef struct {

FILE: thirdLibs/python3_8/include/modsupport.h
  type _PyArg_Parser (line 89) | typedef struct _PyArg_Parser {
  type _PyArg_Parser (line 107) | struct _PyArg_Parser
  type _PyArg_Parser (line 117) | struct _PyArg_Parser
  type _PyArg_Parser (line 120) | struct _PyArg_Parser
  type _PyArg_Parser (line 124) | struct _PyArg_Parser
  type PyModuleDef (line 211) | struct PyModuleDef
  type PyModuleDef (line 214) | struct PyModuleDef

FILE: thirdLibs/python3_8/include/moduleobject.h
  type PyModuleDef (line 35) | struct PyModuleDef
  type PyModuleDef (line 40) | struct PyModuleDef
  type PyModuleDef_Base (line 44) | typedef struct PyModuleDef_Base {
  type PyModuleDef_Slot (line 61) | typedef struct PyModuleDef_Slot{
  type PyModuleDef (line 75) | typedef struct PyModuleDef{

FILE: thirdLibs/python3_8/include/node.h
  type node (line 10) | typedef struct _node {

FILE: thirdLibs/python3_8/include/object.h
  type PyObject (line 104) | typedef struct _object {
  type PyVarObject (line 113) | typedef struct {
  type PyObject (line 140) | typedef PyObject * (*unaryfunc)(PyObject *);
  type PyObject (line 141) | typedef PyObject * (*binaryfunc)(PyObject *, PyObject *);
  type PyObject (line 142) | typedef PyObject * (*ternaryfunc)(PyObject *, PyObject *, PyObject *);
  type Py_ssize_t (line 144) | typedef Py_ssize_t (*lenfunc)(PyObject *);
  type PyObject (line 145) | typedef PyObject *(*ssizeargfunc)(PyObject *, Py_ssize_t);
  type PyObject (line 146) | typedef PyObject *(*ssizessizeargfunc)(PyObject *, Py_ssize_t, Py_ssize_t);
  type PyObject (line 158) | typedef PyObject *(*getattrfunc)(PyObject *, char *);
  type PyObject (line 159) | typedef PyObject *(*getattrofunc)(PyObject *, PyObject *);
  type PyObject (line 162) | typedef PyObject *(*reprfunc)(PyObject *);
  type Py_hash_t (line 163) | typedef Py_hash_t (*hashfunc)(PyObject *);
  type PyObject (line 164) | typedef PyObject *(*richcmpfunc) (PyObject *, PyObject *, int);
  type PyObject (line 165) | typedef PyObject *(*getiterfunc) (PyObject *);
  type PyObject (line 166) | typedef PyObject *(*iternextfunc) (PyObject *);
  type PyObject (line 167) | typedef PyObject *(*descrgetfunc) (PyObject *, PyObject *, PyObject *);
  type PyObject (line 170) | typedef PyObject *(*newfunc)(struct _typeobject *, PyObject *, PyObject *);
  type PyObject (line 171) | typedef PyObject *(*allocfunc)(struct _typeobject *, Py_ssize_t);
  type PyTypeObject (line 175) | typedef struct _typeobject PyTypeObject;
  type PyType_Slot (line 180) | typedef struct{
  type PyType_Spec (line 185) | typedef struct{
  type _typeobject (line 198) | struct _typeobject
  type _typeobject (line 202) | struct _typeobject
  type _typeobject (line 202) | struct _typeobject
  type _typeobject (line 206) | struct _typeobject
  type _typeobject (line 207) | struct _typeobject
  type _typeobject (line 208) | struct _typeobject
  type _typeobject (line 210) | struct _typeobject
  type _typeobject (line 216) | struct _typeobject
  type _typeobject (line 217) | struct _typeobject
  type _typeobject (line 218) | struct _typeobject
  type _typeobject (line 221) | struct _typeobject
  type _typeobject (line 409) | struct _typeobject
  type _typeobject (line 410) | struct _typeobject
  function _Py_NewReference (line 436) | static inline void _Py_NewReference(PyObject *op)
  function _Py_ForgetReference (line 446) | static inline void _Py_ForgetReference(PyObject *op)
  function _Py_INCREF (line 456) | static inline void _Py_INCREF(PyObject *op)
  function _Py_DECREF (line 464) | static inline void _Py_DECREF(const char *filename, int lineno,
  function _Py_XINCREF (line 529) | static inline void _Py_XINCREF(PyObject *op)
  function _Py_XDECREF (line 538) | static inline void _Py_XDECREF(PyObject *op)

FILE: thirdLibs/python3_8/include/objimpl.h
  function PyObject (line 136) | static inline PyObject*
  function PyVarObject (line 151) | static inline PyVarObject*

FILE: thirdLibs/python3_8/include/odictobject.h
  type PyODictObject (line 13) | typedef struct _odictobject PyODictObject;

FILE: thirdLibs/python3_8/include/opcode.h
  type cmp_op (line 139) | enum cmp_op {PyCmp_LT=Py_LT, PyCmp_LE=Py_LE, PyCmp_EQ=Py_EQ, PyCmp_NE=Py...

FILE: thirdLibs/python3_8/include/parsetok.h
  type perrdetail (line 13) | typedef struct {

FILE: thirdLibs/python3_8/include/py_curses.h
  type PyCursesWindowObject (line 61) | typedef struct {

FILE: thirdLibs/python3_8/include/pyarena.h
  type PyArena (line 12) | typedef struct _arena PyArena;

FILE: thirdLibs/python3_8/include/pyconfig.h
  type __int64 (line 168) | typedef __int64 ssize_t;
  type _W64 (line 170) | typedef _W64 int ssize_t;
  type pid_t (line 190) | typedef int pid_t;
  type pid_t (line 238) | typedef int pid_t;

FILE: thirdLibs/python3_8/include/pydtrace.h
  function PyDTrace_LINE (line 28) | static inline void PyDTrace_LINE(const char *arg0, const char *arg1, int...
  function PyDTrace_FUNCTION_ENTRY (line 29) | static inline void PyDTrace_FUNCTION_ENTRY(const char *arg0, const char ...
  function PyDTrace_FUNCTION_RETURN (line 30) | static inline void PyDTrace_FUNCTION_RETURN(const char *arg0, const char...
  function PyDTrace_GC_START (line 31) | static inline void PyDTrace_GC_START(int arg0) {}
  function PyDTrace_GC_DONE (line 32) | static inline void PyDTrace_GC_DONE(Py_ssize_t arg0) {}
  function PyDTrace_INSTANCE_NEW_START (line 33) | static inline void PyDTrace_INSTANCE_NEW_START(int arg0) {}
  function PyDTrace_INSTANCE_NEW_DONE (line 34) | static inline void PyDTrace_INSTANCE_NEW_DONE(int arg0) {}
  function PyDTrace_INSTANCE_DELETE_START (line 35) | static inline void PyDTrace_INSTANCE_DELETE_START(int arg0) {}
  function PyDTrace_INSTANCE_DELETE_DONE (line 36) | static inline void PyDTrace_INSTANCE_DELETE_DONE(int arg0) {}
  function PyDTrace_IMPORT_FIND_LOAD_START (line 37) | static inline void PyDTrace_IMPORT_FIND_LOAD_START(const char *arg0) {}
  function PyDTrace_IMPORT_FIND_LOAD_DONE (line 38) | static inline void PyDTrace_IMPORT_FIND_LOAD_DONE(const char *arg0, int ...
  function PyDTrace_AUDIT (line 39) | static inline void PyDTrace_AUDIT(const char *arg0, void *arg1) {}
  function PyDTrace_LINE_ENABLED (line 41) | static inline int PyDTrace_LINE_ENABLED(void) { return 0; }
  function PyDTrace_FUNCTION_ENTRY_ENABLED (line 42) | static inline int PyDTrace_FUNCTION_ENTRY_ENABLED(void) { return 0; }
  function PyDTrace_FUNCTION_RETURN_ENABLED (line 43) | static inline int PyDTrace_FUNCTION_RETURN_ENABLED(void) { return 0; }
  function PyDTrace_GC_START_ENABLED (line 44) | static inline int PyDTrace_GC_START_ENABLED(void) { return 0; }
  function PyDTrace_GC_DONE_ENABLED (line 45) | static inline int PyDTrace_GC_DONE_ENABLED(void) { return 0; }
  function PyDTrace_INSTANCE_NEW_START_ENABLED (line 46) | static inline int PyDTrace_INSTANCE_NEW_START_ENABLED(void) { return 0; }
  function PyDTrace_INSTANCE_NEW_DONE_ENABLED (line 47) | static inline int PyDTrace_INSTANCE_NEW_DONE_ENABLED(void) { return 0; }
  function PyDTrace_INSTANCE_DELETE_START_ENABLED (line 48) | static inline int PyDTrace_INSTANCE_DELETE_START_ENABLED(void) { return ...
  function PyDTrace_INSTANCE_DELETE_DONE_ENABLED (line 49) | static inline int PyDTrace_INSTANCE_DELETE_DONE_ENABLED(void) { return 0; }
  function PyDTrace_IMPORT_FIND_LOAD_START_ENABLED (line 50) | static inline int PyDTrace_IMPORT_FIND_LOAD_START_ENABLED(void) { return...
  function PyDTrace_IMPORT_FIND_LOAD_DONE_ENABLED (line 51) | static inline int PyDTrace_IMPORT_FIND_LOAD_DONE_ENABLED(void) { return ...
  function PyDTrace_AUDIT_ENABLED (line 52) | static inline int PyDTrace_AUDIT_ENABLED(void) { return 0; }

FILE: thirdLibs/python3_8/include/pyexpat.h
  type PyExpat_CAPI (line 9) | struct PyExpat_CAPI

FILE: thirdLibs/python3_8/include/pyhash.h
  type _Py_HashSecret_t (line 54) | typedef union {
  type PyHash_FuncDef (line 87) | typedef struct {

FILE: thirdLibs/python3_8/include/pymath.h
  function __icc_nan (line 167) | __declspec(noinline)

FILE: thirdLibs/python3_8/include/pymem.h
  type _PyTraceMalloc_Config (line 109) | struct _PyTraceMalloc_Config {
  type _PyTraceMalloc_Config (line 131) | struct _PyTraceMalloc_Config

FILE: thirdLibs/python3_8/include/pyport.h
  type Py_uintptr_t (line 97) | typedef uintptr_t       Py_uintptr_t;
  type Py_intptr_t (line 98) | typedef intptr_t        Py_intptr_t;
  type Py_ssize_t (line 105) | typedef ssize_t         Py_ssize_t;
  type Py_intptr_t (line 107) | typedef Py_intptr_t     Py_ssize_t;
  type Py_ssize_t (line 114) | typedef Py_ssize_t Py_hash_t;
  type Py_uhash_t (line 117) | typedef size_t Py_uhash_t;
  type Py_ssize_t (line 121) | typedef Py_ssize_t Py_ssize_clean_t;
  type Py_ssize_clean_t (line 123) | typedef int Py_ssize_clean_t;

FILE: thirdLibs/python3_8/include/pystate.h
  type _frame (line 18) | struct _frame
  type _ts (line 19) | struct _ts
  type _is (line 20) | struct _is
  type PyThreadState (line 23) | typedef struct _ts PyThreadState;
  type PyInterpreterState (line 25) | typedef struct _is PyInterpreterState;
  type PyModuleDef (line 45) | struct PyModuleDef
  type PyModuleDef (line 46) | struct PyModuleDef
  type PyModuleDef (line 48) | struct PyModuleDef
  type PyGILState_STATE (line 80) | typedef

FILE: thirdLibs/python3_8/include/pythonrun.h
  type _mod (line 35) | struct _mod
  type _mod (line 41) | struct _mod
  type _mod (line 47) | struct _mod
  type _mod (line 57) | struct _mod
  type _node (line 75) | struct _node
  type _node (line 78) | struct _node
  type _node (line 82) | struct _node
  type symtable (line 116) | struct symtable
  type symtable (line 128) | struct symtable
  type symtable (line 133) | struct symtable

FILE: thirdLibs/python3_8/include/pythread.h
  type PyLockStatus (line 14) | typedef enum PyLockStatus {
  type Py_tss_t (line 115) | typedef struct _Py_tss_t Py_tss_t;
  type _Py_tss_t (line 135) | struct _Py_tss_t {

FILE: thirdLibs/python3_8/include/pytime.h
  type _PyTime_t (line 19) | typedef int64_t _PyTime_t;
  type _PyTime_round_t (line 23) | typedef enum {
  type timeval (line 123) | struct timeval
  type timeval (line 130) | struct timeval
  type timeval (line 135) | struct timeval
  type timespec (line 153) | struct timespec
  type timespec (line 158) | struct timespec
  type _Py_clock_info_t (line 184) | typedef struct {
  type tm (line 218) | struct tm
  type tm (line 222) | struct tm

FILE: thirdLibs/python3_8/include/setobject.h
  type setentry (line 26) | typedef struct {
  type PySetObject (line 42) | typedef struct {

FILE: thirdLibs/python3_8/include/sliceobject.h
  type PySliceObject (line 22) | typedef struct {

FILE: thirdLibs/python3_8/include/structmember.h
  type PyMemberDef (line 18) | typedef struct PyMemberDef {
  type PyMemberDef (line 67) | struct PyMemberDef
  type PyMemberDef (line 68) | struct PyMemberDef

FILE: thirdLibs/python3_8/include/structseq.h
  type PyStructSequence_Field (line 10) | typedef struct PyStructSequence_Field {
  type PyStructSequence_Desc (line 15) | typedef struct PyStructSequence_Desc {
  type PyTupleObject (line 35) | typedef PyTupleObject PyStructSequence;

FILE: thirdLibs/python3_8/include/symtable.h
  type _Py_block_ty (line 14) | typedef enum _block_type { FunctionBlock, ClassBlock, ModuleBlock }
  type _symtable_entry (line 17) | struct _symtable_entry
  type symtable (line 19) | struct symtable {
  type PySTEntryObject (line 38) | typedef struct _symtable_entry {
  type symtable (line 76) | struct symtable
  type symtable (line 80) | struct symtable
  type symtable (line 84) | struct symtable
  type symtable (line 86) | struct symtable

FILE: thirdLibs/python3_8/include/traceback.h
  type _frame (line 7) | struct _frame
  type _frame (line 11) | struct _frame

FILE: thirdLibs/python3_8/include/ucnhash.h
  type _PyUnicode_Name_CAPI (line 13) | typedef struct {

FILE: thirdLibs/python3_8/include/unicodeobject.h
  type Py_UCS4 (line 102) | typedef uint32_t Py_UCS4;
  type Py_UCS2 (line 103) | typedef uint16_t Py_UCS2;
  type Py_UCS1 (line 104) | typedef uint8_t Py_UCS1;

FILE: thirdLibs/python3_8/include/weakrefobject.h
  type PyWeakReference (line 10) | typedef struct _PyWeakReference PyWeakReference;
  type _PyWeakReference (line 16) | struct _PyWeakReference {
Condensed preview — 528 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,580K chars).
[
  {
    "path": "AudioVideoCore/AudioData.cpp",
    "chars": 24,
    "preview": "#include \"AudioData.h\"\n\n"
  },
  {
    "path": "AudioVideoCore/AudioData.h",
    "chars": 510,
    "preview": "#ifndef AUDIODATA_H\n#define AUDIODATA_H\n\n#include <QWaitCondition>\n#include <QMutex>\n#include <atomic>\n#include <memory>"
  },
  {
    "path": "AudioVideoCore/AudioDecodec.cpp",
    "chars": 5466,
    "preview": "#include \"AudioDecodec.h\"\n#include <QWaitCondition>\n#include <QDebug>\n\nAudioDecodec::AudioDecodec(QObject* parent)\n    :"
  },
  {
    "path": "AudioVideoCore/AudioDecodec.h",
    "chars": 1476,
    "preview": "#ifndef AUDIODECODEC_H\n#define AUDIODECODEC_H\n\nextern \"C\" {\n#include <libavcodec/avcodec.h>\n#include <libavformat/avform"
  },
  {
    "path": "AudioVideoCore/AudioPlayer.cpp",
    "chars": 1236,
    "preview": "#include \"AudioPlayer.h\"\n\nAudioPlayer::AudioPlayer(QObject* parent)\n    :QObject(parent)\n{\n    m_pAudioPlayer = new Audi"
  },
  {
    "path": "AudioVideoCore/AudioPlayer.h",
    "chars": 1046,
    "preview": "#ifndef AUDIOPLAYER_H\n#define AUDIOPLAYER_H\n\n#include <QObject>\n#include \"AudioDecodec.h\"\n#include \"audiovideocore_globa"
  },
  {
    "path": "AudioVideoCore/AudioPlayerThread.cpp",
    "chars": 5668,
    "preview": "#include \"AudioPlayerThread.h\"\n#include \"AudioData.h\"\n#include <QMutexLocker>\n#include <QDebug>\n\nAudioPlayerThread::Audi"
  },
  {
    "path": "AudioVideoCore/AudioPlayerThread.h",
    "chars": 1242,
    "preview": "#ifndef AUDIOPLAYERTHREAD_H\n#define AUDIOPLAYERTHREAD_H\n\n#include <QThread>\n#include <QAudioFormat>\n#include <QAudioOutp"
  },
  {
    "path": "AudioVideoCore/AudioVideoCore.pro",
    "chars": 1564,
    "preview": "#-------------------------------------------------\n#\n# Project created by QtCreator 2020-03-23T14:11:21\n#\n#-------------"
  },
  {
    "path": "AudioVideoCore/audiovideocore_global.h",
    "chars": 282,
    "preview": "#ifndef AUDIOVIDEOCORE_GLOBAL_H\n#define AUDIOVIDEOCORE_GLOBAL_H\n\n#include <QtCore/qglobal.h>\n\n#if defined(AUDIOVIDEOCORE"
  },
  {
    "path": "CustomControls/CustomCombineControl/UICustomColorControl.cpp",
    "chars": 3074,
    "preview": "#include \"UICustomColorControl.h\"\n#include \"UICustomColorControl/UICustomColorWidget.h\"\n#include \"UICustomColorControl/U"
  },
  {
    "path": "CustomControls/CustomCombineControl/UICustomColorControl.h",
    "chars": 1278,
    "preview": "/**\n基本组合控件-颜色控件:\n作者:Douzhq\n日期:2020-01-22\n个人博客:不会飞的纸飞机 http://www.douzhq.cn\n*/\n#ifndef UICUSTOMCOLORCONTROL_H\n#define UIC"
  },
  {
    "path": "CustomControls/CustomCombineControl/UICustomCombineControlBase.cpp",
    "chars": 2816,
    "preview": "#include \"UICustomCombineControlBase.h\"\n#include \"UICustomCore/CustomStyleConfig.h\"\n\nUICustomCombineControlBase::UICusto"
  },
  {
    "path": "CustomControls/CustomCombineControl/UICustomCombineControlBase.h",
    "chars": 1094,
    "preview": "/**\n基本组合控件基类:\n作者:Douzhq\n日期:2020-01-22\n个人博客:不会飞的纸飞机 www.douzhq.cn\n*/\n#ifndef UICUSTOMCOMBINECONTROLBASE_H\n#define UICUSTO"
  },
  {
    "path": "CustomControls/CustomCombineControl/UICustomComboBoxControl.cpp",
    "chars": 1652,
    "preview": "#include \"UICustomComboBoxControl.h\"\n\nUICustomComboBoxControl::UICustomComboBoxControl(QWidget* parent)\n    :UICustomCom"
  },
  {
    "path": "CustomControls/CustomCombineControl/UICustomComboBoxControl.h",
    "chars": 991,
    "preview": "#ifndef UICUSTOMCOMBOBOXCONTROL_H\n#define UICUSTOMCOMBOBOXCONTROL_H\n\n#include \"UICustomCombineControlBase.h\"\n#include \"U"
  },
  {
    "path": "CustomControls/CustomCombineControl/UICustomDateEditControl.cpp",
    "chars": 528,
    "preview": "#include \"UICustomDateEditControl.h\"\n\nUICustomDateEditControl::UICustomDateEditControl(QWidget* parent)\n    :UICustomCom"
  },
  {
    "path": "CustomControls/CustomCombineControl/UICustomDateEditControl.h",
    "chars": 560,
    "preview": "#ifndef UICUSTOMDATEEDITCONTROL_H\n#define UICUSTOMDATEEDITCONTROL_H\n\n#include \"UICustomCombineControlBase.h\"\n#include \"U"
  },
  {
    "path": "CustomControls/CustomCombineControl/UICustomDoubleControl.cpp",
    "chars": 3170,
    "preview": "#include \"UICustomDoubleControl.h\"\n#include \"UICustomSingleControl/UICustomDoubleSpinBox.h\"\n\nUICustomDoubleControl::UICu"
  },
  {
    "path": "CustomControls/CustomCombineControl/UICustomDoubleControl.h",
    "chars": 1191,
    "preview": "/**\n基本组合控件-浮点值控件:\n作者:Douzhq\n日期:2020-01-22\n个人博客:不会飞的纸飞机 www.douzhq.cn\n*/\n#ifndef UICUSTOMDOUBLECONTROL_H\n#define UICUSTOM"
  },
  {
    "path": "CustomControls/CustomCombineControl/UICustomFontComboBoxControl.cpp",
    "chars": 496,
    "preview": "#include \"UICustomFontComboBoxControl.h\"\n#include <QFontComboBox>\n\nUICustomFontComboBoxControl::UICustomFontComboBoxCont"
  },
  {
    "path": "CustomControls/CustomCombineControl/UICustomFontComboBoxControl.h",
    "chars": 473,
    "preview": "#ifndef UICUSTOMFONTCOMBOBOXCONTROL_H\n#define UICUSTOMFONTCOMBOBOXCONTROL_H\n\n#include \"UICustomCombineControlBase.h\"\n#in"
  },
  {
    "path": "CustomControls/CustomCombineControl/UICustomGroupControl.cpp",
    "chars": 4333,
    "preview": "#include \"UICustomGroupControl.h\"\n#include \"UICustomCore/CustomStyleConfig.h\"\n#include <QMouseEvent>\n#include <QPainter>"
  },
  {
    "path": "CustomControls/CustomCombineControl/UICustomGroupControl.h",
    "chars": 2072,
    "preview": "#ifndef UICUSTOMGROUPCONTROL_H\n#define UICUSTOMGROUPCONTROL_H\n\n#include <QWidget>\n#include <QVBoxLayout>\n#include \"UICus"
  },
  {
    "path": "CustomControls/CustomCombineControl/UICustomIntControl.cpp",
    "chars": 2977,
    "preview": "#include \"UICustomIntControl.h\"\n#include \"UICustomSingleControl/UICustomIntSpinBox.h\"\n#include <QDebug>\n\nUICustomIntCont"
  },
  {
    "path": "CustomControls/CustomCombineControl/UICustomIntControl.h",
    "chars": 1091,
    "preview": "/**\n基本组合控件-整形值控件:\n作者:Douzhq\n日期:2020-01-22\n个人博客:不会飞的纸飞机 www.douzhq.cn\n*/\n#ifndef UICUSTOMINTCONTROL_H\n#define UICUSTOMINT"
  },
  {
    "path": "CustomControls/CustomCombineControl/UICustomLineEditControl.cpp",
    "chars": 1371,
    "preview": "#include \"UICustomLineEditControl.h\"\n\nUICustomLineEditControl::UICustomLineEditControl(QWidget* parent)\n    :UICustomCom"
  },
  {
    "path": "CustomControls/CustomCombineControl/UICustomLineEditControl.h",
    "chars": 932,
    "preview": "#ifndef UICUSTOMLINEEDITCONTROL_H\n#define UICUSTOMLINEEDITCONTROL_H\n\n#include \"UICustomCombineControlBase.h\"\n#include \"c"
  },
  {
    "path": "CustomControls/CustomCombineControl/UICustomOrientationControl.cpp",
    "chars": 3124,
    "preview": "#include \"UICustomOrientationControl.h\"\n#include \"UICustomCore/CustomStyleConfig.h\"\n#include <QPainter>\n#include <QMouse"
  },
  {
    "path": "CustomControls/CustomCombineControl/UICustomOrientationControl.h",
    "chars": 1496,
    "preview": "#ifndef UICUSTOMORIENTATIONCONTROL_H\n#define UICUSTOMORIENTATIONCONTROL_H\n\n#include \"UICustomWidgtes/CustomWidget.h\"\n#in"
  },
  {
    "path": "CustomControls/CustomCombineControl/UICustomPostionControl.cpp",
    "chars": 1744,
    "preview": "#include \"UICustomPostionControl.h\"\n\nUICustomPostionControl::UICustomPostionControl(QWidget* parent)\n    :UICustomCombin"
  },
  {
    "path": "CustomControls/CustomCombineControl/UICustomPostionControl.h",
    "chars": 958,
    "preview": "#ifndef UICUSTOMPOSTIONCONTROL_H\n#define UICUSTOMPOSTIONCONTROL_H\n\n#include \"UICustomCombineControlBase.h\"\n#include \"UIC"
  },
  {
    "path": "CustomControls/CustomCombineControl/UICustomSwitchControl.cpp",
    "chars": 925,
    "preview": "#include \"UICustomSwitchControl.h\"\n\nUICustomSwitchControl::UICustomSwitchControl(QWidget* parent)\n    :UICustomCombineCo"
  },
  {
    "path": "CustomControls/CustomCombineControl/UICustomSwitchControl.h",
    "chars": 749,
    "preview": "#ifndef UICUSTOMSWITCHCONTROL_H\n#define UICUSTOMSWITCHCONTROL_H\n\n#include \"UICustomCombineControlBase.h\"\n#include \"UICus"
  },
  {
    "path": "CustomControls/CustomCombineControl/UICustomTextEditTagControl.cpp",
    "chars": 641,
    "preview": "#include \"UICustomTextEditTagControl.h\"\n#include <QLabel>\n\nUICustomTextEditTagControl::UICustomTextEditTagControl(QWidge"
  },
  {
    "path": "CustomControls/CustomCombineControl/UICustomTextEditTagControl.h",
    "chars": 598,
    "preview": "#ifndef UICUSTOMTEXTEDITTAGCONTROL_H\n#define UICUSTOMTEXTEDITTAGCONTROL_H\n\n#include \"UICustomSingleControl/UICustomTextE"
  },
  {
    "path": "CustomControls/CustomCombineControl/UICustomTimeEditControl.cpp",
    "chars": 557,
    "preview": "#include \"UICustomTimeEditControl.h\"\n\nUICustomTimeEditControl::UICustomTimeEditControl(QWidget* parent)\n    :UICustomCom"
  },
  {
    "path": "CustomControls/CustomCombineControl/UICustomTimeEditControl.h",
    "chars": 582,
    "preview": "#ifndef UICUSTOMTIMEEDITCONTROL_H\n#define UICUSTOMTIMEEDITCONTROL_H\n\n#include \"UICustomCombineControlBase.h\"\n#include \"U"
  },
  {
    "path": "CustomControls/CustomControls.pro",
    "chars": 5112,
    "preview": "#-------------------------------------------------\n#\n# Project created by QtCreator 2020-01-13T22:28:08\n#\n#-------------"
  },
  {
    "path": "CustomControls/UICurtomLeftBarControl/UICustomLefTabsControl.h",
    "chars": 739,
    "preview": "#ifndef UICUSTOMLEFTTABSCONTROL_H\n#define UICUSTOMLEFTTABSCONTROL_H\n\n#include \"UICustomWidgtes/CustomWidget.h\"\n#include "
  },
  {
    "path": "CustomControls/UICurtomLeftBarControl/UICustomLeftItemWidget.cpp",
    "chars": 2607,
    "preview": "#include \"UICustomLeftItemWidget.h\"\n#include \"UICustomCore/CustomStyleConfig.h\"\n#include <QPainter>\n\nUICustomLeftItemWid"
  },
  {
    "path": "CustomControls/UICurtomLeftBarControl/UICustomLeftItemWidget.h",
    "chars": 947,
    "preview": "#ifndef UICUSTOMLEFTITEMWIDGET_H\n#define UICUSTOMLEFTITEMWIDGET_H\n\n#include \"UICustomWidgtes/CustomWidget.h\"\n#include \"c"
  },
  {
    "path": "CustomControls/UICurtomLeftBarControl/UICustomLeftTabsControl.cpp",
    "chars": 1387,
    "preview": "#include \"UICustomLefTabsControl.h\"\n#include \"UICustomLeftWidget.h\"\n#include <QSplitter>\n#include <QVBoxLayout>\n\nUICusto"
  },
  {
    "path": "CustomControls/UICurtomLeftBarControl/UICustomLeftWidget.cpp",
    "chars": 1745,
    "preview": "#include \"UICustomLeftWidget.h\"\n#include <QVBoxLayout>\n#include \"UICustomLeftItemWidget.h\"\n#include \"UICustomCore/Custom"
  },
  {
    "path": "CustomControls/UICurtomLeftBarControl/UICustomLeftWidget.h",
    "chars": 689,
    "preview": "#ifndef UICUSTOMLEFTWIDGET_H\n#define UICUSTOMLEFTWIDGET_H\n\n#include \"UICustomWidgtes/CustomWidget.h\"\n#include <QWidget>\n"
  },
  {
    "path": "CustomControls/UICustomColorControl/UICustomColorCircle.cpp",
    "chars": 7697,
    "preview": "#include \"UICustomColorCircle.h\"\n#include \"UICustomCore/CustomStyleConfig.h\"\n#include <QPainter>\n#include <QMouseEvent>\n"
  },
  {
    "path": "CustomControls/UICustomColorControl/UICustomColorCircle.h",
    "chars": 1251,
    "preview": "#ifndef UICUSTOMCOLORRANGE_H\n#define UICUSTOMCOLORRANGE_H\n\n#include \"UICustomWidgtes/CustomWidget.h\"\nclass UICustomColor"
  },
  {
    "path": "CustomControls/UICustomColorControl/UICustomColorSlider.cpp",
    "chars": 2088,
    "preview": "#include \"UICustomColorSlider.h\"\n\nUICustomColorSlider::UICustomColorSlider(QWidget *parent)\n    :UICustomCombineControlB"
  },
  {
    "path": "CustomControls/UICustomColorControl/UICustomColorSlider.h",
    "chars": 1105,
    "preview": "#ifndef UICUSTOMCOLORSLIDER_H\n#define UICUSTOMCOLORSLIDER_H\n\n#include \"UICustomWidgtes/CustomWidget.h\"\n#include \"UICusto"
  },
  {
    "path": "CustomControls/UICustomColorControl/UICustomColorSliderItem.cpp",
    "chars": 4860,
    "preview": "#include \"UICustomColorSliderItem.h\"\n#include <QPainter>\n#include <QMouseEvent>\n\nUICustomColorSliderItem::UICustomColorS"
  },
  {
    "path": "CustomControls/UICustomColorControl/UICustomColorSliderItem.h",
    "chars": 1405,
    "preview": "#ifndef UICUSTOMCOLORSLIDERITEM_H\n#define UICUSTOMCOLORSLIDERITEM_H\n\n#include <QWidget>\n#include \"UICustomWidgtes/Custom"
  },
  {
    "path": "CustomControls/UICustomColorControl/UICustomColorWidget.cpp",
    "chars": 11206,
    "preview": "#include \"UICustomColorWidget.h\"\n#include <QHBoxLayout>\n#include <QPushButton>\n#include <QDebug>\n\nUICustomColorWidget::U"
  },
  {
    "path": "CustomControls/UICustomColorControl/UICustomColorWidget.h",
    "chars": 2120,
    "preview": "#ifndef UICUSTOMCOLORWIDGET_H\n#define UICUSTOMCOLORWIDGET_H\n\n#include \"UICustomWidgtes/CustomWidget.h\"\n#include \"UICusto"
  },
  {
    "path": "CustomControls/UICustomColorControl/UICustomCustomColorOperator.cpp",
    "chars": 2383,
    "preview": "#include \"UICustomCustomColorOperator.h\"\n#include <QDomElement>\n#include <QFile>\n#include <QTextStream>\n#include <QAppli"
  },
  {
    "path": "CustomControls/UICustomColorControl/UICustomCustomColorOperator.h",
    "chars": 510,
    "preview": "#ifndef UICUSTOMCUSTOMCOLOROPERATOR_H\n#define UICUSTOMCUSTOMCOLOROPERATOR_H\n\n#include <QObject>\n#include <QDomDocument>\n"
  },
  {
    "path": "CustomControls/UICustomColorControl/UICustonColorDialog.cpp",
    "chars": 864,
    "preview": "#include \"UICustonColorDialog.h\"\n\nUICustomColorDialog::UICustomColorDialog(QWidget* parent)\n    :CustomDialog(parent)\n{\n"
  },
  {
    "path": "CustomControls/UICustomColorControl/UICustonColorDialog.h",
    "chars": 503,
    "preview": "#ifndef UICUSTOMCONTROLDIALOG_H\n#define UICUSTOMCONTROLDIALOG_H\n\n#include \"UICustomWidgtes/CustomDialog.h\"\n#include \"UIC"
  },
  {
    "path": "CustomControls/UICustomSingleControl/UICustomCalendarWidget.cpp",
    "chars": 191,
    "preview": "#include \"UICustomCalendarWidget.h\"\n\nUICustomCalendarWidget::UICustomCalendarWidget(QWidget* parent)\n    :QCalendarWidge"
  },
  {
    "path": "CustomControls/UICustomSingleControl/UICustomCalendarWidget.h",
    "chars": 270,
    "preview": "#ifndef UICUSTOMCALENDARWIDGET_H\n#define UICUSTOMCALENDARWIDGET_H\n\n#include <QCalendarWidget>\n\nclass UICustomCalendarWid"
  },
  {
    "path": "CustomControls/UICustomSingleControl/UICustomColorViewWidget.cpp",
    "chars": 2543,
    "preview": "#include \"UICustomColorViewWidget.h\"\n#include \"UICustomCore/CustomStyleConfig.h\"\n#include <QPainter>\n#include <QMouseEve"
  },
  {
    "path": "CustomControls/UICustomSingleControl/UICustomColorViewWidget.h",
    "chars": 1250,
    "preview": "#ifndef UICUSTOMCOLORVIEWWIDGET_H\n#define UICUSTOMCOLORVIEWWIDGET_H\n\n#include \"UICustomWidgtes/CustomWidget.h\"\n#include "
  },
  {
    "path": "CustomControls/UICustomSingleControl/UICustomComboBox.cpp",
    "chars": 306,
    "preview": "#include \"UICustomComboBox.h\"\n#include <QListView>\n\nUICustomComboBox::UICustomComboBox(QWidget* parent)\n    :QComboBox(p"
  },
  {
    "path": "CustomControls/UICustomSingleControl/UICustomComboBox.h",
    "chars": 311,
    "preview": "#ifndef UICUSTOMCOMBOBOX_H\n#define UICUSTOMCOMBOBOX_H\n\n#include <QComboBox>\nclass UICustomComboBox : public QComboBox\n{\n"
  },
  {
    "path": "CustomControls/UICustomSingleControl/UICustomDateEdit.cpp",
    "chars": 277,
    "preview": "#include \"UICustomDateEdit.h\"\n#include \"UICustomCalendarWidget.h\"\n\nUICutomDateEdit::UICutomDateEdit(QWidget* parent)\n   "
  },
  {
    "path": "CustomControls/UICustomSingleControl/UICustomDateEdit.h",
    "chars": 224,
    "preview": "#ifndef UICUSTOMDATEEDIT_H\n#define UICUSTOMDATEEDIT_H\n\n#include <QDateEdit>\nclass UICutomDateEdit : public QDateEdit\n{\n "
  },
  {
    "path": "CustomControls/UICustomSingleControl/UICustomDoubleSpinBox.cpp",
    "chars": 426,
    "preview": "#include \"UICustomDoubleSpinBox.h\"\n#include <QKeyEvent>\n\nUICustomDoubleSpinBox::UICustomDoubleSpinBox(QWidget* parent)\n "
  },
  {
    "path": "CustomControls/UICustomSingleControl/UICustomDoubleSpinBox.h",
    "chars": 391,
    "preview": "#ifndef UICUSTOMDOUBLESPINBOX_H\n#define UICUSTOMDOUBLESPINBOX_H\n\n#include <QWidget>\n#include <QDoubleSpinBox>\n\nclass UIC"
  },
  {
    "path": "CustomControls/UICustomSingleControl/UICustomImageViewer.cpp",
    "chars": 2732,
    "preview": "#include \"UICustomImageViewer.h\"\n#include <QPainter>\n#include <QWheelEvent>\n#include <QMouseEvent>\n\nUICustomImageViewer:"
  },
  {
    "path": "CustomControls/UICustomSingleControl/UICustomImageViewer.h",
    "chars": 1075,
    "preview": "#ifndef UICUSTOMIMAGEVIEWER_H\n#define UICUSTOMIMAGEVIEWER_H\n\n#include <QWidget>\n#include \"UICustomWidgtes/CustomWidget.h"
  },
  {
    "path": "CustomControls/UICustomSingleControl/UICustomIntSpinBox.cpp",
    "chars": 393,
    "preview": "#include \"UICustomIntSpinBox.h\"\n#include <QKeyEvent>\n\nUICustomIntSpinBox::UICustomIntSpinBox(QWidget* parent)\n    :QSpin"
  },
  {
    "path": "CustomControls/UICustomSingleControl/UICustomIntSpinBox.h",
    "chars": 426,
    "preview": "#ifndef UICUSTOMINTSPINBOX_H\n#define UICUSTOMINTSPINBOX_H\n\n#include <QWidget>\n#include <QSpinBox>\n#include \"customcontro"
  },
  {
    "path": "CustomControls/UICustomSingleControl/UICustomLineEdit.cpp",
    "chars": 2760,
    "preview": "#include \"UICustomLineEdit.h\"\n#include <QKeyEvent>\n#include <QToolButton>\n#include <QVBoxLayout>\n#include <QPainter>\n#in"
  },
  {
    "path": "CustomControls/UICustomSingleControl/UICustomLineEdit.h",
    "chars": 1292,
    "preview": "#ifndef UICUSTOMLINEEDIT_H\n#define UICUSTOMLINEEDIT_H\n\n#include <QLineEdit>\n#include <QWidget>\n#include \"UICustomWidgtes"
  },
  {
    "path": "CustomControls/UICustomSingleControl/UICustomPostionWidget.cpp",
    "chars": 2886,
    "preview": "#include \"UICustomPostionWidget.h\"\n#include \"UICustomCore/CustomStyleConfig.h\"\n#include <QPainter>\n#include <QMouseEvent"
  },
  {
    "path": "CustomControls/UICustomSingleControl/UICustomPostionWidget.h",
    "chars": 1204,
    "preview": "#ifndef UICUSTOMPOSTIONWIDGET_H\n#define UICUSTOMPOSTIONWIDGET_H\n\n#include \"UICustomWidgtes/CustomWidget.h\"\n#include \"cus"
  },
  {
    "path": "CustomControls/UICustomSingleControl/UICustomSwitchWidget.cpp",
    "chars": 2997,
    "preview": "#include \"UICustomSwitchWidget.h\"\n#include \"UICustomCore/CustomStyleConfig.h\"\n#include <QPainter>\n\nUICustomSwitchWidget:"
  },
  {
    "path": "CustomControls/UICustomSingleControl/UICustomSwitchWidget.h",
    "chars": 1278,
    "preview": "#ifndef UICUSTOMSWITCHWIDGET_H\n#define UICUSTOMSWITCHWIDGET_H\n\n#include <QWidget>\n#include <QTimer>\n#include \"UICustomWi"
  },
  {
    "path": "CustomControls/UICustomSingleControl/UICustomTextEdit.cpp",
    "chars": 520,
    "preview": "#include \"UICustomTextEdit.h\"\n#include <QKeyEvent>\n#include <QDebug>\n\nUICustomTextEdit::UICustomTextEdit(QWidget* parent"
  },
  {
    "path": "CustomControls/UICustomSingleControl/UICustomTextEdit.h",
    "chars": 488,
    "preview": "#ifndef UICUSTOMTEXTEDIT_H\n#define UICUSTOMTEXTEDIT_H\n\n#include <QTextEdit>\n#include <QWidget>\n#include \"customcontrols_"
  },
  {
    "path": "CustomControls/UICustomSingleControl/UICustomTimeEdit.cpp",
    "chars": 155,
    "preview": "#include \"UICustomTimeEdit.h\"\n\nUICustomTimeEdit::UICustomTimeEdit(QWidget* parent)\n    :QTimeEdit(parent)\n{\n\n}\n\nUICustom"
  },
  {
    "path": "CustomControls/UICustomSingleControl/UICustomTimeEdit.h",
    "chars": 247,
    "preview": "#ifndef UICUSTOMTIMEEDIT_H\n#define UICUSTOMTIMEEDIT_H\n\n#include <QTimeEdit>\n#include <QWidget>\n\nclass UICustomTimeEdit :"
  },
  {
    "path": "CustomControls/customcontrols_global.h",
    "chars": 282,
    "preview": "#ifndef CUSTOMCONTROLS_GLOBAL_H\n#define CUSTOMCONTROLS_GLOBAL_H\n\n#include <QtCore/qglobal.h>\n\n#if defined(CUSTOMCONTROLS"
  },
  {
    "path": "CustomWidgets/CustomWidgets.pro",
    "chars": 1664,
    "preview": "#-------------------------------------------------\n#\n# Project created by QtCreator 2020-01-04T20:25:00\n#\n#-------------"
  },
  {
    "path": "CustomWidgets/UICustomCore/CustomStyleConfig.cpp",
    "chars": 1979,
    "preview": "#include \"CustomStyleConfig.h\"\n#include <QApplication>\n#include <QPalette>\n#include <QFile>\n#include <QStyle>\n#include <"
  },
  {
    "path": "CustomWidgets/UICustomCore/CustomStyleConfig.h",
    "chars": 854,
    "preview": "#ifndef CUSTOMSTYLECONFIG_H\n#define CUSTOMSTYLECONFIG_H\n\n#include <QObject>\n#include <QWidget>\n#include \"customwidgets_g"
  },
  {
    "path": "CustomWidgets/UICustomWidgtes/CustomDialog.cpp",
    "chars": 11946,
    "preview": "#include \"CustomDialog.h\"\n#include <QVBoxLayout>\n#include <QPainter>\n#include <QPalette>\n#include <QStyleOption>\n#includ"
  },
  {
    "path": "CustomWidgets/UICustomWidgtes/CustomDialog.h",
    "chars": 2254,
    "preview": "#pragma once\n\n#include <QDialog>\n#include <QWidget>\n#include <QLabel>\n#include <QPushButton>\n#include \"customwidgets_glo"
  },
  {
    "path": "CustomWidgets/UICustomWidgtes/CustomMainWindow.cpp",
    "chars": 162,
    "preview": "#include \"CustomMainWindow.h\"\n\nCustomMainWindow::CustomMainWindow(QWidget *parent)\n    : QMainWindow(parent)\n{\n    \n}\n\nC"
  },
  {
    "path": "CustomWidgets/UICustomWidgtes/CustomMainWindow.h",
    "chars": 185,
    "preview": "#pragma once\n\n#include <QMainWindow>\n\nclass CustomMainWindow : public QMainWindow\n{\n    Q_OBJECT\n\npublic:\n    CustomMain"
  },
  {
    "path": "CustomWidgets/UICustomWidgtes/CustomTestWidget.cpp",
    "chars": 7827,
    "preview": "#include \"CustomTestWidget.h\"\n#include <QTabWidget>\n#include <QPushButton>\n#include <QComboBox>\n#include <QLineEdit>\n#in"
  },
  {
    "path": "CustomWidgets/UICustomWidgtes/CustomTestWidget.h",
    "chars": 510,
    "preview": "#ifndef CUSTOMT_TEST_WIDGET_H\n#define CUSTOMT_TEST_WIDGET_H\n\n#include <QWidget>\n#include \"CustomWidget.h\"\nclass QTabWidg"
  },
  {
    "path": "CustomWidgets/UICustomWidgtes/CustomWidget.cpp",
    "chars": 578,
    "preview": "#include \"CustomWidget.h\"\n#include \"UICustomCore/CustomStyleConfig.h\"\n#include <QStyleOption>\n#include <QPainter>\n\nCusto"
  },
  {
    "path": "CustomWidgets/UICustomWidgtes/CustomWidget.h",
    "chars": 399,
    "preview": "#ifndef CUSTOMWIDGET_H\n#define CUSTOMWIDGET_H\n\n#include <QWidget>\n#include \"customwidgets_global.h\"\nclass CUSTOMWIDGETSS"
  },
  {
    "path": "CustomWidgets/customwidgets_global.h",
    "chars": 276,
    "preview": "#ifndef CUSTOMWIDGETS_GLOBAL_H\n#define CUSTOMWIDGETS_GLOBAL_H\n\n#include <QtCore/qglobal.h>\n\n#if defined(CUSTOMWIDGETS_LI"
  },
  {
    "path": "CustomWidgets/qss/light.css",
    "chars": 16926,
    "preview": "/*标题*/\nQWidget[LightStyleProperty='DefaultTitleBar']\n{\n    background-color: rgb(84, 126, 172);\n}\n\n/*通用的Widget*/\nQWidget"
  },
  {
    "path": "CustomWidgets/qss.qrc",
    "chars": 1989,
    "preview": "<RCC>\n    <qresource prefix=\"/\">\n        <file>qss/light.css</file>\n        <file>qss/images/add_bottom.png</file>\n     "
  },
  {
    "path": "EasyCanvas/EasyCanvas.pro",
    "chars": 3268,
    "preview": "#-------------------------------------------------\n#\n# Project created by QtCreator 2020-03-20T10:38:32\n#\n#-------------"
  },
  {
    "path": "EasyCanvas/GlobalHotKey/GlobalHotKeyFilter.cpp",
    "chars": 679,
    "preview": "#include \"GlobalHotKeyFilter.h\"\n#include \"GlobalHotKeyInfo.h\"\n#include \"GlobalHotKeyManager.h\"\n#include <Windows.h>\n#inc"
  },
  {
    "path": "EasyCanvas/GlobalHotKey/GlobalHotKeyFilter.h",
    "chars": 497,
    "preview": "#ifndef GLOBALHOTKEYFILTER_\n#define GLOBALHOTKEYFILTER_\n\n#include <QObject>\n#include <QAbstractNativeEventFilter>\n\nclass"
  },
  {
    "path": "EasyCanvas/GlobalHotKey/GlobalHotKeyInfo.cpp",
    "chars": 522,
    "preview": "#include \"GlobalHotKeyInfo.h\"\n\nint GlobalHotKeyInfo::m_nTotalKey = 0;\n\nGlobalHotKeyInfo* GlobalHotKeyInfo::createInstanc"
  },
  {
    "path": "EasyCanvas/GlobalHotKey/GlobalHotKeyInfo.h",
    "chars": 1041,
    "preview": "#ifndef GLOBALHOTKEYINFO_H\n#define GLOBALHOTKEYINFO_H\n\n#include <QObject>\n#include <QWidget>\nclass GlobalHotKeyManager;\n"
  },
  {
    "path": "EasyCanvas/GlobalHotKey/GlobalHotKeyManager.cpp",
    "chars": 6604,
    "preview": "#include \"GlobalHotKeyManager.h\"\n#include \"GlobalHotKeyFilter.h\"\n#include <QDebug>\n#include <Windows.h>\n#include <QAppli"
  },
  {
    "path": "EasyCanvas/GlobalHotKey/GlobalHotKeyManager.h",
    "chars": 772,
    "preview": "#ifndef GLOBALHOTKEYMANAGER_H\n#define GLOBALHOTKEYMANAGER_H\n\n#include <QObject>\n#include <QSet>\n#include <QSharedPointer"
  },
  {
    "path": "EasyCanvas/UICore/MainWindow.cpp",
    "chars": 16359,
    "preview": "#include \"MainWindow.h\"\n#include <QGraphicsScene>\n#include <QVBoxLayout>\n#include <QPushButton>\n#include <QGraphicsTextI"
  },
  {
    "path": "EasyCanvas/UICore/MainWindow.h",
    "chars": 2033,
    "preview": "#ifndef WIDGET_H\n#define WIDGET_H\n\n#include <QWidget>\n#include <QMainWindow>\n#include <QUndoView>\n#include \"UICanvas/UIC"
  },
  {
    "path": "EasyCanvas/UICore/UIAboutMeDialog.cpp",
    "chars": 429,
    "preview": "#include \"UIAboutMeDialog.h\"\n#include <QApplication>\n\nUIAboutMeDialog::UIAboutMeDialog(QWidget* parent)\n    :CustomDialo"
  },
  {
    "path": "EasyCanvas/UICore/UIAboutMeDialog.h",
    "chars": 384,
    "preview": "#ifndef UIABOUITMEDIALOG_H\n#define UIABOUITMEDIALOG_H\n\n#include <QWidget>\n#include \"UICustomWidgtes/CustomDialog.h\"\n#inc"
  },
  {
    "path": "EasyCanvas/UICore/UIAttributWidget.cpp",
    "chars": 648,
    "preview": "#include \"UIAttributWidget.h\"\n#include \"NDNodeBase.h\"\n#include \"UINodeAttrControl.h\"\n\nUIAttributeWidget::UIAttributeWidg"
  },
  {
    "path": "EasyCanvas/UICore/UIAttributWidget.h",
    "chars": 421,
    "preview": "#ifndef UIATTRIBUTEWIDGET_H\n#define UIATTRIBUTEWIDGET_H\n\n#include <QWidget>\n#include <QVBoxLayout>\nclass NDNodeBase;\ncla"
  },
  {
    "path": "EasyCanvas/main.cpp",
    "chars": 1617,
    "preview": "#include <QApplication>\n#include <QDebug>\n#include <iostream>\n#include <stdio.h>\n#include <stdlib.h>\n#include <QFile>\n#i"
  },
  {
    "path": "EasyCanvas.pro",
    "chars": 263,
    "preview": "TEMPLATE = subdirs\n\nSUBDIRS += \\\n    Utils \\\n    CustomWidgets \\\n    CustomControls \\\n    NDNodeAttribute \\\n    NodeAttr"
  },
  {
    "path": "EasyCanvasCore/EasyCanvasCore.pro",
    "chars": 3887,
    "preview": "#-------------------------------------------------\n#\n# Project created by QtCreator 2020-08-03T18:18:55\n#\n#-------------"
  },
  {
    "path": "EasyCanvasCore/Scheme/CanvasSchemeManager.cpp",
    "chars": 4199,
    "preview": "#include \"CanvasSchemeManager.h\"\n#include \"SQLCore.h\"\n#include \"UICanvas/UICanvasItemManager.h\"\n#include \"UICanvas/UICan"
  },
  {
    "path": "EasyCanvasCore/Scheme/CanvasSchemeManager.h",
    "chars": 1396,
    "preview": "#ifndef CANVASSCHEMEMANAGER_H\n#define CANVASSCHEMEMANAGER_H\n\n#include <QObject>\n#include <QDateTime>\n#include <QSet>\n#in"
  },
  {
    "path": "EasyCanvasCore/Scheme/SQLCore.cpp",
    "chars": 11383,
    "preview": "#include \"SQLCore.h\"\n#include <QSqlDatabase>\n#include <QSqlQuery>\n#include <QDebug>\n#include <QSqlError>\n#include <QJson"
  },
  {
    "path": "EasyCanvasCore/Scheme/SQLCore.h",
    "chars": 1251,
    "preview": "#ifndef SQLCORE_H\n#define SQLCORE_H\n\n#include <QObject>\n#include <QDateTime>\n#include <set>\n#include \"SchemeDataInfo.h\"\n"
  },
  {
    "path": "EasyCanvasCore/Scheme/SchemeDataInfo.h",
    "chars": 882,
    "preview": "#ifndef SCHEMEDATAINFO\n#define SCHEMEDATAINFO\n\n#include <QDateTime>\n#include <QString>\n#include <QImage>\n#include <QCore"
  },
  {
    "path": "EasyCanvasCore/Scheme/UISchemeManagerDialog.cpp",
    "chars": 2275,
    "preview": "#include \"UISchemeManagerDialog.h\"\n#include \"UISchemeManagerWidget.h\"\n#include \"CanvasSchemeManager.h\"\n#include \"UICanva"
  },
  {
    "path": "EasyCanvasCore/Scheme/UISchemeManagerDialog.h",
    "chars": 575,
    "preview": "#ifndef UISCHEMEMANAGERDIALOG_H\n#define UISCHEMEMANAGERDIALOG_H\n\n#include \"UICustomWidgtes/CustomDialog.h\"\n#include \"eas"
  },
  {
    "path": "EasyCanvasCore/Scheme/UISchemeManagerWidget.cpp",
    "chars": 6096,
    "preview": "#include \"UISchemeManagerWidget.h\"\n#include \"CanvasSchemeManager.h\"\n#include \"SchemeDataInfo.h\"\n#include <QStandardItem>"
  },
  {
    "path": "EasyCanvasCore/Scheme/UISchemeManagerWidget.h",
    "chars": 2193,
    "preview": "#ifndef UISCHEMEMANAGERWIDGET_H\n#define UISCHEMEMANAGERWIDGET_H\n\n#include <QListView>\n#include <QWidget>\n#include <QStan"
  },
  {
    "path": "EasyCanvasCore/UICanvas/UICanvasAudioItem.cpp",
    "chars": 6800,
    "preview": "#include \"UICanvasAudioItem.h\"\n#include <QPainter>\n#include <QLinearGradient>\n#include \"Utils.h\"\n#include \"NDStringAttri"
  },
  {
    "path": "EasyCanvasCore/UICanvas/UICanvasAudioItem.h",
    "chars": 1315,
    "preview": "#ifndef UICANVASAUDIOITEM_H\n#define UICANVASAUDIOITEM_H\n\n#include \"UICanvasItemBase.h\"\n#include <QGraphicsItem>\n\nclass N"
  },
  {
    "path": "EasyCanvasCore/UICanvas/UICanvasEllipseItem.cpp",
    "chars": 4348,
    "preview": "#include \"UICanvasEllipseItem.h\"\n#include \"NDNodeBase.h\"\n#include \"NDBoolAttribute.h\"\n#include \"NDIntAttribute.h\"\n#inclu"
  },
  {
    "path": "EasyCanvasCore/UICanvas/UICanvasEllipseItem.h",
    "chars": 1129,
    "preview": "#ifndef UICANVASELLIPSEITEM_H\n#define UICANVASELLIPSEITEM_H\n\n#include \"UICanvasItemBase.h\"\n#include <QGraphicsItem>\n\ncla"
  },
  {
    "path": "EasyCanvasCore/UICanvas/UICanvasImageItem.cpp",
    "chars": 2853,
    "preview": "#include \"UICanvasImageItem.h\"\n#include \"NDStringAttribute.h\"\n#include \"NDNodeBase.h\"\n#include <QPainter>\n#include <QFil"
  },
  {
    "path": "EasyCanvasCore/UICanvas/UICanvasImageItem.h",
    "chars": 767,
    "preview": "#ifndef UICANVASIMAGEITEM_H\n#define UICANVASIMAGEITEM_H\n\n#include \"UICanvasItemBase.h\"\n#include <QPixmap>\n\nclass NDStrin"
  },
  {
    "path": "EasyCanvasCore/UICanvas/UICanvasItemBase.cpp",
    "chars": 17987,
    "preview": "#include \"UICanvasItemBase.h\"\n#include \"Utils.h\"\n#include <QPainter>\n#include <QGraphicsSceneMouseEvent>\n#include <QDebu"
  },
  {
    "path": "EasyCanvasCore/UICanvas/UICanvasItemBase.h",
    "chars": 4104,
    "preview": "#ifndef UICANVASITEMBASE_H\n#define UICANVASITEMBASE_H\n\n#include <QObject>\n#include <QGraphicsItem>\n#include <QPixmap>\n#i"
  },
  {
    "path": "EasyCanvasCore/UICanvas/UICanvasItemManager.cpp",
    "chars": 15486,
    "preview": "#include \"UICanvasItemManager.h\"\n#include \"UICanvasItemBase.h\"\n#include \"NDNodeBase.h\"\n#include \"UICanvasRectItem.h\"\n#in"
  },
  {
    "path": "EasyCanvasCore/UICanvas/UICanvasItemManager.h",
    "chars": 4305,
    "preview": "#ifndef UICANVASITEMMANAGER_H\n#define UICANVASITEMMANAGER_H\n\n#include <QObject>\n#include <QMap>\n#include <QList>\n#includ"
  },
  {
    "path": "EasyCanvasCore/UICanvas/UICanvasOperators.cpp",
    "chars": 11002,
    "preview": "#include \"UICanvasOperators.h\"\n#include \"UICanvasView.h\"\n#include \"UICanvasPathItem.h\"\n#include \"UICanvas/UICanvasItemMa"
  },
  {
    "path": "EasyCanvasCore/UICanvas/UICanvasOperators.h",
    "chars": 2825,
    "preview": "#ifndef UICANVASOPERATORS_H\n#define UICANVASOPERATORS_H\n\n#include <QPointF>\n#include <QGraphicsItem>\nclass UICanvasView;"
  },
  {
    "path": "EasyCanvasCore/UICanvas/UICanvasPathItem.cpp",
    "chars": 4114,
    "preview": "#include \"UICanvasPathItem.h\"\n#include \"NDIntAttribute.h\"\n#include \"NDColorAttribute.h\"\n#include \"NDNodeBase.h\"\n#include"
  },
  {
    "path": "EasyCanvasCore/UICanvas/UICanvasPathItem.h",
    "chars": 1244,
    "preview": "#ifndef UICANVASPATHITEM_H\n#define UICANVASPATHITEM_H\n\n#include \"UICanvasItemBase.h\"\n#include <QPainterPath>\n#include <Q"
  },
  {
    "path": "EasyCanvasCore/UICanvas/UICanvasRectItem.cpp",
    "chars": 4298,
    "preview": "#include \"UICanvasRectItem.h\"\n#include \"NDNodeBase.h\"\n#include \"NDBoolAttribute.h\"\n#include \"NDIntAttribute.h\"\n#include "
  },
  {
    "path": "EasyCanvasCore/UICanvas/UICanvasRectItem.h",
    "chars": 1067,
    "preview": "#ifndef UICANVASRECTITEM_H\n#define UICANVASRECTITEM_H\n\n#include \"UICanvasItemBase.h\"\n\nclass NDBoolAttribute;\nclass NDCol"
  },
  {
    "path": "EasyCanvasCore/UICanvas/UICanvasScene.cpp",
    "chars": 3235,
    "preview": "#include \"UICanvasScene.h\"\n#include \"NDNodeBase.h\"\n#include \"NDIntAttribute.h\"\n#include \"NDColorAttribute.h\"\n#include \"U"
  },
  {
    "path": "EasyCanvasCore/UICanvas/UICanvasScene.h",
    "chars": 1044,
    "preview": "#ifndef UICANVASSCENE_H\n#define UICANVASSCENE_H\n\n#include <QGraphicsScene>\nclass NDNodeBase;\nclass NDIntAttribute;\nclass"
  },
  {
    "path": "EasyCanvasCore/UICanvas/UICanvasTextItem.cpp",
    "chars": 6823,
    "preview": "#include \"UICanvasTextItem.h\"\n#include \"NDNodeBase.h\"\n#include \"NDBoolAttribute.h\"\n#include \"NDIntAttribute.h\"\n#include "
  },
  {
    "path": "EasyCanvasCore/UICanvas/UICanvasTextItem.h",
    "chars": 1623,
    "preview": "#ifndef UICANVASTEXTITEM_H\n#define UICANVASTEXTITEM_H\n\n#include <QGraphicsItem>\n#include <QFont>\n#include \"UICanvasItemB"
  },
  {
    "path": "EasyCanvasCore/UICanvas/UICanvasView.cpp",
    "chars": 7014,
    "preview": "#include \"UICanvasView.h\"\n#include \"UICanvasImageItem.h\"\n#include <QGraphicsRectItem>\n#include <QMouseEvent>\n#include \"U"
  },
  {
    "path": "EasyCanvasCore/UICanvas/UICanvasView.h",
    "chars": 2478,
    "preview": "#ifndef UICANVASVIEW_H\n#define UICANVASVIEW_H\n\n#include <QGraphicsView>\n#include <QGraphicsScene>\n#include <QSharedPoint"
  },
  {
    "path": "EasyCanvasCore/UINodeTree/UINodeItem.cpp",
    "chars": 2481,
    "preview": "#include \"UINodeItem.h\"\n\nUINodeItem::UINodeItem(UINodeItem* parentItem)\n    :QObject(parentItem)\n{\n    m_pParentItem = p"
  },
  {
    "path": "EasyCanvasCore/UINodeTree/UINodeItem.h",
    "chars": 1236,
    "preview": "#ifndef UINODEITEM_H\n#define UINODEITEM_H\n\n#include <QObject>\n#include <QString>\n#include <QVector>\n\nclass UINodeItem : "
  },
  {
    "path": "EasyCanvasCore/UINodeTree/UINodeSortFilterProxyModel.cpp",
    "chars": 1235,
    "preview": "#include \"UINodeSortFilterProxyModel.h\"\n#include \"UINodeItem.h\"\n\nUINodeSortFilterProxyModel::UINodeSortFilterProxyModel("
  },
  {
    "path": "EasyCanvasCore/UINodeTree/UINodeSortFilterProxyModel.h",
    "chars": 520,
    "preview": "#ifndef UINODESORTFILTERPROXYMODEL_H\n#define UINODESORTFILTERPROXYMODEL_H\n\n#include <QSortFilterProxyModel>\n#include <QO"
  },
  {
    "path": "EasyCanvasCore/UINodeTree/UINodeTreeDelegate.cpp",
    "chars": 2086,
    "preview": "#include \"UINodeTreeDelegate.h\"\n#include \"UINodeItem.h\"\n#include \"UINodeSortFilterProxyModel.h\"\n#include <QLineEdit>\n\nUI"
  },
  {
    "path": "EasyCanvasCore/UINodeTree/UINodeTreeDelegate.h",
    "chars": 832,
    "preview": "#ifndef UINODETREEDELEGATE_H\n#define UINODETREEDELEGATE_H\n\n#include <QStyledItemDelegate>\n\nclass UINodeSortFilterProxyMo"
  },
  {
    "path": "EasyCanvasCore/UINodeTree/UINodeTreeView.cpp",
    "chars": 4055,
    "preview": "#include \"UINodeTreeView.h\"\n#include \"UINodeTreeViewModel.h\"\n#include \"UINodeTreeDelegate.h\"\n#include \"UICanvas/UICanvas"
  },
  {
    "path": "EasyCanvasCore/UINodeTree/UINodeTreeView.h",
    "chars": 888,
    "preview": "#ifndef UINODETREEVIEW_H\n#define UINODETREEVIEW_H\n\n#include <QTreeView>\n#include <QWidget>\n#include \"easycanvascore_glob"
  },
  {
    "path": "EasyCanvasCore/UINodeTree/UINodeTreeViewModel.cpp",
    "chars": 6602,
    "preview": "#include \"UINodeTreeViewModel.h\"\n#include \"UINodeItem.h\"\n#include \"UICanvas/UICanvasItemManager.h\"\n#include \"UINodeTreeV"
  },
  {
    "path": "EasyCanvasCore/UINodeTree/UINodeTreeViewModel.h",
    "chars": 1550,
    "preview": "#ifndef UINODETREEVIEWMODEL_H\n#define UINODETREEVIEWMODEL_H\n\n#include <QAbstractItemModel>\n#include <QTreeView>\n\nclass U"
  },
  {
    "path": "EasyCanvasCore/UINodeTree/UINodeTreeWidget.cpp",
    "chars": 1291,
    "preview": "#include \"UINodeTreeWidget.h\"\n#include <QVBoxLayout>\n#include <QLineEdit>\n#include <QLabel>\n#include <QAction>\n#include "
  },
  {
    "path": "EasyCanvasCore/UINodeTree/UINodeTreeWidget.h",
    "chars": 517,
    "preview": "#ifndef UINODETREEWIDGET_H\n#define UINODETREEWIDGET_H\n\n#include <QWidget>\n#include \"easycanvascore_global.h\"\nclass UINod"
  },
  {
    "path": "EasyCanvasCore/UndoCmd/ItemAttributeChangedCmd.cpp",
    "chars": 2372,
    "preview": "#include \"ItemAttributeChangedCmd.h\"\n#include \"NDAttributeBase.h\"\n\nItemAttributeChangedCmd::ItemAttributeChangedCmd(cons"
  },
  {
    "path": "EasyCanvasCore/UndoCmd/ItemAttributeChangedCmd.h",
    "chars": 787,
    "preview": "#ifndef ITEMATTRIBUTECHANGEDCMD_H\n#define ITEMATTRIBUTECHANGEDCMD_H\n\n#include <QUndoCommand>\n#include <QVariant>\n#includ"
  },
  {
    "path": "EasyCanvasCore/UndoCmd/ItemChangeNameCmd.cpp",
    "chars": 746,
    "preview": "#include \"ItemChangeNameCmd.h\"\n#include \"UICanvas/UICanvasItemBase.h\"\n#include \"NDNodeBase.h\"\n#include \"UICanvas/UICanva"
  },
  {
    "path": "EasyCanvasCore/UndoCmd/ItemChangeNameCmd.h",
    "chars": 484,
    "preview": "#ifndef ITEMCNANGENAMECMD_H\n#define ITEMCNANGENAMECMD_H\n\n#include <QUndoCommand>\n#include <QSharedPointer>\n\nclass UICanv"
  },
  {
    "path": "EasyCanvasCore/UndoCmd/ItemCreateCmd.cpp",
    "chars": 921,
    "preview": "#include \"ItemCreateCmd.h\"\n#include \"UICanvas/UICanvasItemManager.h\"\n#include \"UICanvas/UICanvasItemBase.h\"\n\nItemCreateC"
  },
  {
    "path": "EasyCanvasCore/UndoCmd/ItemCreateCmd.h",
    "chars": 386,
    "preview": "#ifndef ITEMCREATECMD_H\n#define ITEMCREATECMD_H\n\n#include <QUndoCommand>\n#include <QSharedPointer>\n\nclass UICanvasItemBa"
  },
  {
    "path": "EasyCanvasCore/UndoCmd/ItemDeleteCmd.cpp",
    "chars": 1071,
    "preview": "#include \"ItemDeleteCmd.h\"\n#include \"UICanvas/UICanvasItemManager.h\"\n#include \"UICanvas/UICanvasItemBase.h\"\n#include \"ND"
  },
  {
    "path": "EasyCanvasCore/UndoCmd/ItemDeleteCmd.h",
    "chars": 416,
    "preview": "#ifndef ITEMDELETECMD_H\n#define ITEMDELETECMD_H\n\n#include <QUndoCommand>\n#include <QSharedPointer>\n\nclass UICanvasItemBa"
  },
  {
    "path": "EasyCanvasCore/UndoCmd/ItemPasteCmd.cpp",
    "chars": 762,
    "preview": "#include \"ItemPasteCmd.h\"\n#include \"UICanvas/UICanvasItemManager.h\"\n#include \"UICanvas/UICanvasItemBase.h\"\n\nItemPasteCmd"
  },
  {
    "path": "EasyCanvasCore/UndoCmd/ItemPasteCmd.h",
    "chars": 365,
    "preview": "#ifndef ITEMPASTECMD_H\n#define ITEMPASTECMD_H\n\n#include <QUndoCommand>\n#include <QSharedPointer>\n\nclass UICanvasItemBase"
  },
  {
    "path": "EasyCanvasCore/UndoCmd/UndoCmdCore.cpp",
    "chars": 3363,
    "preview": "#include \"UndoCmdCore.h\"\n#include \"ItemCreateCmd.h\"\n#include \"ItemDeleteCmd.h\"\n#include \"ItemChangeNameCmd.h\"\n#include \""
  },
  {
    "path": "EasyCanvasCore/UndoCmd/UndoCmdCore.h",
    "chars": 1434,
    "preview": "#ifndef UNDOCMDCORE_H\n#define UNDOCMDCORE_H\n\n#include <QObject>\n#include <QUndoStack>\n#include <QUndoView>\n#include \"eas"
  },
  {
    "path": "EasyCanvasCore/easycanvascore_global.h",
    "chars": 282,
    "preview": "#ifndef EASYCANVASCORE_GLOBAL_H\n#define EASYCANVASCORE_GLOBAL_H\n\n#include <QtCore/qglobal.h>\n\n#if defined(EASYCANVASCORE"
  },
  {
    "path": "EasyCanvas_zh_CH.ts",
    "chars": 42116,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"zh_CN\">\n<context>\n    <name>ColorContro"
  },
  {
    "path": "NDNodeAttribute/NDAttributeBase.cpp",
    "chars": 3845,
    "preview": "#include \"NDAttributeBase.h\"\n#include \"NDBoolAttribute.h\"\n#include \"NDRealAttribute.h\"\n#include \"NDColorAttribute.h\"\n#in"
  },
  {
    "path": "NDNodeAttribute/NDAttributeBase.h",
    "chars": 2044,
    "preview": "#ifndef NDATTRIBUTEBASE_H\n#define NDATTRIBUTEBASE_H\n\n#include <QObject>\n#include <QVariant>\n#include \"ndnodeattribute_gl"
  },
  {
    "path": "NDNodeAttribute/NDAttributeData.cpp",
    "chars": 861,
    "preview": "#include \"NDAttributeData.h\"\n\nNDAttributeData::NDAttributeData()\n{\n\n}\n\nNDAttributeData::~NDAttributeData()\n{\n\n}\n\nvoid ND"
  },
  {
    "path": "NDNodeAttribute/NDAttributeData.h",
    "chars": 835,
    "preview": "#ifndef NDATTRIBUTEDATA_H\n#define NDATTRIBUTEDATA_H\n\n#include <QObject>\n#include <QColor>\n#include <QList>\n#include <QSt"
  },
  {
    "path": "NDNodeAttribute/NDAttributeGroup.cpp",
    "chars": 1567,
    "preview": "#include \"NDAttributeGroup.h\"\n#include \"NDAttributeBase.h\"\n#include \"NDNodeBase.h\"\n\nNDAttributeGroup::NDAttributeGroup(Q"
  },
  {
    "path": "NDNodeAttribute/NDAttributeGroup.h",
    "chars": 1019,
    "preview": "#ifndef NDATTRIBUTEGROUP_H\n#define NDATTRIBUTEGROUP_H\n\n#include <QObject>\n#include \"ndnodeattribute_global.h\"\n\nclass NDA"
  },
  {
    "path": "NDNodeAttribute/NDBoolAttribute.cpp",
    "chars": 213,
    "preview": "#include \"NDBoolAttribute.h\"\n#include \"NDNodeManager.h\"\n\nNDBoolAttribute::NDBoolAttribute(NDNodeBase *parentNode)\n    :N"
  },
  {
    "path": "NDNodeAttribute/NDBoolAttribute.h",
    "chars": 381,
    "preview": "#ifndef NDBOOLATTRIBTE_H\n#define NDBOOLATTRIBTE_H\n\n#include \"NDAttributeBase.h\"\n#include \"ndnodeattribute_global.h\"\n\ncla"
  },
  {
    "path": "NDNodeAttribute/NDColorAttribute.cpp",
    "chars": 256,
    "preview": "#include \"NDColorAttribute.h\"\n#include \"NDNodeManager.h\"\n#include <QColor>\n\nNDColorAttribute::NDColorAttribute(NDNodeBas"
  },
  {
    "path": "NDNodeAttribute/NDColorAttribute.h",
    "chars": 407,
    "preview": "#ifndef NDCOLORATTRIBUTE_H\n#define NDCOLORATTRIBUTE_H\n\n#include \"NDAttributeBase.h\"\n#include \"ndnodeattribute_global.h\"\n"
  },
  {
    "path": "NDNodeAttribute/NDIntAttribute.cpp",
    "chars": 469,
    "preview": "#include \"NDIntAttribute.h\"\n#include \"NDNodeManager.h\"\n\nNDIntAttribute::NDIntAttribute(NDNodeBase* parentNode)\n    :NDAt"
  },
  {
    "path": "NDNodeAttribute/NDIntAttribute.h",
    "chars": 555,
    "preview": "#ifndef NDINTATTRIBUTE_H\n#define NDINTATTRIBUTE_H\n\n#include \"NDAttributeBase.h\"\n#include \"ndnodeattribute_global.h\"\nclas"
  },
  {
    "path": "NDNodeAttribute/NDNodeAttribute.pro",
    "chars": 1972,
    "preview": "#-------------------------------------------------\n#\n# Project created by QtCreator 2020-01-27T11:54:33\n#\n#-------------"
  },
  {
    "path": "NDNodeAttribute/NDNodeBase.cpp",
    "chars": 3667,
    "preview": "#include \"NDNodeBase.h\"\n\nNDNodeBase::NDNodeBase(NodeType type, QObject* parent)\n    :QObject(parent)\n    ,m_nodeType(typ"
  },
  {
    "path": "NDNodeAttribute/NDNodeBase.h",
    "chars": 1724,
    "preview": "#ifndef NDNODEBASE_H\n#define NDNODEBASE_H\n\n#include <QObject>\n#include \"NDAttributeBase.h\"\n#include \"NDAttributeGroup.h\""
  },
  {
    "path": "NDNodeAttribute/NDNodeManager.cpp",
    "chars": 445,
    "preview": "#include \"NDNodeManager.h\"\n#include \"NDTextNode.h\"\n\nNDNodeManager::NDNodeManager(QObject* parent)\n    :QObject(parent)\n{"
  },
  {
    "path": "NDNodeAttribute/NDNodeManager.h",
    "chars": 667,
    "preview": "#ifndef NDNODEMANAGER_H\n#define NDNODEMANAGER_H\n\n#include <QObject>\n#include <QList>\n#include <QString>\n\n#include \"NDNod"
  },
  {
    "path": "NDNodeAttribute/NDPostionAttribute.cpp",
    "chars": 519,
    "preview": "#include \"NDPostionAttribute.h\"\n\nNDPostionAttribute::NDPostionAttribute(NDNodeBase *parentNode)\n    :NDAttributeBase(par"
  },
  {
    "path": "NDNodeAttribute/NDPostionAttribute.h",
    "chars": 538,
    "preview": "#ifndef NDPOSTIONATTRIBUTE_H\n#define NDPOSTIONATTRIBUTE_H\n\n#include \"NDAttributeBase.h\"\n#include <QPoint>\nclass NDPostio"
  },
  {
    "path": "NDNodeAttribute/NDRealAttribute.cpp",
    "chars": 503,
    "preview": "#include \"NDRealAttribute.h\"\n#include \"Utils.h\"\n#include \"NDNodeManager.h\"\n\nNDRealAttribute::NDRealAttribute(NDNodeBase*"
  },
  {
    "path": "NDNodeAttribute/NDRealAttribute.h",
    "chars": 601,
    "preview": "#ifndef NDREALATTRIBUTE_H\n#define NDREALATTRIBUTE_H\n\n#include \"NDAttributeBase.h\"\n#include \"ndnodeattribute_global.h\"\ncl"
  },
  {
    "path": "NDNodeAttribute/NDStringAttribute.cpp",
    "chars": 817,
    "preview": "#include \"NDStringAttribute.h\"\n#include \"NDNodeManager.h\"\n\nNDStringAttribute::NDStringAttribute(NDNodeBase* parentNode)\n"
  },
  {
    "path": "NDNodeAttribute/NDStringAttribute.h",
    "chars": 873,
    "preview": "#ifndef NDSTRINGATTRIBUTE_H\n#define NDSTRINGATTRIBUTE_H\n\n#include \"NDAttributeBase.h\"\n#include \"ndnodeattribute_global.h"
  },
  {
    "path": "NDNodeAttribute/NDTextNode.cpp",
    "chars": 1856,
    "preview": "#include \"NDTextNode.h\"\n#include \"NDBoolAttribute.h\"\n#include \"NDRealAttribute.h\"\n#include \"NDColorAttribute.h\"\n#include"
  },
  {
    "path": "NDNodeAttribute/NDTextNode.h",
    "chars": 1072,
    "preview": "#ifndef NDTEXTNODE_H\n#define NDTEXTNODE_H\n\n#include \"NDNodeBase.h\"\n#include \"NDAttributeBase.h\"\n#include <QObject>\n\nclas"
  },
  {
    "path": "NDNodeAttribute/ndnodeattribute_global.h",
    "chars": 288,
    "preview": "#ifndef NDNODEATTRIBUTE_GLOBAL_H\n#define NDNODEATTRIBUTE_GLOBAL_H\n\n#include <QtCore/qglobal.h>\n\n#if defined(NDNODEATTRIB"
  },
  {
    "path": "NodeAttributeControl/NodeAttributeControl.pro",
    "chars": 1864,
    "preview": "#-------------------------------------------------\n#\n# Project created by QtCreator 2020-01-27T13:54:45\n#\n#-------------"
  },
  {
    "path": "NodeAttributeControl/UIAttrBoolControl.cpp",
    "chars": 1255,
    "preview": "#include \"UIAttrBoolControl.h\"\n\nUIAttrBoolControl::UIAttrBoolControl(NDAttributeBase* attribute, QWidget* parent)\n    :U"
  },
  {
    "path": "NodeAttributeControl/UIAttrBoolControl.h",
    "chars": 698,
    "preview": "#ifndef UIATTRBOOLCONTROL_H\n#define UIATTRBOOLCONTROL_H\n\n#include \"CustomCombineControl/UICustomSwitchControl.h\"\n#includ"
  },
  {
    "path": "NodeAttributeControl/UIAttrColorControl.cpp",
    "chars": 1301,
    "preview": "#include \"UIAttrColorControl.h\"\n\nUIAttrColorControl::UIAttrColorControl(NDAttributeBase* attribute, QWidget* parent)\n   "
  },
  {
    "path": "NodeAttributeControl/UIAttrColorControl.h",
    "chars": 678,
    "preview": "#ifndef UIATTRCOLORCONTROL_H\n#define UIATTRCOLORCONTROL_H\n\n#include \"CustomCombineControl/UICustomColorControl.h\"\n#inclu"
  }
]

// ... and 328 more files (download for full content)

About this extraction

This page contains the full source code of the douzhongqiang/EasyCanvas GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 528 files (2.3 MB), approximately 638.2k tokens, and a symbol index with 1332 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!