Compare commits
100 Commits
Author | SHA1 | Date | |
---|---|---|---|
430fac2f77 | |||
c15470f723 | |||
2aef114969 | |||
c0e470d78e | |||
c8f2d7c926 | |||
b032e0306f | |||
36ac017e3d | |||
981445630b | |||
9494ec4ac6 | |||
d71441e7c5 | |||
9f0b8c5ec5 | |||
94c0356c25 | |||
9e73f33877 | |||
adc8040604 | |||
82d1edc43c | |||
da17b31be7 | |||
67518fb4e6 | |||
2bd03ad9d8 | |||
e16a8d6b09 | |||
9e0050be63 | |||
a4398d1a2f | |||
a27e5db032 | |||
f7c17a27b6 | |||
020a75ac93 | |||
1b0cdd6152 | |||
1a9cca4300 | |||
d939546f31 | |||
9f9d9da601 | |||
6d24cbf37c | |||
d2929ad701 | |||
689843fbef | |||
c6db001b74 | |||
3ec0841b44 | |||
b3d1568de4 | |||
2511c5dba8 | |||
3049be128f | |||
3291b3a882 | |||
d5744a39bd | |||
882606b2f6 | |||
aba33c4d1f | |||
51aef3f3ec | |||
221afeea58 | |||
c19f5d4c48 | |||
d2eb72cc5b | |||
420a9b2bbb | |||
59dacd8fae | |||
7489a4bcbe | |||
6dd859dd1d | |||
98363542d3 | |||
5b836a4d82 | |||
7dcb65f7b6 | |||
60c2ebee56 | |||
88fed82260 | |||
cb94db8a97 | |||
88008e16be | |||
f2db544be0 | |||
6db8c4d4ac | |||
4ab78bbaba | |||
11b2b04cb9 | |||
9f2e066a9f | |||
5b8312dcb9 | |||
b28f15c23b | |||
935f515a49 | |||
70585c007e | |||
bdde046a4d | |||
ad420366f1 | |||
727a0220b4 | |||
ab0fcf5d9c | |||
f43bfec992 | |||
6bf38b5e5e | |||
73ff2b45b9 | |||
7303e7d900 | |||
5ca1b715f3 | |||
cd984fddf5 | |||
2acb3c34bd | |||
1df3b4ba96 | |||
5ea3cb1054 | |||
5afd2ec518 | |||
59527fc954 | |||
c26fdfaee3 | |||
878dbd668b | |||
b10a0752fb | |||
51e73e7f8e | |||
3a46fd11c6 | |||
70f048f629 | |||
1f2d0d9b9f | |||
09e87e0fb8 | |||
0603a7603d | |||
d9a4f01e20 | |||
93709cd1dd | |||
0000e557a7 | |||
d2183e350e | |||
47caf4bb52 | |||
6fb9ee41fb | |||
b349c22434 | |||
12fa3487bb | |||
a76806645a | |||
738db25c2c | |||
9f8a5f5646 | |||
c59c07e756 |
40
.github/workflows/macos.yml
vendored
@ -2,14 +2,19 @@ name: MacOS
|
||||
on:
|
||||
push:
|
||||
paths:
|
||||
- '*.pro'
|
||||
- '*.txt'
|
||||
- 'example/**'
|
||||
- 'src/**'
|
||||
- 'scripts/**'
|
||||
- '.github/workflows/macos.yml'
|
||||
pull_request:
|
||||
paths:
|
||||
- '*.pro'
|
||||
- '*.txt'
|
||||
- 'example/**'
|
||||
- 'src/**'
|
||||
- 'scripts/**'
|
||||
- '.github/workflows/macos.yml'
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Build
|
||||
@ -22,12 +27,11 @@ jobs:
|
||||
env:
|
||||
targetName: example
|
||||
steps:
|
||||
- name: '⚙️ Cache Qt'
|
||||
id: cache-qt
|
||||
uses: actions/cache@v3
|
||||
- name: Check out repository
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
path: ${{ runner.workspace }}/Qt
|
||||
key: ${{runner.os}}-qtcachedir-${{ matrix.qt_ver }}
|
||||
submodules: recursive
|
||||
|
||||
- name: Install Qt
|
||||
uses: jurplel/install-qt-action@v3
|
||||
with:
|
||||
@ -35,24 +39,30 @@ jobs:
|
||||
cache: ${{steps.cache-qt.outputs.cache-hit}}
|
||||
arch: ${{ matrix.qt_arch }}
|
||||
modules: 'qt5compat qtmultimedia qtshadertools qtimageformats'
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
- name: Set up Ninja
|
||||
uses: seanmiddleditch/gha-setup-ninja@v3
|
||||
with:
|
||||
fetch-depth: 1
|
||||
version: 1.10.2
|
||||
|
||||
- name: build macos
|
||||
run: |
|
||||
qmake
|
||||
make
|
||||
# 打包
|
||||
cmake --version
|
||||
mkdir build
|
||||
cd build
|
||||
cmake -DCMAKE_MESSAGE_LOG_LEVEL=STATUS -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_BUILD_TYPE=Release -GNinja ..
|
||||
cmake --build . --target all --config Release --parallel
|
||||
|
||||
- name: package
|
||||
run: |
|
||||
# 拷贝依赖
|
||||
macdeployqt bin/release/${targetName}.app -qmldir=. -verbose=1 -dmg
|
||||
# 上传artifacts
|
||||
macdeployqt bin/release/${targetName}.app -qmldir=. -verbose=1 -dmg
|
||||
|
||||
- uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: ${{ env.targetName }}_${{ matrix.os }}_${{matrix.qt_ver}}.zip
|
||||
path: bin/release/${{ env.targetName }}.app
|
||||
# tag 上传Release
|
||||
|
||||
- name: uploadRelease
|
||||
if: startsWith(github.event.ref, 'refs/tags/')
|
||||
uses: svenstaro/upload-release-action@v2
|
||||
|
51
.github/workflows/ubuntu.yml
vendored
@ -1,17 +1,21 @@
|
||||
name: Ubuntu
|
||||
# Qt官方没有linux平台的x86包
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
paths:
|
||||
- '*.pro'
|
||||
- '*.txt'
|
||||
- 'src/**'
|
||||
- 'example/**'
|
||||
- 'scripts/**'
|
||||
- '.github/workflows/ubuntu.yml'
|
||||
pull_request:
|
||||
paths:
|
||||
- '*.pro'
|
||||
- '*.txt'
|
||||
- 'src/**'
|
||||
- '.github/workflows/ubuntu.yml'
|
||||
- 'example/**'
|
||||
- 'scripts/**'
|
||||
- '.github/workflows/ubuntu.yml'
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Build
|
||||
@ -24,12 +28,11 @@ jobs:
|
||||
env:
|
||||
targetName: example
|
||||
steps:
|
||||
- name: '⚙️ Cache Qt'
|
||||
id: cache-qt
|
||||
uses: actions/cache@v3
|
||||
- name: Check out repository
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
path: ${{ runner.workspace }}/Qt
|
||||
key: ${{runner.os}}-qtcachedir-${{ matrix.qt_ver }}
|
||||
submodules: recursive
|
||||
|
||||
- name: Install Qt
|
||||
uses: jurplel/install-qt-action@v3
|
||||
with:
|
||||
@ -37,35 +40,45 @@ jobs:
|
||||
cache: ${{steps.cache-qt.outputs.cache-hit}}
|
||||
arch: ${{ matrix.qt_arch }}
|
||||
modules: 'qt5compat qtmultimedia qtshadertools qtimageformats'
|
||||
- name: ubuntu install GL library
|
||||
run: sudo apt-get install -y libglew-dev libglfw3-dev qml-module-qtquick-controls qml-module-qtquick-controls2
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
- name: Set up Ninja
|
||||
uses: seanmiddleditch/gha-setup-ninja@v3
|
||||
with:
|
||||
fetch-depth: 1
|
||||
version: 1.10.2
|
||||
|
||||
- name: ubuntu install GL library
|
||||
run: sudo apt-get install -y libxkbcommon-x11-dev libxcb-icccm4-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-randr0-dev libxcb-shape0-dev libxcb-xfixes0-dev libxcb-xinerama0-dev libxcb-sync-dev libxcb-render-util0-dev libxcb-shm0-dev
|
||||
|
||||
- name: build ubuntu
|
||||
run: |
|
||||
qmake
|
||||
make
|
||||
ninja --version
|
||||
cmake --version
|
||||
mkdir build
|
||||
cd build
|
||||
cmake -DCMAKE_MESSAGE_LOG_LEVEL=STATUS -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DCMAKE_BUILD_TYPE=Release -GNinja ..
|
||||
cmake --build . --target all --config Release --parallel
|
||||
|
||||
- name: install QT linux deploy
|
||||
uses: miurahr/install-linuxdeploy-action@v1
|
||||
with:
|
||||
plugins: qt appimage
|
||||
|
||||
- name: Check if svg file exists
|
||||
run: if [ ! -f "${targetName}.svg" ]; then echo "File not found, creating..."; touch ${targetName}.svg; fi
|
||||
# 打包
|
||||
|
||||
- name: package
|
||||
run: |
|
||||
# make sure Qt plugin finds QML sources so it can deploy the imported files
|
||||
export QML_SOURCES_PATHS=src
|
||||
export QML_SOURCES_PATHS=./
|
||||
# 拷贝依赖
|
||||
linuxdeploy-x86_64.AppImage --plugin=qt --output=appimage --create-desktop-file --icon-file=${targetName}.svg --executable=bin/release/${targetName} --appdir bin/release/
|
||||
mv ${{ env.targetName }}-*.AppImage ${{ env.targetName }}.AppImage
|
||||
# 上传artifacts
|
||||
|
||||
- uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: ${{ env.targetName }}_${{ matrix.os }}_${{matrix.qt_ver}}
|
||||
path: ${{ env.targetName }}.AppImage
|
||||
# tag 上传Release
|
||||
|
||||
- name: uploadRelease
|
||||
if: startsWith(github.event.ref, 'refs/tags/')
|
||||
uses: svenstaro/upload-release-action@v2
|
||||
|
35
.github/workflows/windows-mingw.yml
vendored
@ -2,14 +2,19 @@ name: Windows MinGW
|
||||
on:
|
||||
push:
|
||||
paths:
|
||||
- '*.pro'
|
||||
- '*.txt'
|
||||
- 'src/**'
|
||||
- 'example/**'
|
||||
- 'scripts/**'
|
||||
- '.github/workflows/windows-mingw.yml'
|
||||
pull_request:
|
||||
paths:
|
||||
- '*.pro'
|
||||
- '*.txt'
|
||||
- 'example/**'
|
||||
- 'src/**'
|
||||
- '.github/workflows/windows-mingw.yml'
|
||||
- 'scripts/**'
|
||||
- '.github/workflows/windows-mingw.yml'
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Build
|
||||
@ -25,6 +30,11 @@ jobs:
|
||||
targetName: example.exe
|
||||
fileName: example
|
||||
steps:
|
||||
- name: Check out repository
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Install Qt
|
||||
uses: jurplel/install-qt-action@v3
|
||||
with:
|
||||
@ -32,26 +42,29 @@ jobs:
|
||||
arch: ${{ matrix.qt_arch }}
|
||||
cache: ${{steps.cache-qt.outputs.cache-hit}}
|
||||
modules: 'qt5compat qtmultimedia qtshadertools qtimageformats'
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 1
|
||||
|
||||
- name: Qt6 environment configuration
|
||||
if: ${{ startsWith( matrix.qt_ver, 6 ) }}
|
||||
shell: pwsh
|
||||
run: |
|
||||
Write-Output "${{ env.Qt6_DIR }}/bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||
Write-Output "${{ env.Qt6_DIR }}/../../Tools/${{ matrix.qt_tools_mingw_install }}/bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||
- name: where is qmake & where is mingw32-make
|
||||
|
||||
- name: where is cmake & where is mingw32-make
|
||||
shell: pwsh
|
||||
run: |
|
||||
Get-Command -Name 'qmake' | Format-List
|
||||
Get-Command -Name 'cmake' | Format-List
|
||||
Get-Command -Name 'mingw32-make' | Format-List
|
||||
|
||||
- name: mingw-build
|
||||
id: build
|
||||
shell: cmd
|
||||
run: |
|
||||
qmake
|
||||
mingw32-make
|
||||
mkdir build
|
||||
cd build
|
||||
cmake -DCMAKE_MESSAGE_LOG_LEVEL=STATUS -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DCMAKE_BUILD_TYPE=Release -GNinja ..
|
||||
cmake --build . --target all --config Release --parallel
|
||||
|
||||
- name: package
|
||||
id: package
|
||||
env:
|
||||
@ -61,10 +74,12 @@ jobs:
|
||||
& scripts\windows-mingw-publish.ps1 ${env:archiveName} ${env:targetName}
|
||||
$name = ${env:archiveName}
|
||||
echo "::set-output name=packageName::$name"
|
||||
|
||||
- uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: ${{ steps.package.outputs.packageName }}
|
||||
path: ${{ steps.package.outputs.packageName }}
|
||||
|
||||
- name: uploadRelease
|
||||
if: startsWith(github.event.ref, 'refs/tags/')
|
||||
uses: svenstaro/upload-release-action@v2
|
||||
|
48
.github/workflows/windows.yml
vendored
@ -1,24 +1,25 @@
|
||||
name: Windows
|
||||
on:
|
||||
# push代码时触发workflow
|
||||
push:
|
||||
paths:
|
||||
- '*.pro'
|
||||
- '*.txt'
|
||||
- 'src/**'
|
||||
- 'example/**'
|
||||
- 'scripts/**'
|
||||
- '.github/workflows/windows.yml'
|
||||
pull_request:
|
||||
paths:
|
||||
- '*.pro'
|
||||
- '*.txt'
|
||||
- 'example/**'
|
||||
- 'src/**'
|
||||
- '.github/workflows/windows.yml'
|
||||
- 'scripts/**'
|
||||
- '.github/workflows/windows.yml'
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Build
|
||||
# 运行平台, windows-latest目前是windows server 2019
|
||||
# 参考文档 https://github.com/actions/virtual-environments/blob/main/images/win/Windows2019-Readme.md
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
# 矩阵配置
|
||||
matrix:
|
||||
os: [windows-2019]
|
||||
include:
|
||||
@ -29,40 +30,34 @@ jobs:
|
||||
env:
|
||||
targetName: example.exe
|
||||
fileName: example
|
||||
# 步骤
|
||||
steps:
|
||||
- name: '⚙️ Cache Qt'
|
||||
id: cache-qt
|
||||
uses: actions/cache@v3
|
||||
- name: Check out repository
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
path: ${{ runner.workspace }}\Qt
|
||||
key: ${{runner.os}}-qtcachedir-${{ matrix.qt_ver }}
|
||||
# 安装Qt
|
||||
submodules: recursive
|
||||
|
||||
- name: Install Qt
|
||||
# 使用外部action。这个action专门用来安装Qt
|
||||
uses: jurplel/install-qt-action@v3
|
||||
with:
|
||||
version: ${{ matrix.qt_ver }}
|
||||
arch: ${{ matrix.qt_arch }}
|
||||
cache: ${{steps.cache-qt.outputs.cache-hit}}
|
||||
modules: 'qt5compat qtmultimedia qtshadertools qtimageformats'
|
||||
# 拉取代码
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 1
|
||||
# msvc编译
|
||||
|
||||
- name: msvc-build
|
||||
id: build
|
||||
shell: cmd
|
||||
run: |
|
||||
call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" ${{ matrix.msvc_arch }}
|
||||
qmake
|
||||
nmake
|
||||
mkdir build
|
||||
cd build
|
||||
cmake -DCMAKE_MESSAGE_LOG_LEVEL=STATUS -DCMAKE_C_COMPILER=cl -DCMAKE_CXX_COMPILER=cl -DCMAKE_BUILD_TYPE=Release -GNinja ..
|
||||
cmake --build . --target all --config Release --parallel
|
||||
echo winSdkDir=%WindowsSdkDir% >> %GITHUB_ENV%
|
||||
echo winSdkVer=%WindowsSdkVersion% >> %GITHUB_ENV%
|
||||
echo vcToolsInstallDir=%VCToolsInstallDir% >> %GITHUB_ENV%
|
||||
echo vcToolsRedistDir=%VCToolsRedistDir% >> %GITHUB_ENV%
|
||||
# 打包
|
||||
|
||||
- name: package
|
||||
id: package
|
||||
env:
|
||||
@ -73,14 +68,13 @@ jobs:
|
||||
& scripts\windows-publish.ps1 ${env:archiveName} ${env:targetName}
|
||||
# 记录packageName给后续step
|
||||
$name = ${env:archiveName}
|
||||
echo "::set-output name=packageName::$name"
|
||||
# tag 查询github-Release
|
||||
# 上传artifacts
|
||||
echo "::set-output name=packageName::$name"
|
||||
|
||||
- uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: ${{ steps.package.outputs.packageName }}
|
||||
path: ${{ steps.package.outputs.packageName }}
|
||||
# tag 上传Release
|
||||
|
||||
- name: uploadRelease
|
||||
if: startsWith(github.event.ref, 'refs/tags/')
|
||||
uses: svenstaro/upload-release-action@v2
|
||||
|
3
.gitignore
vendored
@ -33,4 +33,5 @@ CMakeLists.txt.user*
|
||||
|
||||
src/build-preset/plugins.qmltypes
|
||||
bin
|
||||
.DS_Store
|
||||
.DS_Store
|
||||
build
|
@ -1,6 +0,0 @@
|
||||
TEMPLATE = subdirs
|
||||
|
||||
SUBDIRS += \
|
||||
src/FluentUI.pro \
|
||||
example
|
||||
example.depends = src/FluentUI.pro
|
22
README.md
@ -2,7 +2,7 @@
|
||||
|
||||
## 简介
|
||||
|
||||
这是一个漂亮的Fluent组件库,使用QML插件开发的
|
||||
这是一个漂亮的Fluent组件库,使用QML插件开发的。main分支是Qt6.4.3,如果需要qt5的请切换至qt5分支,<a href="https://github.com/zhuzichu520/FluentUI/wiki/%E6%96%B0%E6%89%8B%E5%85%A5%E9%97%A8" target="_blank">如何使用?</a>
|
||||
|
||||
## 编译状态
|
||||
| [Windows][win-link]| [Ubuntu][ubuntu-link]|[MacOS][macos-link]|
|
||||
@ -62,6 +62,12 @@
|
||||
|FluDatePicker|日期选择器||
|
||||
|FluMenu|菜单Popup||
|
||||
|FluNavigationView|响应式导航布局||
|
||||
|FluScrollbar|滚动条||
|
||||
|FluToggleButton|开关按钮||
|
||||
|FluPagination|分页组件||
|
||||
|FluTableView|表格组件||
|
||||
|FluMediaPlayer|播放器||
|
||||
|FluFlipView|FlipView||
|
||||
|
||||
# 部分效果预览
|
||||
|
||||
@ -77,6 +83,10 @@
|
||||
|
||||

|
||||
|
||||
## TableView表格组件
|
||||
|
||||

|
||||
|
||||
## FluTreeView树组件
|
||||
|
||||

|
||||
@ -85,13 +95,5 @@
|
||||
|
||||

|
||||
|
||||
## InfoBar提示框组件
|
||||
|
||||

|
||||
|
||||
## 多窗口路由跳转
|
||||
|
||||

|
||||
|
||||
### ⚡ Visitor count
|
||||

|
||||

|
||||
|
Before Width: | Height: | Size: 103 KiB After Width: | Height: | Size: 46 KiB |
Before Width: | Height: | Size: 383 KiB After Width: | Height: | Size: 204 KiB |
Before Width: | Height: | Size: 382 KiB |
Before Width: | Height: | Size: 204 KiB After Width: | Height: | Size: 218 KiB |
Before Width: | Height: | Size: 89 KiB |
Before Width: | Height: | Size: 103 KiB |
BIN
doc/preview/tableview.png
Normal file
After Width: | Height: | Size: 71 KiB |
Before Width: | Height: | Size: 73 KiB After Width: | Height: | Size: 35 KiB |
Before Width: | Height: | Size: 101 KiB After Width: | Height: | Size: 49 KiB |
@ -1,28 +0,0 @@
|
||||
import QtQuick
|
||||
import QtQuick.Window
|
||||
import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
import QtMultimedia
|
||||
import FluentUI
|
||||
|
||||
Window {
|
||||
id:app
|
||||
color: "#00000000"
|
||||
//初始化一个MediaPlayer,解决macos切换到T_MediaPalyer页面崩溃问题
|
||||
MediaPlayer{}
|
||||
Component.onCompleted: {
|
||||
FluApp.init(app,properties)
|
||||
FluTheme.frameless = ("windows" === Qt.platform.os)
|
||||
FluTheme.dark = false
|
||||
FluApp.routes = {
|
||||
"/":"qrc:/page/MainPage.qml",
|
||||
"/about":"qrc:/page/AboutPage.qml",
|
||||
"/login":"qrc:/page/LoginPage.qml",
|
||||
"/chat":"qrc:/page/ChatPage.qml",
|
||||
"/media":"qrc:/page/MediaPage.qml",
|
||||
}
|
||||
FluApp.initialRoute = "/"
|
||||
FluApp.run()
|
||||
}
|
||||
|
||||
}
|
@ -1,86 +1,87 @@
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
project(example)
|
||||
|
||||
project(example VERSION 0.1 LANGUAGES CXX)
|
||||
|
||||
set(CMAKE_AUTOMOC ON)
|
||||
set(CMAKE_AUTORCC ON)
|
||||
set(CMAKE_AUTOUIC ON)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
|
||||
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||
set(platform 64)
|
||||
else()
|
||||
set(platform 32)
|
||||
endif()
|
||||
#获取文件路径分隔符(解决执行命令的时候有些平台会报错)
|
||||
file(TO_CMAKE_PATH "/" PATH_SEPARATOR)
|
||||
|
||||
#设置可执行文件输出目录
|
||||
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../bin/debug)
|
||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin/debug)
|
||||
else()
|
||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../bin/release)
|
||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin/release)
|
||||
endif()
|
||||
|
||||
find_package(Qt6 COMPONENTS Core Quick QuickControls2 Concurrent Network Multimedia REQUIRED)
|
||||
find_package(Qt6 REQUIRED COMPONENTS Quick REQUIRED)
|
||||
|
||||
set(SOURCES
|
||||
ChatController.cpp
|
||||
main.cpp
|
||||
#遍历所有Cpp文件
|
||||
file(GLOB_RECURSE CPP_FILES *.cpp *.h)
|
||||
foreach(filepath ${CPP_FILES})
|
||||
string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/" "" filename ${filepath})
|
||||
list(APPEND sources_files ${filename})
|
||||
endforeach(filepath)
|
||||
|
||||
#遍历所有qml文件
|
||||
file(GLOB_RECURSE QML_PATHS *.qml)
|
||||
foreach(filepath ${QML_PATHS})
|
||||
string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/" "" filename ${filepath})
|
||||
list(APPEND qml_files ${filename})
|
||||
endforeach(filepath)
|
||||
|
||||
#遍历所有资源文件
|
||||
file(GLOB_RECURSE RES_PATHS *.png *.jpg *.svg *.ico *.ttf *.webp)
|
||||
foreach(filepath ${RES_PATHS})
|
||||
string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/" "" filename ${filepath})
|
||||
list(APPEND resource_files ${filename})
|
||||
endforeach(filepath)
|
||||
|
||||
#添加可执行文件
|
||||
qt_add_executable(example
|
||||
${sources_files}
|
||||
)
|
||||
|
||||
set(HEADERS
|
||||
ChatController.h
|
||||
)
|
||||
|
||||
set(RESOURCES
|
||||
qml.qrc
|
||||
)
|
||||
|
||||
set(RC_ICONS
|
||||
favicon.ico
|
||||
)
|
||||
|
||||
qt_add_resources(QT_RESOURCES ${RESOURCES})
|
||||
|
||||
add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS} ${QT_RESOURCES} ${RC_ICONS})
|
||||
|
||||
#复制动态库到可执行文件同级目录下
|
||||
if(WIN32)
|
||||
if(CMAKE_C_COMPILER_ID STREQUAL "MSVC")
|
||||
file(GLOB DLL_FILES ${CMAKE_CURRENT_SOURCE_DIR}/../third/msvc/*.dll)
|
||||
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -E copy
|
||||
${DLL_FILES}
|
||||
${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
|
||||
)
|
||||
if(${CMAKE_CXX_COMPILER_ID} STREQUAL "MSVC")
|
||||
set(DLLPATH ${CMAKE_SOURCE_DIR}/3rdparty/msvc/*.dll)
|
||||
else()
|
||||
file(GLOB DLL_FILES ${CMAKE_CURRENT_SOURCE_DIR}/../third/mingw/*.dll)
|
||||
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -E copy
|
||||
${DLL_FILES}
|
||||
${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
|
||||
)
|
||||
set(DLLPATH ${CMAKE_SOURCE_DIR}/3rdparty/mingw/*.dll)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
target_compile_definitions(${PROJECT_NAME} PRIVATE
|
||||
QT_DEPRECATED_WARNINGS
|
||||
QT_NO_WARNING_OUTPUT
|
||||
)
|
||||
|
||||
target_link_libraries(${PROJECT_NAME} PRIVATE
|
||||
Qt6::Core
|
||||
Qt6::Quick
|
||||
Qt6::QuickControls2
|
||||
Qt6::Concurrent
|
||||
Qt6::Network
|
||||
Qt6::Multimedia
|
||||
)
|
||||
|
||||
if(WIN32)
|
||||
target_compile_definitions(${PROJECT_NAME} PRIVATE UNICODE WIN32 _WINDOWS)
|
||||
target_link_libraries(${PROJECT_NAME} PRIVATE dwmapi user32)
|
||||
endif()
|
||||
|
||||
if(APPLE)
|
||||
set_target_properties(${PROJECT_NAME} PROPERTIES
|
||||
MACOSX_BUNDLE_INFO_PLIST Info.plist
|
||||
string(REPLACE "/" ${PATH_SEPARATOR} DLLPATH "${DLLPATH}")
|
||||
file(GLOB DLL_FILES ${DLLPATH})
|
||||
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -E copy
|
||||
${DLL_FILES}
|
||||
${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
|
||||
)
|
||||
endif()
|
||||
|
||||
#添加qml模块
|
||||
qt_add_qml_module(example
|
||||
URI example
|
||||
VERSION 1.0
|
||||
QML_FILES ${qml_files} qml/global/qmldir
|
||||
RESOURCES ${resource_files}
|
||||
)
|
||||
|
||||
#设置属性
|
||||
set_target_properties(example PROPERTIES
|
||||
MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com
|
||||
MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
|
||||
MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
|
||||
MACOSX_BUNDLE TRUE
|
||||
WIN32_EXECUTABLE TRUE
|
||||
)
|
||||
|
||||
#链接库
|
||||
target_link_libraries(example
|
||||
PRIVATE Qt6::Quick
|
||||
)
|
||||
|
||||
#安装
|
||||
install(TARGETS example
|
||||
BUNDLE DESTINATION .
|
||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||
|
@ -1,29 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>NSAppTransportSecurity</key>
|
||||
<dict>
|
||||
<key>NSAllowsArbitraryLoads</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>example</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string></string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>com.zhuzichu.example</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>LSMinimumSystemVersion</key>
|
||||
<string>10.13</string>
|
||||
<key>NOTE</key>
|
||||
<string>This file was generated by Qt/QMake.</string>
|
||||
<key>NSPrincipalClass</key>
|
||||
<string>NSApplication</string>
|
||||
<key>NSSupportsAutomaticGraphicsSwitching</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
@ -1,64 +0,0 @@
|
||||
import QtQuick
|
||||
import QtQuick.Layouts
|
||||
import QtQuick.Window
|
||||
import QtQuick.Controls
|
||||
import FluentUI
|
||||
import "./component"
|
||||
|
||||
FluScrollablePage{
|
||||
|
||||
title:"Dialog"
|
||||
leftPadding:10
|
||||
rightPadding:10
|
||||
bottomPadding:20
|
||||
spacing: 0
|
||||
|
||||
FluArea{
|
||||
Layout.fillWidth: true
|
||||
height: 68
|
||||
paddings: 10
|
||||
Layout.topMargin: 20
|
||||
FluButton{
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
Layout.topMargin: 20
|
||||
text:"Show Dialog"
|
||||
onClicked: {
|
||||
dialog.open()
|
||||
}
|
||||
}
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
code:'FluContentDialog{
|
||||
id:dialog
|
||||
title:"友情提示"
|
||||
message:"确定要退出程序么?"
|
||||
negativeText:"取消"
|
||||
onNegativeClicked:{
|
||||
showSuccess("点击取消按钮")
|
||||
}
|
||||
positiveText:"确定"
|
||||
onPositiveClicked:{
|
||||
showSuccess("点击确定按钮")
|
||||
}
|
||||
}
|
||||
dialog.open()
|
||||
'
|
||||
}
|
||||
|
||||
FluContentDialog{
|
||||
id:dialog
|
||||
title:"友情提示"
|
||||
message:"确定要退出程序么?"
|
||||
negativeText:"取消"
|
||||
onNegativeClicked:{
|
||||
showSuccess("点击取消按钮")
|
||||
}
|
||||
positiveText:"确定"
|
||||
onPositiveClicked:{
|
||||
showSuccess("点击确定按钮")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -1,107 +0,0 @@
|
||||
import QtQuick
|
||||
import QtQuick.Layouts
|
||||
import QtQuick.Window
|
||||
import QtQuick.Controls
|
||||
import FluentUI
|
||||
import "./component"
|
||||
|
||||
FluScrollablePage{
|
||||
|
||||
property string password: ""
|
||||
property var loginPageRegister: registerForPageResult("/login")
|
||||
|
||||
title:"MultiWindow"
|
||||
leftPadding:10
|
||||
rightPadding:10
|
||||
bottomPadding:20
|
||||
spacing: 0
|
||||
|
||||
Connections{
|
||||
target: loginPageRegister
|
||||
function onResult(data)
|
||||
{
|
||||
password = data.password
|
||||
}
|
||||
}
|
||||
|
||||
FluArea{
|
||||
Layout.fillWidth: true
|
||||
height: 100
|
||||
paddings: 10
|
||||
Layout.topMargin: 20
|
||||
Column{
|
||||
spacing: 15
|
||||
anchors{
|
||||
verticalCenter: parent.verticalCenter
|
||||
left: parent.left
|
||||
}
|
||||
FluText{
|
||||
text:"页面跳转,不携带任何参数"
|
||||
}
|
||||
FluButton{
|
||||
text:"点击跳转"
|
||||
onClicked: {
|
||||
FluApp.navigate("/about")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
code:'FluButton{
|
||||
text:"点击跳转"
|
||||
onClicked: {
|
||||
FluApp.navigate("/about")
|
||||
}
|
||||
}
|
||||
'
|
||||
}
|
||||
|
||||
FluArea{
|
||||
Layout.fillWidth: true
|
||||
height: 130
|
||||
paddings: 10
|
||||
Layout.topMargin: 20
|
||||
|
||||
Column{
|
||||
spacing: 15
|
||||
anchors{
|
||||
verticalCenter: parent.verticalCenter
|
||||
left: parent.left
|
||||
}
|
||||
FluText{
|
||||
text:"页面跳转,并携带参数用户名:zhuzichu"
|
||||
}
|
||||
FluButton{
|
||||
text:"点击跳转到登录"
|
||||
onClicked: {
|
||||
loginPageRegister.launch({username:"zhuzichu"})
|
||||
}
|
||||
}
|
||||
FluText{
|
||||
text:"登录窗口返回过来的密码->"+password
|
||||
}
|
||||
}
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
code:'property var loginPageRegister: registerForPageResult("/login")
|
||||
|
||||
Connections{
|
||||
target: loginPageRegister
|
||||
function onResult(data)
|
||||
{
|
||||
password = data.password
|
||||
}
|
||||
}
|
||||
|
||||
FluButton{
|
||||
text:"点击跳转"
|
||||
onClicked: {
|
||||
loginPageRegister.launch({username:"zhuzichu"})
|
||||
}
|
||||
}
|
||||
'
|
||||
}
|
||||
|
||||
}
|
@ -1,43 +0,0 @@
|
||||
QT += quick quickcontrols2 concurrent network multimedia
|
||||
CONFIG += c++17
|
||||
DEFINES += QT_DEPRECATED_WARNINGS QT_NO_WARNING_OUTPUT
|
||||
|
||||
HEADERS += \
|
||||
ChatController.h
|
||||
|
||||
SOURCES += \
|
||||
ChatController.cpp \
|
||||
main.cpp
|
||||
|
||||
RESOURCES += qml.qrc
|
||||
|
||||
RC_ICONS = favicon.ico
|
||||
|
||||
QML_IMPORT_PATH =
|
||||
QML_DESIGNER_IMPORT_PATH =
|
||||
|
||||
CONFIG(debug,debug|release) {
|
||||
DESTDIR = $$absolute_path($${_PRO_FILE_PWD_}/../bin/debug)
|
||||
} else {
|
||||
DESTDIR = $$absolute_path($${_PRO_FILE_PWD_}/../bin/release)
|
||||
}
|
||||
|
||||
win32 {
|
||||
|
||||
contains(QMAKE_CC, cl) {
|
||||
COPYDLL = $$absolute_path($${_PRO_FILE_PWD_}/../third/msvc/*.dll) $$DESTDIR
|
||||
QMAKE_PRE_LINK += $$QMAKE_COPY $$replace(COPYDLL, /, $$QMAKE_DIR_SEP)
|
||||
} else {
|
||||
COPYDLL = $$absolute_path($${_PRO_FILE_PWD_}/../third/mingw/*.dll) $$DESTDIR
|
||||
QMAKE_PRE_LINK += $$QMAKE_COPY $$replace(COPYDLL, /, $$QMAKE_DIR_SEP)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
qnx: target.path = /tmp/$${TARGET}/bin
|
||||
else: unix:!android: target.path = /opt/$${TARGET}/bin
|
||||
!isEmpty(target.path): INSTALLS += target
|
||||
|
||||
mac: {
|
||||
QMAKE_INFO_PLIST = Info.plist
|
||||
}
|
Before Width: | Height: | Size: 116 KiB |
@ -1,21 +0,0 @@
|
||||
pragma Singleton
|
||||
|
||||
import QtQuick
|
||||
import FluentUI
|
||||
|
||||
FluObject{
|
||||
id:footer_items
|
||||
FluPaneItemSeparator{}
|
||||
FluPaneItem{
|
||||
title:"意见反馈"
|
||||
onTap:{
|
||||
Qt.openUrlExternally("https://github.com/zhuzichu520/FluentUI/issues/new")
|
||||
}
|
||||
}
|
||||
FluPaneItem{
|
||||
title:"关于"
|
||||
onTap:{
|
||||
FluApp.navigate("/about")
|
||||
}
|
||||
}
|
||||
}
|
@ -1,43 +0,0 @@
|
||||
#include <QGuiApplication>
|
||||
#include <QQmlApplicationEngine>
|
||||
#include <QQmlContext>
|
||||
#include <QDir>
|
||||
#include <QQuickWindow>
|
||||
#include <QQuickStyle>
|
||||
#include <QProcess>
|
||||
#include "ChatController.h"
|
||||
|
||||
QMap<QString, QVariant> properties(){
|
||||
QMap<QString, QVariant> map;
|
||||
// map["installHelper"] = QVariant::fromValue(QVariant::fromValue(InstallHelper::getInstance()));
|
||||
return map;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
QCoreApplication::setOrganizationName("ZhuZiChu");
|
||||
QCoreApplication::setOrganizationDomain("https://zhuzichu520.github.io");
|
||||
QCoreApplication::setApplicationName("FluentUI");
|
||||
QQuickStyle::setStyle("Basic");
|
||||
QGuiApplication app(argc, argv);
|
||||
QQmlApplicationEngine engine;
|
||||
|
||||
qmlRegisterType<ChatController>("Controller",1,0,"ChatController");
|
||||
|
||||
QMapIterator<QString, QVariant> iterator(properties());
|
||||
while (iterator.hasNext()) {
|
||||
iterator.next();
|
||||
QString key = iterator.key();
|
||||
QVariant value = iterator.value();
|
||||
engine.rootContext()->setContextProperty(key,value);
|
||||
}
|
||||
engine.rootContext()->setContextProperty("properties",properties());
|
||||
const QUrl url(QStringLiteral("qrc:/App.qml"));
|
||||
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
|
||||
&app, [url](QObject *obj, const QUrl &objUrl) {
|
||||
if (!obj && url == objUrl)
|
||||
QCoreApplication::exit(-1);
|
||||
}, Qt::QueuedConnection);
|
||||
engine.load(url);
|
||||
return app.exec();
|
||||
}
|
@ -1,49 +0,0 @@
|
||||
import QtQuick
|
||||
import QtQuick.Window
|
||||
import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
import "qrc:///global/"
|
||||
import FluentUI
|
||||
|
||||
FluWindow {
|
||||
id:rootwindow
|
||||
width: 1000
|
||||
height: 640
|
||||
title: "FluentUI"
|
||||
minimumWidth: 520
|
||||
minimumHeight: 460
|
||||
|
||||
FluAppBar{
|
||||
id:appbar
|
||||
z:10
|
||||
showDark: true
|
||||
width:parent.width
|
||||
}
|
||||
|
||||
FluNavigationView{
|
||||
id:nav_view
|
||||
anchors.fill: parent
|
||||
items: ItemsOriginal
|
||||
footerItems:ItemsFooter
|
||||
logo: "qrc:/res/image/favicon.ico"
|
||||
z: 11
|
||||
title:"FluentUI"
|
||||
autoSuggestBox:FluAutoSuggestBox{
|
||||
width: 280
|
||||
anchors.centerIn: parent
|
||||
iconSource: FluentIcons.Zoom
|
||||
items: ItemsOriginal.getSearchData()
|
||||
placeholderText: "查找"
|
||||
onItemClicked:
|
||||
(data)=>{
|
||||
ItemsOriginal.startPageByItem(data)
|
||||
}
|
||||
}
|
||||
Component.onCompleted: {
|
||||
ItemsOriginal.navigationView = nav_view
|
||||
nav_view.setCurrentIndex(0)
|
||||
nav_view.push("qrc:/T_Home.qml")
|
||||
}
|
||||
}
|
||||
|
||||
}
|
161
example/qml.qrc
@ -1,161 +0,0 @@
|
||||
<RCC>
|
||||
<qresource prefix="/">
|
||||
<file>App.qml</file>
|
||||
<file>res/image/image_huoyin.webp</file>
|
||||
<file>res/svg/avatar_1.svg</file>
|
||||
<file>res/svg/avatar_2.svg</file>
|
||||
<file>res/svg/avatar_3.svg</file>
|
||||
<file>res/svg/avatar_4.svg</file>
|
||||
<file>res/svg/avatar_5.svg</file>
|
||||
<file>res/svg/avatar_6.svg</file>
|
||||
<file>res/svg/avatar_7.svg</file>
|
||||
<file>res/svg/avatar_8.svg</file>
|
||||
<file>res/svg/avatar_9.svg</file>
|
||||
<file>res/svg/avatar_10.svg</file>
|
||||
<file>res/svg/avatar_11.svg</file>
|
||||
<file>res/svg/avatar_12.svg</file>
|
||||
<file>page/AboutPage.qml</file>
|
||||
<file>page/MainPage.qml</file>
|
||||
<file>page/LoginPage.qml</file>
|
||||
<file>T_ToggleSwitch.qml</file>
|
||||
<file>T_Typography.qml</file>
|
||||
<file>T_Awesome.qml</file>
|
||||
<file>T_Buttons.qml</file>
|
||||
<file>T_Rectangle.qml</file>
|
||||
<file>T_InfoBar.qml</file>
|
||||
<file>T_Progress.qml</file>
|
||||
<file>T_Slider.qml</file>
|
||||
<file>T_TextBox.qml</file>
|
||||
<file>T_Theme.qml</file>
|
||||
<file>T_Dialog.qml</file>
|
||||
<file>T_TreeView.qml</file>
|
||||
<file>T_Expander.qml</file>
|
||||
<file>T_TimePicker.qml</file>
|
||||
<file>T_DatePicker.qml</file>
|
||||
<file>T_MultiWindow.qml</file>
|
||||
<file>T_Menu.qml</file>
|
||||
<file>res/image/banner_1.jpg</file>
|
||||
<file>res/image/banner_2.jpg</file>
|
||||
<file>res/image/banner_3.jpg</file>
|
||||
<file>res/image/logo_openai.png</file>
|
||||
<file>page/ChatPage.qml</file>
|
||||
<file>T_Tooltip.qml</file>
|
||||
<file>T_Badge.qml</file>
|
||||
<file>T_CalendarPicker.qml</file>
|
||||
<file>T_ColorPicker.qml</file>
|
||||
<file>T_Carousel.qml</file>
|
||||
<file>T_MediaPlayer.qml</file>
|
||||
<file>T_TabView.qml</file>
|
||||
<file>res/image/favicon.ico</file>
|
||||
<file>T_Home.qml</file>
|
||||
<file>res/image/bg_home_header.png</file>
|
||||
<file>res/image/ic_home_github.png</file>
|
||||
<file>res/image/control/Acrylic.png</file>
|
||||
<file>res/image/control/AnimatedIcon.png</file>
|
||||
<file>res/image/control/AnimatedVisualPlayer.png</file>
|
||||
<file>res/image/control/AnimationInterop.png</file>
|
||||
<file>res/image/control/AppBarButton.png</file>
|
||||
<file>res/image/control/AppBarSeparator.png</file>
|
||||
<file>res/image/control/AppBarToggleButton.png</file>
|
||||
<file>res/image/control/AutomationProperties.png</file>
|
||||
<file>res/image/control/AutoSuggestBox.png</file>
|
||||
<file>res/image/control/Border.png</file>
|
||||
<file>res/image/control/BreadcrumbBar.png</file>
|
||||
<file>res/image/control/Button.png</file>
|
||||
<file>res/image/control/CalendarDatePicker.png</file>
|
||||
<file>res/image/control/CalendarView.png</file>
|
||||
<file>res/image/control/Canvas.png</file>
|
||||
<file>res/image/control/Checkbox.png</file>
|
||||
<file>res/image/control/Clipboard.png</file>
|
||||
<file>res/image/control/ColorPaletteResources.png</file>
|
||||
<file>res/image/control/ColorPicker.png</file>
|
||||
<file>res/image/control/ComboBox.png</file>
|
||||
<file>res/image/control/CommandBar.png</file>
|
||||
<file>res/image/control/CommandBarFlyout.png</file>
|
||||
<file>res/image/control/CompactSizing.png</file>
|
||||
<file>res/image/control/ConnectedAnimation.png</file>
|
||||
<file>res/image/control/ContentDialog.png</file>
|
||||
<file>res/image/control/CreateMultipleWindows.png</file>
|
||||
<file>res/image/control/DataGrid.png</file>
|
||||
<file>res/image/control/DatePicker.png</file>
|
||||
<file>res/image/control/DropDownButton.png</file>
|
||||
<file>res/image/control/EasingFunction.png</file>
|
||||
<file>res/image/control/Expander.png</file>
|
||||
<file>res/image/control/FilePicker.png</file>
|
||||
<file>res/image/control/FlipView.png</file>
|
||||
<file>res/image/control/Flyout.png</file>
|
||||
<file>res/image/control/Grid.png</file>
|
||||
<file>res/image/control/GridView.png</file>
|
||||
<file>res/image/control/HyperlinkButton.png</file>
|
||||
<file>res/image/control/IconElement.png</file>
|
||||
<file>res/image/control/Image.png</file>
|
||||
<file>res/image/control/ImplicitTransition.png</file>
|
||||
<file>res/image/control/InfoBadge.png</file>
|
||||
<file>res/image/control/InfoBar.png</file>
|
||||
<file>res/image/control/InkCanvas.png</file>
|
||||
<file>res/image/control/InkToolbar.png</file>
|
||||
<file>res/image/control/InputValidation.png</file>
|
||||
<file>res/image/control/ItemsRepeater.png</file>
|
||||
<file>res/image/control/Line.png</file>
|
||||
<file>res/image/control/ListBox.png</file>
|
||||
<file>res/image/control/ListView.png</file>
|
||||
<file>res/image/control/MediaPlayerElement.png</file>
|
||||
<file>res/image/control/MenuBar.png</file>
|
||||
<file>res/image/control/MenuFlyout.png</file>
|
||||
<file>res/image/control/NavigationView.png</file>
|
||||
<file>res/image/control/NumberBox.png</file>
|
||||
<file>res/image/control/PageTransition.png</file>
|
||||
<file>res/image/control/ParallaxView.png</file>
|
||||
<file>res/image/control/PasswordBox.png</file>
|
||||
<file>res/image/control/PersonPicture.png</file>
|
||||
<file>res/image/control/PipsPager.png</file>
|
||||
<file>res/image/control/Pivot.png</file>
|
||||
<file>res/image/control/ProgressBar.png</file>
|
||||
<file>res/image/control/ProgressRing.png</file>
|
||||
<file>res/image/control/PullToRefresh.png</file>
|
||||
<file>res/image/control/RadialGradientBrush.png</file>
|
||||
<file>res/image/control/RadioButton.png</file>
|
||||
<file>res/image/control/RadioButtons.png</file>
|
||||
<file>res/image/control/RatingControl.png</file>
|
||||
<file>res/image/control/RelativePanel.png</file>
|
||||
<file>res/image/control/RepeatButton.png</file>
|
||||
<file>res/image/control/RevealFocus.png</file>
|
||||
<file>res/image/control/RichEditBox.png</file>
|
||||
<file>res/image/control/RichTextBlock.png</file>
|
||||
<file>res/image/control/ScrollViewer.png</file>
|
||||
<file>res/image/control/SemanticZoom.png</file>
|
||||
<file>res/image/control/Shape.png</file>
|
||||
<file>res/image/control/Slider.png</file>
|
||||
<file>res/image/control/Sound.png</file>
|
||||
<file>res/image/control/SplitButton.png</file>
|
||||
<file>res/image/control/SplitView.png</file>
|
||||
<file>res/image/control/StackPanel.png</file>
|
||||
<file>res/image/control/StandardUICommand.png</file>
|
||||
<file>res/image/control/SwipeControl.png</file>
|
||||
<file>res/image/control/TabView.png</file>
|
||||
<file>res/image/control/TeachingTip.png</file>
|
||||
<file>res/image/control/TextBlock.png</file>
|
||||
<file>res/image/control/TextBox.png</file>
|
||||
<file>res/image/control/ThemeTransition.png</file>
|
||||
<file>res/image/control/TimePicker.png</file>
|
||||
<file>res/image/control/TitleBar.png</file>
|
||||
<file>res/image/control/ToggleButton.png</file>
|
||||
<file>res/image/control/ToggleSplitButton.png</file>
|
||||
<file>res/image/control/ToggleSwitch.png</file>
|
||||
<file>res/image/control/ToolTip.png</file>
|
||||
<file>res/image/control/TreeView.png</file>
|
||||
<file>res/image/control/VariableSizedWrapGrid.png</file>
|
||||
<file>res/image/control/Viewbox.png</file>
|
||||
<file>res/image/control/WebView.png</file>
|
||||
<file>res/image/control/XamlUICommand.png</file>
|
||||
<file>T_CheckBox.qml</file>
|
||||
<file>global/ItemsOriginal.qml</file>
|
||||
<file>global/qmldir</file>
|
||||
<file>global/ItemsFooter.qml</file>
|
||||
<file>page/MediaPage.qml</file>
|
||||
<file>T_FlipView.qml</file>
|
||||
<file>T_Pivot.qml</file>
|
||||
<file>component/CodeExpander.qml</file>
|
||||
<file>T_TableView.qml</file>
|
||||
</qresource>
|
||||
</RCC>
|
26
example/qml/App.qml
Normal file
@ -0,0 +1,26 @@
|
||||
import QtQuick
|
||||
import QtQuick.Window
|
||||
import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
import FluentUI
|
||||
|
||||
Window {
|
||||
id:app
|
||||
Component.onCompleted: {
|
||||
FluApp.init(app)
|
||||
FluTheme.frameless = ("windows" === Qt.platform.os)
|
||||
FluTheme.darkMode = FluDarkMode.System
|
||||
FluApp.routes = {
|
||||
"/":"qrc:/example/qml/window/MainWindow.qml",
|
||||
"/about":"qrc:/example/qml/window/AboutWindow.qml",
|
||||
"/login":"qrc:/example/qml/window/LoginWindow.qml",
|
||||
"/chat":"qrc:/example/qml/window/ChatWindow.qml",
|
||||
"/media":"qrc:/example/qml/window/MediaWindow.qml",
|
||||
"/singleTaskWindow":"qrc:/example/qml/window/SingleTaskWindow.qml",
|
||||
"/standardWindow":"qrc:/example/qml/window/StandardWindow.qml",
|
||||
"/singleInstanceWindow":"qrc:/example/qml/window/SingleInstanceWindow.qml"
|
||||
}
|
||||
FluApp.initialRoute = "/"
|
||||
FluApp.run()
|
||||
}
|
||||
}
|
@ -68,7 +68,6 @@ FluExpander{
|
||||
"FluComboBox",
|
||||
"FluContentDialog",
|
||||
"FluContentPage",
|
||||
"FluControl",
|
||||
"FluDatePicker",
|
||||
"FluDivider",
|
||||
"FluDropDownButton",
|
||||
@ -113,7 +112,15 @@ FluExpander{
|
||||
"FluTooltip",
|
||||
"FluTreeView",
|
||||
"FluWindow",
|
||||
"FluWindowResize"
|
||||
"FluWindowResize",
|
||||
"FluToggleButton",
|
||||
"FluTableView",
|
||||
"FluColors",
|
||||
"FluTheme",
|
||||
"FluStatusView",
|
||||
"FluRatingControl",
|
||||
"FluPasswordBox",
|
||||
"FluBreadcrumbBar"
|
||||
];
|
||||
code = code.replace(/\n/g, "<br>");
|
||||
code = code.replace(/ /g, " ");
|
26
example/qml/global/ItemsFooter.qml
Normal file
@ -0,0 +1,26 @@
|
||||
pragma Singleton
|
||||
|
||||
import QtQuick
|
||||
import FluentUI
|
||||
|
||||
FluObject{
|
||||
id:footer_items
|
||||
|
||||
property var navigationView
|
||||
|
||||
FluPaneItemSeparator{}
|
||||
FluPaneItem{
|
||||
title:lang.about
|
||||
icon:FluentIcons.Contact
|
||||
tapFunc:function(){
|
||||
FluApp.navigate("/about")
|
||||
}
|
||||
}
|
||||
FluPaneItem{
|
||||
title:lang.settings
|
||||
icon:FluentIcons.Settings
|
||||
onTap:{
|
||||
navigationView.push("qrc:/example/qml/page/T_Settings.qml")
|
||||
}
|
||||
}
|
||||
}
|
@ -8,244 +8,269 @@ FluObject{
|
||||
property var navigationView
|
||||
|
||||
FluPaneItem{
|
||||
title:"Home"
|
||||
icon:FluentIcons.Home
|
||||
title:lang.home
|
||||
// icon:FluentIcons.Home
|
||||
cusIcon: Image{
|
||||
anchors.centerIn: parent
|
||||
source: FluTheme.dark ? "qrc:/example/res/svg/home_dark.svg" : "qrc:/example/res/svg/home.svg"
|
||||
sourceSize: Qt.size(30,30)
|
||||
width: 18
|
||||
height: 18
|
||||
}
|
||||
onTap:{
|
||||
navigationView.push("qrc:/T_Home.qml")
|
||||
navigationView.push("qrc:/example/qml/page/T_Home.qml")
|
||||
}
|
||||
}
|
||||
|
||||
FluPaneItemExpander{
|
||||
title:"Basic input"
|
||||
title:lang.basic_input
|
||||
icon:FluentIcons.CheckboxComposite
|
||||
FluPaneItem{
|
||||
title:"Buttons"
|
||||
image:"qrc:/res/image/control/Button.png"
|
||||
image:"qrc:/example/res/image/control/Button.png"
|
||||
recentlyUpdated:true
|
||||
desc:"A control that responds to user input and raisesa Click event."
|
||||
onTap:{
|
||||
navigationView.push("qrc:/T_Buttons.qml")
|
||||
navigationView.push("qrc:/example/qml/page/T_Buttons.qml")
|
||||
}
|
||||
}
|
||||
FluPaneItem{
|
||||
title:"Slider"
|
||||
image:"qrc:/res/image/control/Slider.png"
|
||||
image:"qrc:/example/res/image/control/Slider.png"
|
||||
recentlyUpdated:true
|
||||
desc:"A control that lets the user select from a rangeof values by moving a Thumb control along atrack."
|
||||
onTap:{
|
||||
navigationView.push("qrc:/T_Slider.qml")
|
||||
navigationView.push("qrc:/example/qml/page/T_Slider.qml")
|
||||
}
|
||||
}
|
||||
FluPaneItem{
|
||||
title:"CheckBox"
|
||||
image:"qrc:/res/image/control/Checkbox.png"
|
||||
image:"qrc:/example/res/image/control/Checkbox.png"
|
||||
recentlyUpdated:true
|
||||
desc:"A control that a user can select or clear."
|
||||
onTap:{
|
||||
navigationView.push("qrc:/T_CheckBox.qml")
|
||||
navigationView.push("qrc:/example/qml/page/T_CheckBox.qml")
|
||||
}
|
||||
}
|
||||
FluPaneItem{
|
||||
title:"ToggleSwitch"
|
||||
onTap:{
|
||||
navigationView.push("qrc:/T_ToggleSwitch.qml")
|
||||
navigationView.push("qrc:/example/qml/page/T_ToggleSwitch.qml")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
FluPaneItemExpander{
|
||||
title:"Form"
|
||||
title:lang.form
|
||||
icon:FluentIcons.GridView
|
||||
FluPaneItem{
|
||||
title:"TextBox"
|
||||
onTap:{
|
||||
navigationView.push("qrc:/T_TextBox.qml")
|
||||
navigationView.push("qrc:/example/qml/page/T_TextBox.qml")
|
||||
}
|
||||
}
|
||||
FluPaneItem{
|
||||
title:"TimePicker"
|
||||
onTap:{
|
||||
navigationView.push("qrc:/T_TimePicker.qml")
|
||||
navigationView.push("qrc:/example/qml/page/T_TimePicker.qml")
|
||||
}
|
||||
}
|
||||
FluPaneItem{
|
||||
title:"DatePicker"
|
||||
onTap:{
|
||||
navigationView.push("qrc:/T_DatePicker.qml")
|
||||
navigationView.push("qrc:/example/qml/page/T_DatePicker.qml")
|
||||
}
|
||||
}
|
||||
FluPaneItem{
|
||||
title:"CalendarPicker"
|
||||
onTap:{
|
||||
navigationView.push("qrc:/T_CalendarPicker.qml")
|
||||
navigationView.push("qrc:/example/qml/page/T_CalendarPicker.qml")
|
||||
}
|
||||
}
|
||||
FluPaneItem{
|
||||
title:"ColorPicker"
|
||||
onTap:{
|
||||
navigationView.push("qrc:/T_ColorPicker.qml")
|
||||
navigationView.push("qrc:/example/qml/page/T_ColorPicker.qml")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
FluPaneItemExpander{
|
||||
title:"Surface"
|
||||
title:lang.surface
|
||||
icon:FluentIcons.SurfaceHub
|
||||
FluPaneItem{
|
||||
title:"InfoBar"
|
||||
image:"qrc:/res/image/control/InfoBar.png"
|
||||
image:"qrc:/example/res/image/control/InfoBar.png"
|
||||
recentlyUpdated:true
|
||||
desc:"An inline message to display app-wide statuschange information."
|
||||
onTap:{
|
||||
navigationView.push("qrc:/T_InfoBar.qml")
|
||||
navigationView.push("qrc:/example/qml/page/T_InfoBar.qml")
|
||||
}
|
||||
}
|
||||
FluPaneItem{
|
||||
title:"Progress"
|
||||
onTap:{
|
||||
navigationView.push("qrc:/T_Progress.qml")
|
||||
navigationView.push("qrc:/example/qml/page/T_Progress.qml")
|
||||
}
|
||||
}
|
||||
FluPaneItem{
|
||||
title:"RatingControl"
|
||||
onTap:{
|
||||
navigationView.push("qrc:/example/qml/page/T_RatingControl.qml")
|
||||
}
|
||||
}
|
||||
FluPaneItem{
|
||||
title:"Badge"
|
||||
onTap:{
|
||||
navigationView.push("qrc:/T_Badge.qml")
|
||||
navigationView.push("qrc:/example/qml/page/T_Badge.qml")
|
||||
}
|
||||
}
|
||||
FluPaneItem{
|
||||
title:"Rectangle"
|
||||
onTap:{
|
||||
navigationView.push("qrc:/T_Rectangle.qml")
|
||||
navigationView.push("qrc:/example/qml/page/T_Rectangle.qml")
|
||||
}
|
||||
}
|
||||
FluPaneItem{
|
||||
title:"StatusView"
|
||||
onTap:{
|
||||
navigationView.push("qrc:/example/qml/page/T_StatusView.qml")
|
||||
}
|
||||
}
|
||||
FluPaneItem{
|
||||
title:"Carousel"
|
||||
onTap:{
|
||||
navigationView.push("qrc:/T_Carousel.qml")
|
||||
navigationView.push("qrc:/example/qml/page/T_Carousel.qml")
|
||||
}
|
||||
}
|
||||
FluPaneItem{
|
||||
title:"Expander"
|
||||
onTap:{
|
||||
navigationView.push("qrc:/T_Expander.qml")
|
||||
navigationView.push("qrc:/example/qml/page/T_Expander.qml")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
FluPaneItemExpander{
|
||||
title:"Popus"
|
||||
title:lang.popus
|
||||
icon:FluentIcons.ButtonMenu
|
||||
FluPaneItem{
|
||||
title:"Dialog"
|
||||
onTap:{
|
||||
navigationView.push("qrc:/T_Dialog.qml")
|
||||
navigationView.push("qrc:/example/qml/page/T_Dialog.qml")
|
||||
}
|
||||
}
|
||||
FluPaneItem{
|
||||
title:"Tooltip"
|
||||
onTap:{
|
||||
navigationView.push("qrc:/T_Tooltip.qml")
|
||||
navigationView.push("qrc:/example/qml/page/T_Tooltip.qml")
|
||||
}
|
||||
}
|
||||
FluPaneItem{
|
||||
title:"Menu"
|
||||
onTap:{
|
||||
navigationView.push("qrc:/T_Menu.qml")
|
||||
navigationView.push("qrc:/example/qml/page/T_Menu.qml")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
FluPaneItemExpander{
|
||||
title:"Navigation"
|
||||
title:lang.navigation
|
||||
icon:FluentIcons.AllApps
|
||||
FluPaneItem{
|
||||
title:"Pivot"
|
||||
image:"qrc:/res/image/control/Pivot.png"
|
||||
image:"qrc:/example/res/image/control/Pivot.png"
|
||||
recentlyAdded:true
|
||||
order:3
|
||||
desc:"Presents information from different sources in atabbed view."
|
||||
onTap:{
|
||||
navigationView.push("qrc:/T_Pivot.qml")
|
||||
navigationView.push("qrc:/example/qml/page/T_Pivot.qml")
|
||||
}
|
||||
}
|
||||
FluPaneItem{
|
||||
title:"BreadcrumbBar"
|
||||
onTap:{
|
||||
navigationView.push("qrc:/example/qml/page/T_BreadcrumbBar.qml")
|
||||
}
|
||||
}
|
||||
FluPaneItem{
|
||||
title:"TabView"
|
||||
image:"qrc:/res/image/control/TabView.png"
|
||||
image:"qrc:/example/res/image/control/TabView.png"
|
||||
recentlyAdded:true
|
||||
order:1
|
||||
desc:"A control that displays a collection of tabs thatcan be used to display several documents."
|
||||
onTap:{
|
||||
navigationView.push("qrc:/T_TabView.qml")
|
||||
navigationView.push("qrc:/example/qml/page/T_TabView.qml")
|
||||
}
|
||||
}
|
||||
FluPaneItem{
|
||||
title:"TreeView"
|
||||
onTap:{
|
||||
navigationView.push("qrc:/T_TreeView.qml")
|
||||
navigationView.push("qrc:/example/qml/page/T_TreeView.qml")
|
||||
}
|
||||
}
|
||||
FluPaneItem{
|
||||
title:"TableView"
|
||||
image:"qrc:/res/image/control/DataGrid.png"
|
||||
image:"qrc:/example/res/image/control/DataGrid.png"
|
||||
recentlyAdded:true
|
||||
order:4
|
||||
desc:"The TableView control provides a flexible way to display a collection of data in rows and columns"
|
||||
onTap:{
|
||||
navigationView.push("qrc:/T_TableView.qml")
|
||||
navigationView.push("qrc:/example/qml/page/T_TableView.qml")
|
||||
}
|
||||
}
|
||||
FluPaneItem{
|
||||
title:"MultiWindow"
|
||||
onTap:{
|
||||
navigationView.push("qrc:/T_MultiWindow.qml")
|
||||
navigationView.push("qrc:/example/qml/page/T_MultiWindow.qml")
|
||||
}
|
||||
}
|
||||
FluPaneItem{
|
||||
title:"FlipView"
|
||||
image:"qrc:/res/image/control/FlipView.png"
|
||||
image:"qrc:/example/res/image/control/FlipView.png"
|
||||
recentlyAdded:true
|
||||
order:2
|
||||
desc:"Presents a collection of items that the user canflip through, one item at a time."
|
||||
onTap:{
|
||||
navigationView.push("qrc:/T_FlipView.qml")
|
||||
navigationView.push("qrc:/example/qml/page/T_FlipView.qml")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
FluPaneItemExpander{
|
||||
title:"Theming"
|
||||
title:lang.theming
|
||||
icon:FluentIcons.Brightness
|
||||
FluPaneItem{
|
||||
title:"Theme"
|
||||
onTap:{
|
||||
navigationView.push("qrc:/T_Theme.qml")
|
||||
navigationView.push("qrc:/example/qml/page/T_Theme.qml")
|
||||
}
|
||||
}
|
||||
FluPaneItem{
|
||||
title:"Typography"
|
||||
onTap:{
|
||||
navigationView.push("qrc:/T_Typography.qml")
|
||||
navigationView.push("qrc:/example/qml/page/T_Typography.qml")
|
||||
}
|
||||
}
|
||||
FluPaneItem{
|
||||
title:"Awesome"
|
||||
onTap:{
|
||||
navigationView.push("qrc:/T_Awesome.qml")
|
||||
navigationView.push("qrc:/example/qml/page/T_Awesome.qml")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
FluPaneItemExpander{
|
||||
title:"Media"
|
||||
title:lang.media
|
||||
icon:FluentIcons.Media
|
||||
FluPaneItem{
|
||||
title:"MediaPlayer"
|
||||
image:"qrc:/res/image/control/MediaPlayerElement.png"
|
||||
image:"qrc:/example/res/image/control/MediaPlayerElement.png"
|
||||
recentlyAdded:true
|
||||
order:0
|
||||
desc:"A control to display video and image content."
|
||||
onTap:{
|
||||
navigationView.push("qrc:/T_MediaPlayer.qml")
|
||||
navigationView.push("qrc:/example/qml/page/T_MediaPlayer.qml")
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -295,21 +320,7 @@ FluObject{
|
||||
}
|
||||
|
||||
function startPageByItem(data){
|
||||
var items = navigationView.getItems();
|
||||
for(var i=0;i<items.length;i++){
|
||||
var item = items[i]
|
||||
if(item.key === data.key){
|
||||
if(navigationView.getCurrentIndex() === i){
|
||||
return
|
||||
}
|
||||
item.tap()
|
||||
navigationView.setCurrentIndex(i)
|
||||
if(item.parent){
|
||||
item.parent.isExpand = true
|
||||
}
|
||||
return
|
||||
}
|
||||
}
|
||||
navigationView.startPageByItem(data)
|
||||
}
|
||||
|
||||
}
|
9
example/qml/global/MainEvent.qml
Normal file
@ -0,0 +1,9 @@
|
||||
pragma Singleton
|
||||
|
||||
import QtQuick
|
||||
import QtQuick.Controls
|
||||
import FluentUI
|
||||
|
||||
QtObject {
|
||||
property int displayMode : FluNavigationView.Auto
|
||||
}
|
@ -1,2 +1,3 @@
|
||||
singleton ItemsOriginal 1.0 ItemsOriginal.qml
|
||||
singleton ItemsFooter 1.0 ItemsFooter.qml
|
||||
singleton MainEvent 1.0 MainEvent.qml
|
@ -3,7 +3,7 @@ import QtQuick.Layouts
|
||||
import QtQuick.Window
|
||||
import QtQuick.Controls
|
||||
import FluentUI
|
||||
import "./component"
|
||||
import "../component"
|
||||
|
||||
FluScrollablePage{
|
||||
|
||||
@ -103,6 +103,7 @@ FluScrollablePage{
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'Rectangle{
|
||||
width: 40
|
||||
height: 40
|
98
example/qml/page/T_BreadcrumbBar.qml
Normal file
@ -0,0 +1,98 @@
|
||||
import QtQuick
|
||||
import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
import QtQuick.Window
|
||||
import FluentUI
|
||||
import "../component"
|
||||
|
||||
FluScrollablePage{
|
||||
|
||||
title:"BreadcurmbBar"
|
||||
leftPadding:10
|
||||
rightPadding:10
|
||||
bottomPadding:20
|
||||
spacing: 0
|
||||
|
||||
Component.onCompleted: {
|
||||
var items = []
|
||||
for(var i=0;i<10;i++){
|
||||
items.push({title:"Item_"+(i+1)})
|
||||
}
|
||||
breadcrumb_1.items = items
|
||||
breadcrumb_2.items = items
|
||||
}
|
||||
|
||||
FluArea{
|
||||
Layout.fillWidth: true
|
||||
height: 68
|
||||
paddings: 10
|
||||
Layout.topMargin: 20
|
||||
|
||||
FluBreadcrumbBar{
|
||||
id:breadcrumb_1
|
||||
width:parent.width
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
onClickItem:
|
||||
(model)=>{
|
||||
showSuccess(model.title)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
FluArea{
|
||||
Layout.fillWidth: true
|
||||
height: 100
|
||||
paddings: 10
|
||||
Layout.topMargin: 20
|
||||
|
||||
ColumnLayout{
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
width:parent.width
|
||||
spacing: 10
|
||||
|
||||
FluFilledButton{
|
||||
text:"Reset sample"
|
||||
onClicked:{
|
||||
var items = []
|
||||
for(var i=0;i<10;i++){
|
||||
items.push({title:"Item_"+(i+1)})
|
||||
}
|
||||
breadcrumb_2.items = items
|
||||
}
|
||||
}
|
||||
|
||||
FluBreadcrumbBar{
|
||||
id:breadcrumb_2
|
||||
separator:">"
|
||||
spacing:8
|
||||
textSize:18
|
||||
Layout.fillWidth: true
|
||||
onClickItem:
|
||||
(model)=>{
|
||||
//不是点击最后一个item元素
|
||||
if(model.index+1!==count()){
|
||||
breadcrumb_2.remove(model.index+1,count()-model.index-1)
|
||||
}
|
||||
showSuccess(model.title)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluBreadcrumbBar{
|
||||
width:parent.width
|
||||
separator:">"
|
||||
spacing:8
|
||||
textSize:18
|
||||
onClickItem: (model)=>{
|
||||
|
||||
}
|
||||
}'
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -2,8 +2,9 @@
|
||||
import QtQuick.Layouts
|
||||
import QtQuick.Window
|
||||
import QtQuick.Controls
|
||||
import QtQuick.Controls.Basic
|
||||
import FluentUI
|
||||
import "./component"
|
||||
import "../component"
|
||||
|
||||
FluScrollablePage{
|
||||
title:"Buttons"
|
||||
@ -51,6 +52,7 @@ FluScrollablePage{
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluTextButton{
|
||||
text:"Text Button"
|
||||
onClicked: {
|
||||
@ -92,6 +94,7 @@ FluScrollablePage{
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluButton{
|
||||
text:"Standard Button"
|
||||
onClicked: {
|
||||
@ -133,6 +136,7 @@ FluScrollablePage{
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluFilledButton{
|
||||
text:"Filled Button"
|
||||
onClicked: {
|
||||
@ -174,6 +178,7 @@ FluScrollablePage{
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluToggleButton{
|
||||
text:"Toggle Button"
|
||||
onClicked: {
|
||||
@ -216,6 +221,7 @@ FluScrollablePage{
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluIconButton{
|
||||
iconSource:FluentIcons.ChromeCloseContrast
|
||||
onClicked: {
|
||||
@ -266,6 +272,7 @@ FluScrollablePage{
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluDropDownButton{
|
||||
text:"DropDownButton"
|
||||
items:[
|
||||
@ -327,6 +334,7 @@ FluScrollablePage{
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluRadioButton{
|
||||
selected:true
|
||||
text:"Text Button"
|
||||
@ -365,6 +373,7 @@ FluScrollablePage{
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluCheckBox{
|
||||
text:"Check Box"
|
||||
}'
|
@ -3,7 +3,7 @@ import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
import QtQuick.Window
|
||||
import FluentUI
|
||||
import "./component"
|
||||
import "../component"
|
||||
|
||||
FluScrollablePage{
|
||||
|
||||
@ -23,6 +23,7 @@ FluScrollablePage{
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluCalendarView{
|
||||
|
||||
}'
|
||||
@ -44,6 +45,7 @@ FluScrollablePage{
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluCalendarPicker{
|
||||
|
||||
}'
|
@ -3,7 +3,7 @@ import QtQuick.Layouts
|
||||
import QtQuick.Window
|
||||
import QtQuick.Controls
|
||||
import FluentUI
|
||||
import "./component"
|
||||
import "../component"
|
||||
|
||||
FluScrollablePage{
|
||||
|
||||
@ -32,18 +32,19 @@ FluScrollablePage{
|
||||
Layout.topMargin: 20
|
||||
Layout.leftMargin: 5
|
||||
Component.onCompleted: {
|
||||
carousel.setData([{url:"qrc:/res/image/banner_1.jpg"},{url:"qrc:/res/image/banner_2.jpg"},{url:"qrc:/res/image/banner_3.jpg"}])
|
||||
carousel.setData([{url:"qrc:/example/res/image/banner_1.jpg"},{url:"qrc:/example/res/image/banner_2.jpg"},{url:"qrc:/example/res/image/banner_3.jpg"}])
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluCarousel{
|
||||
width: 400
|
||||
height: 300
|
||||
Component.onCompleted: {
|
||||
setData([{url:"qrc:/res/image/banner_1.jpg"},{url:"qrc:/res/image/banner_2.jpg"},{url:"qrc:/res/image/banner_3.jpg"}])
|
||||
setData([{url:"qrc:/example/res/image/banner_1.jpg"},{url:"qrc:/example/res/image/banner_2.jpg"},{url:"qrc:/example/res/image/banner_3.jpg"}])
|
||||
}
|
||||
}'
|
||||
}
|
@ -3,7 +3,7 @@ import QtQuick.Layouts
|
||||
import QtQuick.Window
|
||||
import QtQuick.Controls
|
||||
import FluentUI
|
||||
import "./component"
|
||||
import "../component"
|
||||
|
||||
FluScrollablePage{
|
||||
|
||||
@ -30,6 +30,7 @@ FluScrollablePage{
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluCheckBox{
|
||||
text:"Text"
|
||||
}'
|
@ -3,7 +3,7 @@ import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
import QtQuick.Window
|
||||
import FluentUI
|
||||
import "./component"
|
||||
import "../component"
|
||||
|
||||
FluScrollablePage{
|
||||
|
||||
@ -41,6 +41,7 @@ FluScrollablePage{
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluColorView{
|
||||
|
||||
}'
|
||||
@ -64,6 +65,7 @@ FluScrollablePage{
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluColorPicker{
|
||||
|
||||
}'
|
@ -3,7 +3,7 @@ import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
import QtQuick.Window
|
||||
import FluentUI
|
||||
import "./component"
|
||||
import "../component"
|
||||
|
||||
FluScrollablePage{
|
||||
|
||||
@ -32,6 +32,7 @@ FluScrollablePage{
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluDatePicker{
|
||||
|
||||
}'
|
||||
@ -59,6 +60,7 @@ FluScrollablePage{
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluDatePicker{
|
||||
showYear:false
|
||||
}'
|
122
example/qml/page/T_Dialog.qml
Normal file
@ -0,0 +1,122 @@
|
||||
import QtQuick
|
||||
import QtQuick.Layouts
|
||||
import QtQuick.Window
|
||||
import QtQuick.Controls
|
||||
import FluentUI
|
||||
import "../component"
|
||||
|
||||
FluScrollablePage{
|
||||
|
||||
title:"Dialog"
|
||||
leftPadding:10
|
||||
rightPadding:10
|
||||
bottomPadding:20
|
||||
spacing: 0
|
||||
|
||||
FluArea{
|
||||
Layout.fillWidth: true
|
||||
height: 68
|
||||
paddings: 10
|
||||
Layout.topMargin: 20
|
||||
FluButton{
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
Layout.topMargin: 20
|
||||
text:"Show Double Button Dialog"
|
||||
onClicked: {
|
||||
double_btn_dialog.open()
|
||||
}
|
||||
}
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluContentDialog{
|
||||
id:dialog
|
||||
title:"友情提示"
|
||||
message:"确定要退出程序么?"
|
||||
negativeText:"取消"
|
||||
buttonFlags: FluContentDialog.NegativeButton | FluContentDialog.PositiveButton
|
||||
onNegativeClicked:{
|
||||
showSuccess("点击取消按钮")
|
||||
}
|
||||
positiveText:"确定"
|
||||
onPositiveClicked:{
|
||||
showSuccess("点击确定按钮")
|
||||
}
|
||||
}
|
||||
dialog.open()'
|
||||
}
|
||||
|
||||
FluContentDialog{
|
||||
id:double_btn_dialog
|
||||
title:"友情提示"
|
||||
message:"确定要退出程序么?"
|
||||
buttonFlags: FluContentDialog.NegativeButton | FluContentDialog.PositiveButton
|
||||
negativeText:"取消"
|
||||
onNegativeClicked:{
|
||||
showSuccess("点击取消按钮")
|
||||
}
|
||||
positiveText:"确定"
|
||||
onPositiveClicked:{
|
||||
showSuccess("点击确定按钮")
|
||||
}
|
||||
}
|
||||
|
||||
FluArea{
|
||||
Layout.fillWidth: true
|
||||
height: 68
|
||||
paddings: 10
|
||||
Layout.topMargin: 20
|
||||
FluButton{
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
Layout.topMargin: 20
|
||||
text:"Show Triple Button Dialog"
|
||||
onClicked: {
|
||||
triple_btn_dialog.open()
|
||||
}
|
||||
}
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluContentDialog{
|
||||
id:dialog
|
||||
title:"友情提示"
|
||||
message:"确定要退出程序么?"
|
||||
negativeText:"取消"
|
||||
buttonFlags: FluContentDialog.NeutralButton | FluContentDialog.NegativeButton | FluContentDialog.PositiveButton
|
||||
negativeText:"取消"
|
||||
onNegativeClicked:{
|
||||
showSuccess("点击取消按钮")
|
||||
}
|
||||
positiveText:"确定"
|
||||
onPositiveClicked:{
|
||||
showSuccess("点击确定按钮")
|
||||
}
|
||||
neutralText:"最小化"
|
||||
onNeutralClicked:{
|
||||
showSuccess("点击最小化按钮")
|
||||
}
|
||||
}
|
||||
dialog.open()'
|
||||
}
|
||||
|
||||
FluContentDialog{
|
||||
id:triple_btn_dialog
|
||||
title:"友情提示"
|
||||
message:"确定要退出程序么?"
|
||||
buttonFlags: FluContentDialog.NeutralButton | FluContentDialog.NegativeButton | FluContentDialog.PositiveButton
|
||||
negativeText:"取消"
|
||||
onNegativeClicked:{
|
||||
showSuccess("点击取消按钮")
|
||||
}
|
||||
positiveText:"确定"
|
||||
onPositiveClicked:{
|
||||
showSuccess("点击确定按钮")
|
||||
}
|
||||
neutralText:"最小化"
|
||||
onNeutralClicked:{
|
||||
showSuccess("点击最小化按钮")
|
||||
}
|
||||
}
|
||||
}
|
@ -3,7 +3,7 @@ import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
import QtQuick.Window
|
||||
import FluentUI
|
||||
import "./component"
|
||||
import "../component"
|
||||
|
||||
FluScrollablePage{
|
||||
|
||||
@ -15,14 +15,14 @@ FluScrollablePage{
|
||||
|
||||
FluArea{
|
||||
Layout.fillWidth: true
|
||||
height: layout_column.height+40
|
||||
height: layout_column.height+20
|
||||
paddings: 10
|
||||
Layout.topMargin: 20
|
||||
Column{
|
||||
id:layout_column
|
||||
spacing: 15
|
||||
anchors{
|
||||
verticalCenter: parent.verticalCenter
|
||||
top:parent.top
|
||||
left:parent.left
|
||||
}
|
||||
|
||||
@ -77,12 +77,12 @@ FluScrollablePage{
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluExpander{
|
||||
headerText:"打开一个单选框"
|
||||
Item{
|
@ -3,7 +3,7 @@ import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
import QtQuick.Window
|
||||
import FluentUI
|
||||
import "./component"
|
||||
import "../component"
|
||||
|
||||
FluScrollablePage{
|
||||
|
||||
@ -25,17 +25,17 @@ FluScrollablePage{
|
||||
}
|
||||
FluFlipView{
|
||||
Image{
|
||||
source: "qrc:/res/image/banner_1.jpg"
|
||||
source: "qrc:/example/res/image/banner_1.jpg"
|
||||
asynchronous: true
|
||||
fillMode:Image.PreserveAspectCrop
|
||||
}
|
||||
Image{
|
||||
source: "qrc:/res/image/banner_2.jpg"
|
||||
source: "qrc:/example/res/image/banner_2.jpg"
|
||||
asynchronous: true
|
||||
fillMode:Image.PreserveAspectCrop
|
||||
}
|
||||
Image{
|
||||
source: "qrc:/res/image/banner_3.jpg"
|
||||
source: "qrc:/example/res/image/banner_3.jpg"
|
||||
asynchronous: true
|
||||
fillMode:Image.PreserveAspectCrop
|
||||
}
|
||||
@ -44,19 +44,20 @@ FluScrollablePage{
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluFlipView{
|
||||
Image{
|
||||
source: "qrc:/res/image/banner_1.jpg"
|
||||
source: "qrc:/example/res/image/banner_1.jpg"
|
||||
asynchronous: true
|
||||
fillMode:Image.PreserveAspectCrop
|
||||
}
|
||||
Image{
|
||||
source: "qrc:/res/image/banner_1.jpg"
|
||||
source: "qrc:/example/res/image/banner_1.jpg"
|
||||
asynchronous: true
|
||||
fillMode:Image.PreserveAspectCrop
|
||||
}
|
||||
Image{
|
||||
source: "qrc:/res/image/banner_1.jpg"
|
||||
source: "qrc:/example/res/image/banner_1.jpg"
|
||||
asynchronous: true
|
||||
fillMode:Image.PreserveAspectCrop
|
||||
}
|
||||
@ -77,18 +78,18 @@ FluScrollablePage{
|
||||
FluFlipView{
|
||||
vertical:true
|
||||
Image{
|
||||
source: "qrc:/res/image/banner_1.jpg"
|
||||
source: "qrc:/example/res/image/banner_1.jpg"
|
||||
asynchronous: true
|
||||
sourceSize: Qt.size(400,300)
|
||||
fillMode:Image.PreserveAspectCrop
|
||||
}
|
||||
Image{
|
||||
source: "qrc:/res/image/banner_2.jpg"
|
||||
source: "qrc:/example/res/image/banner_2.jpg"
|
||||
asynchronous: true
|
||||
fillMode:Image.PreserveAspectCrop
|
||||
}
|
||||
Image{
|
||||
source: "qrc:/res/image/banner_3.jpg"
|
||||
source: "qrc:/example/res/image/banner_3.jpg"
|
||||
asynchronous: true
|
||||
fillMode:Image.PreserveAspectCrop
|
||||
}
|
||||
@ -97,20 +98,21 @@ FluScrollablePage{
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluFlipView{
|
||||
vertical:true
|
||||
Image{
|
||||
source: "qrc:/res/image/banner_1.jpg"
|
||||
source: "qrc:/example/res/image/banner_1.jpg"
|
||||
asynchronous: true
|
||||
fillMode:Image.PreserveAspectCrop
|
||||
}
|
||||
Image{
|
||||
source: "qrc:/res/image/banner_1.jpg"
|
||||
source: "qrc:/example/res/image/banner_1.jpg"
|
||||
asynchronous: true
|
||||
fillMode:Image.PreserveAspectCrop
|
||||
}
|
||||
Image{
|
||||
source: "qrc:/res/image/banner_1.jpg"
|
||||
source: "qrc:/example/res/image/banner_1.jpg"
|
||||
asynchronous: true
|
||||
fillMode:Image.PreserveAspectCrop
|
||||
}
|
@ -2,7 +2,7 @@
|
||||
import QtQuick.Layouts
|
||||
import QtQuick.Window
|
||||
import QtQuick.Controls
|
||||
import "qrc:///global/"
|
||||
import "qrc:///example/qml/global/"
|
||||
import FluentUI
|
||||
|
||||
FluScrollablePage{
|
||||
@ -15,7 +15,7 @@ FluScrollablePage{
|
||||
ListModel{
|
||||
id:model_header
|
||||
ListElement{
|
||||
icon:"qrc:/res/image/ic_home_github.png"
|
||||
icon:"qrc:/example/res/image/ic_home_github.png"
|
||||
title:"FluentUI GitHub"
|
||||
desc:"The latest FluentUI controls and styles for your applications."
|
||||
url:"https://github.com/zhuzichu520/FluentUI"
|
||||
@ -30,7 +30,7 @@ FluScrollablePage{
|
||||
fillMode:Image.PreserveAspectCrop
|
||||
anchors.fill: parent
|
||||
verticalAlignment: Qt.AlignTop
|
||||
source: "qrc:/res/image/bg_home_header.png"
|
||||
source: "qrc:/example/res/image/bg_home_header.png"
|
||||
}
|
||||
Rectangle{
|
||||
anchors.fill: parent
|
@ -3,7 +3,7 @@ import QtQuick.Layouts
|
||||
import QtQuick.Window
|
||||
import QtQuick.Controls
|
||||
import FluentUI
|
||||
import "./component"
|
||||
import "../component"
|
||||
|
||||
FluScrollablePage{
|
||||
|
||||
@ -52,12 +52,13 @@ FluScrollablePage{
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
code:' showInfo("这是一个Info样式的InfoBar")
|
||||
Layout.topMargin: -1
|
||||
code:'showInfo("这是一个Info样式的InfoBar")
|
||||
|
||||
showWarning("这是一个Warning样式的InfoBar")
|
||||
showWarning("这是一个Warning样式的InfoBar")
|
||||
|
||||
showError("这是一个Error样式的InfoBar")
|
||||
showError("这是一个Error样式的InfoBar")
|
||||
|
||||
showSuccess("这是一个Success样式的InfoBar这是一个Success样式的InfoBar")'
|
||||
showSuccess("这是一个Success样式的InfoBar这是一个Success样式的InfoBar")'
|
||||
}
|
||||
}
|
@ -3,7 +3,7 @@ import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
import QtQuick.Window
|
||||
import FluentUI
|
||||
import "./component"
|
||||
import "../component"
|
||||
|
||||
FluScrollablePage{
|
||||
|
||||
@ -38,6 +38,7 @@ FluScrollablePage{
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluMediaPlayer{
|
||||
id:player
|
||||
source:"http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"
|
@ -3,7 +3,7 @@ import QtQuick.Layouts
|
||||
import QtQuick.Window
|
||||
import QtQuick.Controls
|
||||
import FluentUI
|
||||
import "./component"
|
||||
import "../component"
|
||||
|
||||
FluScrollablePage{
|
||||
|
||||
@ -53,6 +53,7 @@ FluScrollablePage{
|
||||
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluMenu{
|
||||
id:menu
|
||||
FluMenuItem:{
|
190
example/qml/page/T_MultiWindow.qml
Normal file
@ -0,0 +1,190 @@
|
||||
import QtQuick
|
||||
import QtQuick.Layouts
|
||||
import QtQuick.Window
|
||||
import QtQuick.Controls
|
||||
import FluentUI
|
||||
import "../component"
|
||||
|
||||
FluScrollablePage{
|
||||
|
||||
property string password: ""
|
||||
property var loginPageRegister: registerForWindowResult("/login")
|
||||
|
||||
title:"MultiWindow"
|
||||
leftPadding:10
|
||||
rightPadding:10
|
||||
bottomPadding:20
|
||||
spacing: 0
|
||||
|
||||
Connections{
|
||||
target: loginPageRegister
|
||||
function onResult(data)
|
||||
{
|
||||
password = data.password
|
||||
}
|
||||
}
|
||||
|
||||
FluArea{
|
||||
Layout.fillWidth: true
|
||||
height: 86
|
||||
paddings: 10
|
||||
Layout.topMargin: 20
|
||||
Column{
|
||||
spacing: 15
|
||||
anchors{
|
||||
verticalCenter: parent.verticalCenter
|
||||
left: parent.left
|
||||
}
|
||||
FluText{
|
||||
text:"<font color='red'>Standard</font>模式窗口,每次都会创建新窗口"
|
||||
}
|
||||
FluButton{
|
||||
text:"点击创建窗口"
|
||||
onClicked: {
|
||||
FluApp.navigate("/standardWindow")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
FluArea{
|
||||
Layout.fillWidth: true
|
||||
height: 86
|
||||
paddings: 10
|
||||
Layout.topMargin: 10
|
||||
Column{
|
||||
spacing: 15
|
||||
anchors{
|
||||
verticalCenter: parent.verticalCenter
|
||||
left: parent.left
|
||||
}
|
||||
FluText{
|
||||
text:"<font color='red'>SingleTask</font>模式窗口,如果窗口存在,这激活该窗口"
|
||||
textFormat: Text.RichText
|
||||
}
|
||||
FluButton{
|
||||
text:"点击创建窗口"
|
||||
onClicked: {
|
||||
FluApp.navigate("/singleTaskWindow")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
FluArea{
|
||||
Layout.fillWidth: true
|
||||
height: 86
|
||||
paddings: 10
|
||||
Layout.topMargin: 10
|
||||
Column{
|
||||
spacing: 15
|
||||
anchors{
|
||||
verticalCenter: parent.verticalCenter
|
||||
left: parent.left
|
||||
}
|
||||
FluText{
|
||||
text:"<font color='red'>SingleInstance</font>模式窗口,如果窗口存在,则销毁窗口,然后新建窗口"
|
||||
}
|
||||
FluButton{
|
||||
text:"点击创建窗口"
|
||||
onClicked: {
|
||||
FluApp.navigate("/singleInstanceWindow")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluWindow{
|
||||
//launchMode: FluWindow.Standard
|
||||
//launchMode: FluWindow.SingleTask
|
||||
launchMode: FluWindow.SingleInstance
|
||||
}
|
||||
'
|
||||
}
|
||||
|
||||
|
||||
FluArea{
|
||||
Layout.fillWidth: true
|
||||
height: 100
|
||||
paddings: 10
|
||||
Layout.topMargin: 20
|
||||
Column{
|
||||
spacing: 15
|
||||
anchors{
|
||||
verticalCenter: parent.verticalCenter
|
||||
left: parent.left
|
||||
}
|
||||
FluText{
|
||||
text:"页面跳转,不携带任何参数"
|
||||
}
|
||||
FluButton{
|
||||
text:"点击跳转"
|
||||
onClicked: {
|
||||
FluApp.navigate("/about")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluButton{
|
||||
text:"点击跳转"
|
||||
onClicked: {
|
||||
FluApp.navigate("/about")
|
||||
}
|
||||
}
|
||||
'
|
||||
}
|
||||
|
||||
FluArea{
|
||||
Layout.fillWidth: true
|
||||
height: 130
|
||||
paddings: 10
|
||||
Layout.topMargin: 20
|
||||
|
||||
Column{
|
||||
spacing: 15
|
||||
anchors{
|
||||
verticalCenter: parent.verticalCenter
|
||||
left: parent.left
|
||||
}
|
||||
FluText{
|
||||
text:"页面跳转,并携带参数用户名:zhuzichu"
|
||||
}
|
||||
FluButton{
|
||||
text:"点击跳转到登录"
|
||||
onClicked: {
|
||||
loginPageRegister.launch({username:"zhuzichu"})
|
||||
}
|
||||
}
|
||||
FluText{
|
||||
text:"登录窗口返回过来的密码->"+password
|
||||
}
|
||||
}
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'property var loginPageRegister: registerForWindowResult("/login")
|
||||
|
||||
Connections{
|
||||
target: loginPageRegister
|
||||
function onResult(data)
|
||||
{
|
||||
password = data.password
|
||||
}
|
||||
}
|
||||
|
||||
FluButton{
|
||||
text:"点击跳转"
|
||||
onClicked: {
|
||||
loginPageRegister.launch({username:"zhuzichu"})
|
||||
}
|
||||
}
|
||||
'
|
||||
}
|
||||
|
||||
}
|
@ -3,7 +3,7 @@ import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
import QtQuick.Window
|
||||
import FluentUI
|
||||
import "./component"
|
||||
import "../component"
|
||||
|
||||
FluScrollablePage{
|
||||
|
||||
@ -21,6 +21,7 @@ FluScrollablePage{
|
||||
|
||||
FluPivot{
|
||||
anchors.fill: parent
|
||||
currentIndex: 2
|
||||
FluPivotItem{
|
||||
title:"All"
|
||||
contentItem:FluText{
|
||||
@ -49,6 +50,7 @@ FluScrollablePage{
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluPivot{
|
||||
anchors.fill: parent
|
||||
FluPivotItem:{
|
@ -3,7 +3,7 @@ import QtQuick.Layouts
|
||||
import QtQuick.Window
|
||||
import QtQuick.Controls
|
||||
import FluentUI
|
||||
import "./component"
|
||||
import "../component"
|
||||
|
||||
FluScrollablePage{
|
||||
|
||||
@ -47,6 +47,7 @@ FluScrollablePage{
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluProgressBar{
|
||||
|
||||
}
|
44
example/qml/page/T_RatingControl.qml
Normal file
@ -0,0 +1,44 @@
|
||||
import QtQuick
|
||||
import QtQuick.Layouts
|
||||
import QtQuick.Window
|
||||
import QtQuick.Controls
|
||||
import FluentUI
|
||||
import "../component"
|
||||
|
||||
FluScrollablePage{
|
||||
|
||||
title:"RatingControl"
|
||||
leftPadding:10
|
||||
rightPadding:10
|
||||
bottomPadding:20
|
||||
spacing: 0
|
||||
|
||||
FluArea{
|
||||
Layout.fillWidth: true
|
||||
height: 100
|
||||
paddings: 10
|
||||
Layout.topMargin: 20
|
||||
|
||||
Column{
|
||||
spacing: 10
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
FluRatingControl{
|
||||
|
||||
}
|
||||
FluRatingControl{
|
||||
number:10
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluRatingControl{
|
||||
|
||||
}'
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -3,7 +3,7 @@ import QtQuick.Layouts
|
||||
import QtQuick.Controls
|
||||
import QtQuick.Window
|
||||
import FluentUI
|
||||
import "./component"
|
||||
import "../component"
|
||||
|
||||
FluScrollablePage{
|
||||
|
||||
@ -79,7 +79,7 @@ FluScrollablePage{
|
||||
Image {
|
||||
asynchronous: true
|
||||
anchors.fill: parent
|
||||
source: "qrc:/res/svg/avatar_1.svg"
|
||||
source: "qrc:/example/res/svg/avatar_1.svg"
|
||||
sourceSize: Qt.size(width,height)
|
||||
}
|
||||
}
|
||||
@ -91,7 +91,7 @@ FluScrollablePage{
|
||||
asynchronous: true
|
||||
anchors.fill: parent
|
||||
sourceSize: Qt.size(width,height)
|
||||
source: "qrc:/res/svg/avatar_2.svg"
|
||||
source: "qrc:/example/res/svg/avatar_2.svg"
|
||||
}
|
||||
}
|
||||
FluRectangle{
|
||||
@ -102,7 +102,7 @@ FluScrollablePage{
|
||||
asynchronous: true
|
||||
anchors.fill: parent
|
||||
sourceSize: Qt.size(width,height)
|
||||
source: "qrc:/res/svg/avatar_3.svg"
|
||||
source: "qrc:/example/res/svg/avatar_3.svg"
|
||||
}
|
||||
}
|
||||
FluRectangle{
|
||||
@ -113,7 +113,7 @@ FluScrollablePage{
|
||||
asynchronous: true
|
||||
anchors.fill: parent
|
||||
sourceSize: Qt.size(width,height)
|
||||
source: "qrc:/res/svg/avatar_4.svg"
|
||||
source: "qrc:/example/res/svg/avatar_4.svg"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -123,7 +123,7 @@ FluScrollablePage{
|
||||
radius:[25,25,25,25]
|
||||
Image {
|
||||
asynchronous: true
|
||||
source: "qrc:/res/image/image_huoyin.webp"
|
||||
source: "qrc:/example/res/image/image_huoyin.webp"
|
||||
anchors.fill: parent
|
||||
sourceSize: Qt.size(width,height)
|
||||
}
|
||||
@ -134,6 +134,7 @@ FluScrollablePage{
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluRectangle{
|
||||
radius: [25,25,25,25]
|
||||
width: 50
|
||||
@ -141,7 +142,7 @@ FluScrollablePage{
|
||||
Image{
|
||||
asynchronous: true
|
||||
anchors.fill: parent
|
||||
source: "qrc:/res/svg/avatar_4.svg"
|
||||
source: "qrc:/example/res/svg/avatar_4.svg"
|
||||
sourceSize: Qt.size(width,height)
|
||||
}
|
||||
}'
|
117
example/qml/page/T_Settings.qml
Normal file
@ -0,0 +1,117 @@
|
||||
import QtQuick
|
||||
import QtQuick.Layouts
|
||||
import QtQuick.Window
|
||||
import QtQuick.Controls
|
||||
import FluentUI
|
||||
import "qrc:///example/qml/global/"
|
||||
import "../component"
|
||||
|
||||
FluScrollablePage{
|
||||
|
||||
title:"Settings"
|
||||
leftPadding:10
|
||||
rightPadding:10
|
||||
bottomPadding:20
|
||||
spacing: 0
|
||||
|
||||
FluArea{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: 20
|
||||
height: 136
|
||||
paddings: 10
|
||||
|
||||
ColumnLayout{
|
||||
spacing: 10
|
||||
anchors{
|
||||
top: parent.top
|
||||
left: parent.left
|
||||
}
|
||||
FluText{
|
||||
text:lang.dark_mode
|
||||
fontStyle: FluText.BodyStrong
|
||||
Layout.bottomMargin: 4
|
||||
}
|
||||
Repeater{
|
||||
model: [{title:"System",mode:FluDarkMode.System},{title:"Light",mode:FluDarkMode.Light},{title:"Dark",mode:FluDarkMode.Dark}]
|
||||
delegate: FluRadioButton{
|
||||
selected : FluTheme.darkMode === modelData.mode
|
||||
text:modelData.title
|
||||
onClicked:{
|
||||
FluTheme.darkMode = modelData.mode
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
FluArea{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: 20
|
||||
height: 168
|
||||
paddings: 10
|
||||
|
||||
ColumnLayout{
|
||||
spacing: 10
|
||||
anchors{
|
||||
top: parent.top
|
||||
left: parent.left
|
||||
}
|
||||
|
||||
FluText{
|
||||
text:lang.navigation_view_display_mode
|
||||
fontStyle: FluText.BodyStrong
|
||||
Layout.bottomMargin: 4
|
||||
}
|
||||
Repeater{
|
||||
model: [{title:"Open",mode:FluNavigationView.Open},{title:"Compact",mode:FluNavigationView.Compact},{title:"Minimal",mode:FluNavigationView.Minimal},{title:"Auto",mode:FluNavigationView.Auto}]
|
||||
delegate: FluRadioButton{
|
||||
selected : MainEvent.displayMode===modelData.mode
|
||||
text:modelData.title
|
||||
onClicked:{
|
||||
MainEvent.displayMode = modelData.mode
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
FluArea{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: 20
|
||||
height: 80
|
||||
paddings: 10
|
||||
|
||||
ColumnLayout{
|
||||
spacing: 10
|
||||
anchors{
|
||||
top: parent.top
|
||||
left: parent.left
|
||||
}
|
||||
|
||||
FluText{
|
||||
text:lang.locale
|
||||
fontStyle: FluText.BodyStrong
|
||||
Layout.bottomMargin: 4
|
||||
}
|
||||
|
||||
Flow{
|
||||
spacing: 5
|
||||
Repeater{
|
||||
model: ["Zh","En"]
|
||||
delegate: FluRadioButton{
|
||||
selected : appInfo.lang.objectName === modelData
|
||||
text:modelData
|
||||
onClicked:{
|
||||
console.debug(modelData)
|
||||
appInfo.changeLang(modelData)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -2,7 +2,7 @@
|
||||
import QtQuick.Layouts
|
||||
import QtQuick.Window
|
||||
import QtQuick.Controls
|
||||
import "./component"
|
||||
import "../component"
|
||||
import FluentUI
|
||||
|
||||
FluScrollablePage{
|
||||
@ -25,6 +25,7 @@ FluScrollablePage{
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluSlider{
|
||||
value:50
|
||||
}'
|
||||
@ -46,6 +47,7 @@ FluScrollablePage{
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluSlider{
|
||||
vertical:true
|
||||
value:50
|
92
example/qml/page/T_StatusView.qml
Normal file
@ -0,0 +1,92 @@
|
||||
import QtQuick
|
||||
import QtQuick.Layouts
|
||||
import QtQuick.Controls
|
||||
import QtQuick.Window
|
||||
import FluentUI
|
||||
import "../component"
|
||||
|
||||
FluScrollablePage{
|
||||
|
||||
title:"StatusView"
|
||||
leftPadding:10
|
||||
rightPadding:10
|
||||
bottomPadding:20
|
||||
spacing: 0
|
||||
|
||||
FluArea{
|
||||
id:layout_actions
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: 20
|
||||
height: 50
|
||||
paddings: 10
|
||||
RowLayout{
|
||||
spacing: 14
|
||||
FluDropDownButton{
|
||||
id:btn_status_mode
|
||||
Layout.preferredWidth: 140
|
||||
text:"Loading"
|
||||
items:[
|
||||
FluMenuItem{
|
||||
text:"Loading"
|
||||
onClicked: {
|
||||
btn_status_mode.text = text
|
||||
status_view.statusMode = FluStatusView.Loading
|
||||
}
|
||||
},
|
||||
FluMenuItem{
|
||||
text:"Empty"
|
||||
onClicked: {
|
||||
btn_status_mode.text = text
|
||||
status_view.statusMode = FluStatusView.Empty
|
||||
}
|
||||
},
|
||||
FluMenuItem{
|
||||
text:"Error"
|
||||
onClicked: {
|
||||
btn_status_mode.text = text
|
||||
status_view.statusMode = FluStatusView.Error
|
||||
}
|
||||
},
|
||||
FluMenuItem{
|
||||
text:"Success"
|
||||
onClicked: {
|
||||
btn_status_mode.text = text
|
||||
status_view.statusMode = FluStatusView.Success
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
FluArea{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: 10
|
||||
height: 380
|
||||
paddings: 10
|
||||
FluStatusView{
|
||||
id:status_view
|
||||
anchors.fill: parent
|
||||
onErrorClicked:{
|
||||
showError("点击重新加载")
|
||||
}
|
||||
Rectangle {
|
||||
anchors.fill: parent
|
||||
color:FluTheme.primaryColor.dark
|
||||
}
|
||||
}
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluStatusView{
|
||||
anchors.fill: parent
|
||||
statusMode: FluStatusView.Loading
|
||||
Rectangle{
|
||||
anchors.fill: parent
|
||||
color:FluTheme.primaryColor.dark
|
||||
}
|
||||
}'
|
||||
}
|
||||
|
||||
}
|
@ -3,7 +3,7 @@ import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
import QtQuick.Window
|
||||
import FluentUI
|
||||
import "./component"
|
||||
import "../component"
|
||||
|
||||
FluScrollablePage{
|
||||
|
||||
@ -24,7 +24,7 @@ FluScrollablePage{
|
||||
}
|
||||
|
||||
function newTab(){
|
||||
tab_view.appendTab("qrc:/res/image/favicon.ico","Document "+tab_view.count(),com_page,colors[Math.floor(Math.random() * 8)].dark)
|
||||
tab_view.appendTab("qrc:/example/res/image/favicon.ico","Document "+tab_view.count(),com_page,colors[Math.floor(Math.random() * 8)].dark)
|
||||
}
|
||||
|
||||
Component.onCompleted: {
|
||||
@ -113,6 +113,7 @@ FluScrollablePage{
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluTabView{
|
||||
anchors.fill: parent
|
||||
Component.onCompleted: {
|
||||
@ -128,7 +129,7 @@ FluScrollablePage{
|
||||
}
|
||||
}
|
||||
function newTab(){
|
||||
tab_view.appendTab("qrc:/res/image/favicon.ico","Document 1",com_page,argument)
|
||||
tab_view.appendTab("qrc:/example/res/image/favicon.ico","Document 1",com_page,argument)
|
||||
}
|
||||
}
|
||||
'
|
@ -3,7 +3,7 @@ import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
import QtQuick.Window
|
||||
import FluentUI
|
||||
import "./component"
|
||||
import "../component"
|
||||
|
||||
FluScrollablePage{
|
||||
|
||||
@ -45,12 +45,10 @@ FluScrollablePage{
|
||||
loadData(1,10)
|
||||
}
|
||||
|
||||
|
||||
FluTableView{
|
||||
id:table_view
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: 20
|
||||
width:parent.width
|
||||
pageCurrent:1
|
||||
pageCount:10
|
||||
itemCount: 1000
|
||||
@ -70,8 +68,8 @@ FluScrollablePage{
|
||||
text:"编辑"
|
||||
topPadding:3
|
||||
bottomPadding:3
|
||||
leftPadding:3
|
||||
rightPadding:3
|
||||
leftPadding:6
|
||||
rightPadding:6
|
||||
onClicked:{
|
||||
console.debug(dataModel.index)
|
||||
showSuccess(JSON.stringify(dataObject))
|
||||
@ -81,8 +79,8 @@ FluScrollablePage{
|
||||
text:"删除"
|
||||
topPadding:3
|
||||
bottomPadding:3
|
||||
leftPadding:3
|
||||
rightPadding:3
|
||||
leftPadding:6
|
||||
rightPadding:6
|
||||
onClicked:{
|
||||
showError(JSON.stringify(dataObject))
|
||||
}
|
||||
@ -102,9 +100,60 @@ FluScrollablePage{
|
||||
action:com_action
|
||||
})
|
||||
}
|
||||
|
||||
table_view.dataSource = dataSource
|
||||
}
|
||||
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: 10
|
||||
code:'FluTableView{
|
||||
id:table_view
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: 20
|
||||
pageCurrent:1
|
||||
pageCount:10
|
||||
itemCount: 1000
|
||||
onRequestPage:
|
||||
(page,count)=> {
|
||||
loadData(page,count)
|
||||
}
|
||||
Component.onCompleted: {
|
||||
const columns = [
|
||||
{
|
||||
title: "姓名",
|
||||
dataIndex: "name",
|
||||
width:100
|
||||
},
|
||||
{
|
||||
title: "年龄",
|
||||
dataIndex: "age",
|
||||
width:100
|
||||
},
|
||||
{
|
||||
title: "住址",
|
||||
dataIndex: "address",
|
||||
width:200
|
||||
},
|
||||
{
|
||||
title: "别名",
|
||||
dataIndex: "nickname",
|
||||
width:100
|
||||
}
|
||||
];
|
||||
table_view.columns = columns
|
||||
const dataSource = [
|
||||
{
|
||||
name: "孙悟空”,
|
||||
age: 500,
|
||||
address:"钟灵毓秀的花果山,如神仙仙境的水帘洞",
|
||||
nickname:"齐天大圣"
|
||||
}
|
||||
];
|
||||
table_view.dataSource = columns
|
||||
}
|
||||
}'
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
@ -3,7 +3,7 @@ import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
import QtQuick.Window
|
||||
import FluentUI
|
||||
import "./component"
|
||||
import "../component"
|
||||
|
||||
FluScrollablePage{
|
||||
|
||||
@ -45,19 +45,59 @@ FluScrollablePage{
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluTextBox{
|
||||
placeholderText:"单行输入框"
|
||||
}'
|
||||
}
|
||||
|
||||
|
||||
FluArea{
|
||||
Layout.fillWidth: true
|
||||
height: 68
|
||||
paddings: 10
|
||||
Layout.topMargin: 20
|
||||
|
||||
FluPasswordBox{
|
||||
Layout.topMargin: 20
|
||||
placeholderText: "请输入密码"
|
||||
Layout.preferredWidth: 300
|
||||
disabled:password_box_switch.selected
|
||||
anchors{
|
||||
verticalCenter: parent.verticalCenter
|
||||
left: parent.left
|
||||
}
|
||||
}
|
||||
|
||||
Row{
|
||||
spacing: 5
|
||||
anchors{
|
||||
verticalCenter: parent.verticalCenter
|
||||
right: parent.right
|
||||
}
|
||||
FluToggleSwitch{
|
||||
id:password_box_switch
|
||||
Layout.alignment: Qt.AlignRight
|
||||
text:"Disabled"
|
||||
}
|
||||
}
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluPasswordBox{
|
||||
placeholderText:"请输入密码"
|
||||
}'
|
||||
}
|
||||
|
||||
|
||||
FluArea{
|
||||
Layout.fillWidth: true
|
||||
height: 36+multiine_textbox.height
|
||||
paddings: 10
|
||||
Layout.topMargin: 20
|
||||
|
||||
FluMultilineTextBox{
|
||||
id:multiine_textbox
|
||||
Layout.topMargin: 20
|
||||
placeholderText: "多行输入框"
|
||||
Layout.preferredWidth: 300
|
||||
@ -83,6 +123,7 @@ FluScrollablePage{
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluMultilineTextBox{
|
||||
placeholderText:"多行输入框"
|
||||
}'
|
||||
@ -122,6 +163,7 @@ FluScrollablePage{
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluAutoSuggestBox{
|
||||
placeholderText:"AutoSuggestBox"
|
||||
}'
|
@ -3,7 +3,7 @@ import QtQuick.Layouts
|
||||
import QtQuick.Window
|
||||
import QtQuick.Controls
|
||||
import FluentUI
|
||||
import "./component"
|
||||
import "../component"
|
||||
|
||||
FluScrollablePage{
|
||||
|
||||
@ -58,7 +58,11 @@ FluScrollablePage{
|
||||
Layout.topMargin: 5
|
||||
selected: FluTheme.dark
|
||||
clickFunc:function(){
|
||||
FluTheme.dark = !FluTheme.dark
|
||||
if(FluTheme.dark){
|
||||
FluTheme.darkMode = FluDarkMode.Light
|
||||
}else{
|
||||
FluTheme.darkMode = FluDarkMode.Dark
|
||||
}
|
||||
}
|
||||
}
|
||||
FluText{
|
||||
@ -76,12 +80,12 @@ FluScrollablePage{
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluTheme.primaryColor = FluColors.Orange
|
||||
|
||||
FluTheme.dark = true
|
||||
|
||||
FluTheme.nativeText = true
|
||||
'
|
||||
FluTheme.nativeText = true'
|
||||
}
|
||||
|
||||
|
@ -3,7 +3,7 @@ import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
import QtQuick.Window
|
||||
import FluentUI
|
||||
import "./component"
|
||||
import "../component"
|
||||
|
||||
FluScrollablePage{
|
||||
|
||||
@ -37,6 +37,7 @@ FluScrollablePage{
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluTimePicker{
|
||||
|
||||
}'
|
||||
@ -67,6 +68,7 @@ FluScrollablePage{
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluTimePicker{
|
||||
hourFormat:FluTimePicker.HH
|
||||
}'
|
@ -3,7 +3,7 @@ import QtQuick.Layouts
|
||||
import QtQuick.Window
|
||||
import QtQuick.Controls
|
||||
import FluentUI
|
||||
import "./component"
|
||||
import "../component"
|
||||
|
||||
FluScrollablePage{
|
||||
|
||||
@ -30,6 +30,7 @@ FluScrollablePage{
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluToggleSwitch{
|
||||
text:"Text"
|
||||
}'
|
@ -3,7 +3,7 @@ import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
import QtQuick.Window
|
||||
import FluentUI
|
||||
import "./component"
|
||||
import "../component"
|
||||
|
||||
FluScrollablePage{
|
||||
|
||||
@ -45,6 +45,7 @@ FluScrollablePage{
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluIconButton{
|
||||
iconSource:FluentIcons.ChromeCloseContrast
|
||||
iconSize: 15
|
||||
@ -87,6 +88,7 @@ FluScrollablePage{
|
||||
}
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluButton{
|
||||
id:button_1
|
||||
text:"删除"
|
||||
@ -98,8 +100,7 @@ FluScrollablePage{
|
||||
onClicked:{
|
||||
showSuccess("点击一个Button")
|
||||
}
|
||||
}
|
||||
'
|
||||
}'
|
||||
}
|
||||
|
||||
|
@ -3,7 +3,7 @@ import QtQuick.Layouts
|
||||
import QtQuick.Window
|
||||
import QtQuick.Controls
|
||||
import FluentUI
|
||||
import "./component"
|
||||
import "../component"
|
||||
|
||||
FluScrollablePage {
|
||||
|
||||
@ -142,6 +142,7 @@ FluScrollablePage {
|
||||
|
||||
CodeExpander{
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: -1
|
||||
code:'FluTreeView{
|
||||
id:tree_view
|
||||
width:240
|
@ -5,14 +5,15 @@ import FluentUI
|
||||
|
||||
FluWindow {
|
||||
|
||||
width: 500
|
||||
height: 600
|
||||
minimumWidth: 500
|
||||
minimumHeight: 600
|
||||
maximumWidth: 500
|
||||
maximumHeight: 600
|
||||
|
||||
id:window
|
||||
title:"关于"
|
||||
width: 600
|
||||
height: 600
|
||||
minimumWidth: 600
|
||||
minimumHeight: 600
|
||||
maximumWidth: 600
|
||||
maximumHeight: 600
|
||||
launchMode: FluWindow.SingleTask
|
||||
|
||||
FluAppBar{
|
||||
id:appbar
|
||||
@ -36,7 +37,7 @@ FluWindow {
|
||||
fontStyle: FluText.Title
|
||||
}
|
||||
FluText{
|
||||
text:"v1.2.1"
|
||||
text:"v%1".arg(appInfo.version)
|
||||
fontStyle: FluText.Body
|
||||
Layout.alignment: Qt.AlignBottom
|
||||
}
|
||||
@ -57,13 +58,14 @@ FluWindow {
|
||||
|
||||
RowLayout{
|
||||
spacing: 14
|
||||
Layout.topMargin: 20
|
||||
Layout.leftMargin: 15
|
||||
FluText{
|
||||
text:"GitHub:"
|
||||
}
|
||||
FluTextButton{
|
||||
id:text_hublink
|
||||
topPadding:0
|
||||
bottomPadding:0
|
||||
text:"https://github.com/zhuzichu520/FluentUI"
|
||||
Layout.alignment: Qt.AlignBottom
|
||||
onClicked: {
|
||||
@ -71,13 +73,30 @@ FluWindow {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
RowLayout{
|
||||
spacing: 14
|
||||
Layout.leftMargin: 15
|
||||
FluText{
|
||||
text:"B站:"
|
||||
}
|
||||
FluTextButton{
|
||||
topPadding:0
|
||||
bottomPadding:0
|
||||
text:"https://www.bilibili.com/video/BV1mg4y1M71w/"
|
||||
Layout.alignment: Qt.AlignBottom
|
||||
onClicked: {
|
||||
Qt.openUrlExternally(text)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
RowLayout{
|
||||
spacing: 14
|
||||
Layout.topMargin: 20
|
||||
Layout.leftMargin: 15
|
||||
FluText{
|
||||
id:text_info
|
||||
text:"如果该项目对你有作用,就请点击上方链接给一个免费的star吧!"
|
||||
text:"如果该项目对你有作用,就请点击上方链接给一个免费的star,或者一键三连,谢谢!"
|
||||
ColorAnimation {
|
||||
id: animation
|
||||
target: text_info
|
||||
@ -91,5 +110,43 @@ FluWindow {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
RowLayout{
|
||||
spacing: 14
|
||||
Layout.leftMargin: 15
|
||||
FluText{
|
||||
text:"捐赠:"
|
||||
}
|
||||
}
|
||||
|
||||
Item{
|
||||
Layout.preferredWidth: parent.width
|
||||
Layout.preferredHeight: 252
|
||||
Row{
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
spacing: 60
|
||||
Image{
|
||||
width: 164.55
|
||||
height: 224.25
|
||||
source: "qrc:/example/res/image/qrcode_wx.jpg"
|
||||
}
|
||||
Image{
|
||||
width: 162
|
||||
height: 252
|
||||
source: "qrc:/example/res/image/qrcode_zfb.jpg"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
RowLayout{
|
||||
spacing: 14
|
||||
Layout.leftMargin: 15
|
||||
FluText{
|
||||
id:text_desc
|
||||
text:"个人开发,维护不易,你们的捐赠就是我继续更新的动力!\n有什么问题提Issues,只要时间充足我就会解决的!!"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
@ -7,13 +7,12 @@ import QtQuick.Dialogs
|
||||
|
||||
FluWindow {
|
||||
|
||||
title:"ChatGPT"
|
||||
width: 680
|
||||
height: 600
|
||||
minimumWidth: 500
|
||||
minimumHeight: 600
|
||||
|
||||
title:"ChatGPT"
|
||||
|
||||
onInitArgument:
|
||||
(argument)=>{
|
||||
scrollview.focus = true
|
||||
@ -121,7 +120,7 @@ FluWindow {
|
||||
asynchronous: true
|
||||
anchors.fill: parent
|
||||
sourceSize: Qt.size(100,100)
|
||||
source: isMy ? "qrc:/res/svg/avatar_2.svg" : "qrc:/res/image/logo_openai.png"
|
||||
source: isMy ? "qrc:/example/res/svg/avatar_2.svg" : "qrc:/example/res/image/logo_openai.png"
|
||||
}
|
||||
}
|
||||
|
@ -6,15 +6,13 @@ import FluentUI
|
||||
FluWindow {
|
||||
|
||||
id:window
|
||||
title:"登录"
|
||||
width: 400
|
||||
height: 400
|
||||
minimumWidth: 400
|
||||
minimumHeight: 400
|
||||
maximumWidth: 400
|
||||
maximumHeight: 400
|
||||
modality:2
|
||||
|
||||
title:"登录"
|
||||
|
||||
onInitArgument:
|
||||
(argument)=>{
|
112
example/qml/window/MainWindow.qml
Normal file
@ -0,0 +1,112 @@
|
||||
import QtQuick
|
||||
import QtQuick.Window
|
||||
import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
import Qt.labs.platform
|
||||
import FluentUI
|
||||
import example
|
||||
import "qrc:///example/qml/global/"
|
||||
|
||||
FluWindow {
|
||||
|
||||
id:window
|
||||
title: "FluentUI"
|
||||
width: 1000
|
||||
height: 640
|
||||
closeDestory:false
|
||||
minimumWidth: 520
|
||||
minimumHeight: 460
|
||||
|
||||
closeFunc:function(event){
|
||||
close_app.open()
|
||||
event.accepted = false
|
||||
}
|
||||
|
||||
Connections{
|
||||
target: appInfo
|
||||
function onActiveWindow(){
|
||||
window.show()
|
||||
window.raise()
|
||||
window.requestActivate()
|
||||
}
|
||||
}
|
||||
|
||||
FluAppBar{
|
||||
id:appbar
|
||||
z:9
|
||||
showDark: true
|
||||
width:parent.width
|
||||
darkText: lang.dark_mode
|
||||
}
|
||||
|
||||
SystemTrayIcon {
|
||||
id:system_tray
|
||||
visible: true
|
||||
icon.source: "qrc:/example/res/image/favicon.ico"
|
||||
tooltip: "FluentUI"
|
||||
menu: Menu {
|
||||
MenuItem {
|
||||
text: "退出"
|
||||
onTriggered: {
|
||||
window.destoryWindow()
|
||||
FluApp.closeApp()
|
||||
}
|
||||
}
|
||||
}
|
||||
onActivated:
|
||||
(reason)=>{
|
||||
if(reason === SystemTrayIcon.Trigger){
|
||||
window.show()
|
||||
window.raise()
|
||||
window.requestActivate()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
FluContentDialog{
|
||||
id:close_app
|
||||
title:"退出"
|
||||
message:"确定要退出程序吗?"
|
||||
negativeText:"最小化"
|
||||
buttonFlags: FluContentDialog.NeutralButton | FluContentDialog.NegativeButton | FluContentDialog.PositiveButton
|
||||
onNegativeClicked:{
|
||||
system_tray.showMessage("友情提示","FluentUI已隐藏至托盘,点击托盘可再次激活窗口");
|
||||
window.hide()
|
||||
}
|
||||
positiveText:"退出"
|
||||
neutralText:"取消"
|
||||
onPositiveClicked:{
|
||||
window.destoryWindow()
|
||||
FluApp.closeApp()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
FluNavigationView{
|
||||
id:nav_view
|
||||
anchors.fill: parent
|
||||
items: ItemsOriginal
|
||||
footerItems:ItemsFooter
|
||||
z:11
|
||||
displayMode:MainEvent.displayMode
|
||||
logo: "qrc:/example/res/image/favicon.ico"
|
||||
title:"FluentUI"
|
||||
autoSuggestBox:FluAutoSuggestBox{
|
||||
width: 280
|
||||
anchors.centerIn: parent
|
||||
iconSource: FluentIcons.Search
|
||||
items: ItemsOriginal.getSearchData()
|
||||
placeholderText: lang.search
|
||||
onItemClicked:
|
||||
(data)=>{
|
||||
ItemsOriginal.startPageByItem(data)
|
||||
}
|
||||
}
|
||||
Component.onCompleted: {
|
||||
ItemsOriginal.navigationView = nav_view
|
||||
ItemsFooter.navigationView = nav_view
|
||||
nav_view.setCurrentIndex(0)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -5,13 +5,12 @@ import FluentUI
|
||||
|
||||
FluWindow {
|
||||
|
||||
title:"视频播放器"
|
||||
width: 640
|
||||
height: 480
|
||||
minimumWidth: 640
|
||||
minimumHeight: 480
|
||||
|
||||
title:"视频播放器"
|
||||
|
||||
onInitArgument:
|
||||
(argument)=>{
|
||||
player.source = argument.source
|
||||
@ -23,7 +22,6 @@ FluWindow {
|
||||
width:parent.width
|
||||
}
|
||||
|
||||
|
||||
FluMediaPlayer{
|
||||
id:player
|
||||
anchors{
|
44
example/qml/window/SingleInstanceWindow.qml
Normal file
@ -0,0 +1,44 @@
|
||||
import QtQuick
|
||||
import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
import FluentUI
|
||||
|
||||
FluWindow {
|
||||
|
||||
id:window
|
||||
title:"SingleInstance"
|
||||
width: 500
|
||||
height: 600
|
||||
minimumWidth: 500
|
||||
minimumHeight: 600
|
||||
maximumWidth: 500
|
||||
maximumHeight: 600
|
||||
launchMode: FluWindow.SingleInstance
|
||||
|
||||
FluAppBar{
|
||||
id:appbar
|
||||
title:"SingleInstance"
|
||||
width:parent.width
|
||||
}
|
||||
|
||||
FluTextBox{
|
||||
anchors{
|
||||
top:parent.top
|
||||
topMargin:60
|
||||
horizontalCenter: parent.horizontalCenter
|
||||
}
|
||||
}
|
||||
|
||||
FluText{
|
||||
wrapMode: Text.WrapAnywhere
|
||||
anchors{
|
||||
left: parent.left
|
||||
right: parent.right
|
||||
leftMargin: 20
|
||||
rightMargin: 20
|
||||
verticalCenter: parent.verticalCenter
|
||||
}
|
||||
text:"我是一个SingleInstance模式的窗口,如果我存在,我会销毁之前的窗口,并创建一个新窗口"
|
||||
}
|
||||
|
||||
}
|
29
example/qml/window/SingleTaskWindow.qml
Normal file
@ -0,0 +1,29 @@
|
||||
import QtQuick
|
||||
import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
import FluentUI
|
||||
|
||||
FluWindow {
|
||||
|
||||
id:window
|
||||
title:"SingleTask"
|
||||
width: 500
|
||||
height: 600
|
||||
minimumWidth: 500
|
||||
minimumHeight: 600
|
||||
maximumWidth: 500
|
||||
maximumHeight: 600
|
||||
launchMode: FluWindow.SingleTask
|
||||
|
||||
FluAppBar{
|
||||
id:appbar
|
||||
title:"SingleTask"
|
||||
width:parent.width
|
||||
}
|
||||
|
||||
FluText{
|
||||
anchors.centerIn: parent
|
||||
text:"我是一个SingleTask模式的窗口,如果我存在,我就激活窗口"
|
||||
}
|
||||
|
||||
}
|
29
example/qml/window/StandardWindow.qml
Normal file
@ -0,0 +1,29 @@
|
||||
import QtQuick
|
||||
import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
import FluentUI
|
||||
|
||||
FluWindow {
|
||||
|
||||
id:window
|
||||
title:"Standard"
|
||||
width: 500
|
||||
height: 600
|
||||
minimumWidth: 500
|
||||
minimumHeight: 600
|
||||
maximumWidth: 500
|
||||
maximumHeight: 600
|
||||
launchMode: FluWindow.Standard
|
||||
|
||||
FluAppBar{
|
||||
id:appbar
|
||||
title:"Standard"
|
||||
width:parent.width
|
||||
}
|
||||
|
||||
FluText{
|
||||
anchors.centerIn: parent
|
||||
text:"我是一个Standard模式的窗口,每次我都会创建一个新的窗口"
|
||||
}
|
||||
|
||||
}
|
BIN
example/res/image/qrcode_wx.jpg
Normal file
After Width: | Height: | Size: 119 KiB |
BIN
example/res/image/qrcode_zfb.jpg
Normal file
After Width: | Height: | Size: 145 KiB |
1
example/res/svg/home.svg
Normal file
@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1681271578882" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3664" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128"><path d="M923.733333 394.666667c-85.333333-70.4-206.933333-174.933333-362.666666-309.333334C533.333333 61.866667 490.666667 61.866667 462.933333 85.333333c-155.733333 134.4-277.333333 238.933333-362.666666 309.333334-14.933333 14.933333-25.6 34.133333-25.6 53.333333 0 38.4 32 70.4 70.4 70.4H192v358.4c0 29.866667 23.466667 53.333333 53.333333 53.333333H405.333333c29.866667 0 53.333333-23.466667 53.333334-53.333333v-206.933333h106.666666v206.933333c0 29.866667 23.466667 53.333333 53.333334 53.333333h160c29.866667 0 53.333333-23.466667 53.333333-53.333333V518.4h46.933333c38.4 0 70.4-32 70.4-70.4 0-21.333333-10.666667-40.533333-25.6-53.333333z m-44.8 59.733333h-57.6c-29.866667 0-53.333333 23.466667-53.333333 53.333333v358.4h-138.666667V661.333333c0-29.866667-23.466667-53.333333-53.333333-53.333333h-128c-29.866667 0-53.333333 23.466667-53.333333 53.333333v206.933334H256V507.733333c0-29.866667-23.466667-53.333333-53.333333-53.333333H145.066667c-4.266667 0-6.4-2.133333-6.4-6.4 0-2.133333 2.133333-4.266667 2.133333-6.4 85.333333-70.4 206.933333-174.933333 362.666667-309.333333 4.266667-4.266667 10.666667-4.266667 14.933333 0 155.733333 134.4 277.333333 238.933333 362.666667 309.333333 2.133333 2.133333 2.133333 2.133333 2.133333 4.266667 2.133333 6.4-2.133333 8.533333-4.266667 8.533333z" fill="#2c2c2c" p-id="3665"></path></svg>
|
After Width: | Height: | Size: 1.6 KiB |
1
example/res/svg/home_dark.svg
Normal file
@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1681277986581" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3875" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128"><path d="M923.733333 394.666667c-85.333333-70.4-206.933333-174.933333-362.666666-309.333334C533.333333 61.866667 490.666667 61.866667 462.933333 85.333333c-155.733333 134.4-277.333333 238.933333-362.666666 309.333334-14.933333 14.933333-25.6 34.133333-25.6 53.333333 0 38.4 32 70.4 70.4 70.4H192v358.4c0 29.866667 23.466667 53.333333 53.333333 53.333333H405.333333c29.866667 0 53.333333-23.466667 53.333334-53.333333v-206.933333h106.666666v206.933333c0 29.866667 23.466667 53.333333 53.333334 53.333333h160c29.866667 0 53.333333-23.466667 53.333333-53.333333V518.4h46.933333c38.4 0 70.4-32 70.4-70.4 0-21.333333-10.666667-40.533333-25.6-53.333333z m-44.8 59.733333h-57.6c-29.866667 0-53.333333 23.466667-53.333333 53.333333v358.4h-138.666667V661.333333c0-29.866667-23.466667-53.333333-53.333333-53.333333h-128c-29.866667 0-53.333333 23.466667-53.333333 53.333333v206.933334H256V507.733333c0-29.866667-23.466667-53.333333-53.333333-53.333333H145.066667c-4.266667 0-6.4-2.133333-6.4-6.4 0-2.133333 2.133333-4.266667 2.133333-6.4 85.333333-70.4 206.933333-174.933333 362.666667-309.333333 4.266667-4.266667 10.666667-4.266667 14.933333 0 155.733333 134.4 277.333333 238.933333 362.666667 309.333333 2.133333 2.133333 2.133333 2.133333 2.133333 4.266667 2.133333 6.4-2.133333 8.533333-4.266667 8.533333z" fill="#ffffff" p-id="3876"></path></svg>
|
After Width: | Height: | Size: 1.6 KiB |
24
example/src/AppInfo.cpp
Normal file
@ -0,0 +1,24 @@
|
||||
#include "AppInfo.h"
|
||||
#include "lang/En.h"
|
||||
#include "lang/Zh.h"
|
||||
|
||||
AppInfo::AppInfo(QObject *parent)
|
||||
: QObject{parent}
|
||||
{
|
||||
version("1.2.8");
|
||||
lang(new En());
|
||||
}
|
||||
|
||||
void AppInfo::changeLang(const QString& locale){
|
||||
if(_lang){
|
||||
_lang->deleteLater();
|
||||
}
|
||||
if(locale=="Zh"){
|
||||
lang(new Zh());
|
||||
}else if(locale=="En"){
|
||||
lang(new En());
|
||||
}else {
|
||||
lang(new En());
|
||||
}
|
||||
|
||||
}
|
19
example/src/AppInfo.h
Normal file
@ -0,0 +1,19 @@
|
||||
#ifndef APPINFO_H
|
||||
#define APPINFO_H
|
||||
|
||||
#include <QObject>
|
||||
#include "lang/Lang.h"
|
||||
#include "stdafx.h"
|
||||
|
||||
class AppInfo : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_PROPERTY_AUTO(QString,version)
|
||||
Q_PROPERTY_AUTO(Lang*,lang)
|
||||
public:
|
||||
explicit AppInfo(QObject *parent = nullptr);
|
||||
Q_INVOKABLE void changeLang(const QString& locale);
|
||||
Q_SIGNAL void activeWindow();
|
||||
};
|
||||
|
||||
#endif // APPINFO_H
|
@ -11,7 +11,7 @@
|
||||
#include <QClipboard>
|
||||
#include <QByteArray>
|
||||
#include <QFile>
|
||||
#include "stdafx.h"
|
||||
#include "../stdafx.h"
|
||||
|
||||
class ChatController : public QObject
|
||||
{
|
22
example/src/lang/En.cpp
Normal file
@ -0,0 +1,22 @@
|
||||
#include "En.h"
|
||||
|
||||
En::En(QObject *parent)
|
||||
: Lang{parent}
|
||||
{
|
||||
setObjectName("En");
|
||||
home("Home");
|
||||
basic_input("Basic Input");
|
||||
form("Form");
|
||||
surface("Surfaces");
|
||||
popus("Popus");
|
||||
navigation("Navigation");
|
||||
theming("Theming");
|
||||
media("Media");
|
||||
dark_mode("Dark Mode");
|
||||
sys_dark_mode("Sync with system");
|
||||
search("Search");
|
||||
about("About");
|
||||
settings("Settings");
|
||||
locale("Locale");
|
||||
navigation_view_display_mode("NavigationView Display Mode");
|
||||
}
|
17
example/src/lang/En.h
Normal file
@ -0,0 +1,17 @@
|
||||
#ifndef EN_H
|
||||
#define EN_H
|
||||
|
||||
#include <QObject>
|
||||
#include "Lang.h"
|
||||
|
||||
class En : public Lang
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit En(QObject *parent = nullptr);
|
||||
|
||||
signals:
|
||||
|
||||
};
|
||||
|
||||
#endif // EN_H
|
7
example/src/lang/Lang.cpp
Normal file
@ -0,0 +1,7 @@
|
||||
#include "Lang.h"
|
||||
|
||||
Lang::Lang(QObject *parent)
|
||||
: QObject{parent}
|
||||
{
|
||||
|
||||
}
|
30
example/src/lang/Lang.h
Normal file
@ -0,0 +1,30 @@
|
||||
#ifndef LANG_H
|
||||
#define LANG_H
|
||||
|
||||
#include <QObject>
|
||||
#include "../stdafx.h"
|
||||
|
||||
class Lang : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_PROPERTY_AUTO(QString,home);
|
||||
Q_PROPERTY_AUTO(QString,basic_input);
|
||||
Q_PROPERTY_AUTO(QString,form);
|
||||
Q_PROPERTY_AUTO(QString,surface);
|
||||
Q_PROPERTY_AUTO(QString,popus);
|
||||
Q_PROPERTY_AUTO(QString,navigation);
|
||||
Q_PROPERTY_AUTO(QString,theming);
|
||||
Q_PROPERTY_AUTO(QString,media);
|
||||
Q_PROPERTY_AUTO(QString,dark_mode);
|
||||
Q_PROPERTY_AUTO(QString,sys_dark_mode);
|
||||
Q_PROPERTY_AUTO(QString,search);
|
||||
Q_PROPERTY_AUTO(QString,about);
|
||||
Q_PROPERTY_AUTO(QString,settings);
|
||||
Q_PROPERTY_AUTO(QString,navigation_view_display_mode);
|
||||
Q_PROPERTY_AUTO(QString,locale);
|
||||
public:
|
||||
explicit Lang(QObject *parent = nullptr);
|
||||
|
||||
};
|
||||
|
||||
#endif // LANG_H
|
22
example/src/lang/Zh.cpp
Normal file
@ -0,0 +1,22 @@
|
||||
#include "Zh.h"
|
||||
|
||||
Zh::Zh(QObject *parent)
|
||||
: Lang{parent}
|
||||
{
|
||||
setObjectName("Zh");
|
||||
home("首页");
|
||||
basic_input("基本输入");
|
||||
form("表单");
|
||||
surface("表面");
|
||||
popus("弹窗");
|
||||
navigation("导航");
|
||||
theming("主题");
|
||||
media("媒体");
|
||||
dark_mode("夜间模式");
|
||||
sys_dark_mode("跟随系统");
|
||||
search("查找");
|
||||
about("关于");
|
||||
settings("设置");
|
||||
locale("语言环境");
|
||||
navigation_view_display_mode("导航视图显示模式");
|
||||
}
|
17
example/src/lang/Zh.h
Normal file
@ -0,0 +1,17 @@
|
||||
#ifndef ZH_H
|
||||
#define ZH_H
|
||||
|
||||
#include <QObject>
|
||||
#include "Lang.h"
|
||||
|
||||
class Zh : public Lang
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit Zh(QObject *parent = nullptr);
|
||||
|
||||
signals:
|
||||
|
||||
};
|
||||
|
||||
#endif // ZH_H
|
63
example/src/main.cpp
Normal file
@ -0,0 +1,63 @@
|
||||
#include <QGuiApplication>
|
||||
#include <QQmlApplicationEngine>
|
||||
#include <QQmlContext>
|
||||
#include <QDir>
|
||||
#include <QQuickWindow>
|
||||
#include <QProcess>
|
||||
#include "lang/Lang.h"
|
||||
#include "AppInfo.h"
|
||||
#include "controller/ChatController.h"
|
||||
#include "tool/IPC.h"
|
||||
#if defined(STATICLIB)
|
||||
#include <FluentUI.h>
|
||||
#endif
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
//将样式设置为Basic,不然会导致组件显示异常
|
||||
qputenv("QT_QUICK_CONTROLS_STYLE","Basic");
|
||||
//6.4及以下监听系统深色模式变化
|
||||
#ifdef Q_OS_WIN
|
||||
qputenv("QT_QPA_PLATFORM","windows:darkmode=2");
|
||||
#endif
|
||||
QGuiApplication::setOrganizationName("ZhuZiChu");
|
||||
QGuiApplication::setOrganizationDomain("https://zhuzichu520.github.io");
|
||||
QGuiApplication::setApplicationName("FluentUI");
|
||||
// QQuickWindow::setGraphicsApi(QSGRendererInterface::Software);
|
||||
QGuiApplication app(argc, argv);
|
||||
AppInfo* appInfo = new AppInfo();
|
||||
IPC ipc(0);
|
||||
QString activeWindowEvent = "activeWindow";
|
||||
if(!ipc.isCurrentOwner()){
|
||||
ipc.postEvent(activeWindowEvent,QString().toUtf8(),0);
|
||||
delete appInfo;
|
||||
return 0;
|
||||
}
|
||||
if(ipc.isAttached()){
|
||||
ipc.registerEventHandler(activeWindowEvent,[&appInfo](const QByteArray&){
|
||||
Q_EMIT appInfo->activeWindow();
|
||||
return true;
|
||||
});
|
||||
}
|
||||
app.setQuitOnLastWindowClosed(false);
|
||||
QQmlApplicationEngine engine;
|
||||
#if defined(STATICLIB)
|
||||
FluentUI::initialize(&engine);
|
||||
#endif
|
||||
qmlRegisterType<ChatController>("Controller",1,0,"ChatController");
|
||||
QQmlContext * context = engine.rootContext();
|
||||
Lang* lang = appInfo->lang();
|
||||
context->setContextProperty("lang",lang);
|
||||
QObject::connect(appInfo,&AppInfo::langChanged,&app,[context,appInfo]{
|
||||
context->setContextProperty("lang",appInfo->lang());
|
||||
});
|
||||
context->setContextProperty("appInfo",appInfo);
|
||||
const QUrl url(QStringLiteral("qrc:/example/qml/App.qml"));
|
||||
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
|
||||
&app, [url](QObject *obj, const QUrl &objUrl) {
|
||||
if (!obj && url == objUrl)
|
||||
QCoreApplication::exit(-1);
|
||||
}, Qt::QueuedConnection);
|
||||
engine.load(url);
|
||||
return app.exec();
|
||||
}
|
250
example/src/tool/IPC.cpp
Normal file
@ -0,0 +1,250 @@
|
||||
#include "IPC.h"
|
||||
|
||||
#include <QCoreApplication>
|
||||
#include <QDebug>
|
||||
#include <QThread>
|
||||
#include <ctime>
|
||||
#include <random>
|
||||
|
||||
|
||||
IPC::IPC(uint32_t profileId)
|
||||
: profileId{profileId}
|
||||
, globalMemory{"ipc-" IPC_PROTOCOL_VERSION}
|
||||
{
|
||||
qRegisterMetaType<IPCEventHandler>("IPCEventHandler");
|
||||
timer.setInterval(EVENT_TIMER_MS);
|
||||
timer.setSingleShot(true);
|
||||
connect(&timer, &QTimer::timeout, this, &IPC::processEvents);
|
||||
std::default_random_engine randEngine((std::random_device())());
|
||||
std::uniform_int_distribution<uint64_t> distribution;
|
||||
globalId = distribution(randEngine);
|
||||
qDebug() << "Our global IPC ID is " << globalId;
|
||||
if (globalMemory.create(sizeof(IPCMemory))) {
|
||||
if (globalMemory.lock()) {
|
||||
IPCMemory* mem = global();
|
||||
memset(mem, 0, sizeof(IPCMemory));
|
||||
mem->globalId = globalId;
|
||||
mem->lastProcessed = time(nullptr);
|
||||
globalMemory.unlock();
|
||||
} else {
|
||||
qWarning() << "Couldn't lock to take ownership";
|
||||
}
|
||||
} else if (globalMemory.attach()) {
|
||||
qDebug() << "Attaching to the global shared memory";
|
||||
} else {
|
||||
qDebug() << "Failed to attach to the global shared memory, giving up. Error:"
|
||||
<< globalMemory.error();
|
||||
return;
|
||||
}
|
||||
|
||||
processEvents();
|
||||
}
|
||||
|
||||
IPC::~IPC()
|
||||
{
|
||||
if (!globalMemory.lock()) {
|
||||
qWarning() << "Failed to lock in ~IPC";
|
||||
return;
|
||||
}
|
||||
|
||||
if (isCurrentOwnerNoLock()) {
|
||||
global()->globalId = 0;
|
||||
}
|
||||
globalMemory.unlock();
|
||||
}
|
||||
|
||||
time_t IPC::postEvent(const QString& name, const QByteArray& data, uint32_t dest)
|
||||
{
|
||||
QByteArray binName = name.toUtf8();
|
||||
if (binName.length() > (int32_t)sizeof(IPCEvent::name)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (data.length() > (int32_t)sizeof(IPCEvent::data)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!globalMemory.lock()) {
|
||||
qDebug() << "Failed to lock in postEvent()";
|
||||
return 0;
|
||||
}
|
||||
|
||||
IPCEvent* evt = nullptr;
|
||||
IPCMemory* mem = global();
|
||||
time_t result = 0;
|
||||
|
||||
for (uint32_t i = 0; !evt && i < EVENT_QUEUE_SIZE; ++i) {
|
||||
if (mem->events[i].posted == 0) {
|
||||
evt = &mem->events[i];
|
||||
}
|
||||
}
|
||||
|
||||
if (evt) {
|
||||
memset(evt, 0, sizeof(IPCEvent));
|
||||
memcpy(evt->name, binName.constData(), binName.length());
|
||||
memcpy(evt->data, data.constData(), data.length());
|
||||
mem->lastEvent = evt->posted = result = qMax(mem->lastEvent + 1, time(nullptr));
|
||||
evt->dest = dest;
|
||||
evt->sender = qApp->applicationPid();
|
||||
qDebug() << "postEvent " << name << "to" << dest;
|
||||
}
|
||||
globalMemory.unlock();
|
||||
return result;
|
||||
}
|
||||
|
||||
bool IPC::isCurrentOwner()
|
||||
{
|
||||
if (globalMemory.lock()) {
|
||||
const bool isOwner = isCurrentOwnerNoLock();
|
||||
globalMemory.unlock();
|
||||
return isOwner;
|
||||
} else {
|
||||
qWarning() << "isCurrentOwner failed to lock, returning false";
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
void IPC::registerEventHandler(const QString& name, IPCEventHandler handler)
|
||||
{
|
||||
eventHandlers[name] = handler;
|
||||
}
|
||||
|
||||
bool IPC::isEventAccepted(time_t time)
|
||||
{
|
||||
bool result = false;
|
||||
if (!globalMemory.lock()) {
|
||||
return result;
|
||||
}
|
||||
|
||||
if (difftime(global()->lastProcessed, time) > 0) {
|
||||
IPCMemory* mem = global();
|
||||
for (uint32_t i = 0; i < EVENT_QUEUE_SIZE; ++i) {
|
||||
if (mem->events[i].posted == time && mem->events[i].processed) {
|
||||
result = mem->events[i].accepted;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
globalMemory.unlock();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
bool IPC::waitUntilAccepted(time_t postTime, int32_t timeout /*=-1*/)
|
||||
{
|
||||
bool result = false;
|
||||
time_t start = time(nullptr);
|
||||
forever
|
||||
{
|
||||
result = isEventAccepted(postTime);
|
||||
if (result || (timeout > 0 && difftime(time(nullptr), start) >= timeout)) {
|
||||
break;
|
||||
}
|
||||
|
||||
qApp->processEvents();
|
||||
QThread::msleep(0);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
bool IPC::isAttached() const
|
||||
{
|
||||
return globalMemory.isAttached();
|
||||
}
|
||||
|
||||
void IPC::setProfileId(uint32_t profileId)
|
||||
{
|
||||
this->profileId = profileId;
|
||||
}
|
||||
|
||||
IPC::IPCEvent* IPC::fetchEvent()
|
||||
{
|
||||
IPCMemory* mem = global();
|
||||
for (uint32_t i = 0; i < EVENT_QUEUE_SIZE; ++i) {
|
||||
IPCEvent* evt = &mem->events[i];
|
||||
if ((evt->processed && difftime(time(nullptr), evt->processed) > EVENT_GC_TIMEOUT)
|
||||
|| (!evt->processed && difftime(time(nullptr), evt->posted) > EVENT_GC_TIMEOUT)) {
|
||||
memset(evt, 0, sizeof(IPCEvent));
|
||||
}
|
||||
|
||||
if (evt->posted && !evt->processed && evt->sender != qApp->applicationPid()
|
||||
&& (evt->dest == profileId || (evt->dest == 0 && isCurrentOwnerNoLock()))) {
|
||||
return evt;
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
bool IPC::runEventHandler(IPCEventHandler handler, const QByteArray& arg)
|
||||
{
|
||||
bool result = false;
|
||||
if (QThread::currentThread() == qApp->thread()) {
|
||||
result = handler(arg);
|
||||
} else {
|
||||
QMetaObject::invokeMethod(this, "runEventHandler", Qt::BlockingQueuedConnection,
|
||||
Q_RETURN_ARG(bool, result), Q_ARG(IPCEventHandler, handler),
|
||||
Q_ARG(const QByteArray&, arg));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
void IPC::processEvents()
|
||||
{
|
||||
if (!globalMemory.lock()) {
|
||||
timer.start();
|
||||
return;
|
||||
}
|
||||
|
||||
IPCMemory* mem = global();
|
||||
|
||||
if (mem->globalId == globalId) {
|
||||
mem->lastProcessed = time(nullptr);
|
||||
} else {
|
||||
if (difftime(time(nullptr), mem->lastProcessed) >= OWNERSHIP_TIMEOUT_S) {
|
||||
qDebug() << "Previous owner timed out, taking ownership" << mem->globalId << "->"
|
||||
<< globalId;
|
||||
memset(mem, 0, sizeof(IPCMemory));
|
||||
mem->globalId = globalId;
|
||||
mem->lastProcessed = time(nullptr);
|
||||
}
|
||||
}
|
||||
|
||||
while (IPCEvent* evt = fetchEvent()) {
|
||||
QString name = QString::fromUtf8(evt->name);
|
||||
auto it = eventHandlers.find(name);
|
||||
if (it != eventHandlers.end()) {
|
||||
evt->accepted = runEventHandler(it.value(), evt->data);
|
||||
qDebug() << "Processed event:" << name << "posted:" << evt->posted
|
||||
<< "accepted:" << evt->accepted;
|
||||
if (evt->dest == 0) {
|
||||
if (evt->accepted) {
|
||||
evt->processed = time(nullptr);
|
||||
}
|
||||
} else {
|
||||
evt->processed = time(nullptr);
|
||||
}
|
||||
} else {
|
||||
qDebug() << "Received event:" << name << "without handler";
|
||||
qDebug() << "Available handlers:" << eventHandlers.keys();
|
||||
}
|
||||
}
|
||||
|
||||
globalMemory.unlock();
|
||||
timer.start();
|
||||
}
|
||||
|
||||
bool IPC::isCurrentOwnerNoLock()
|
||||
{
|
||||
const void* const data = globalMemory.data();
|
||||
if (!data) {
|
||||
qWarning() << "isCurrentOwnerNoLock failed to access the memory, returning false";
|
||||
return false;
|
||||
}
|
||||
return (*static_cast<const uint64_t*>(data) == globalId);
|
||||
}
|
||||
|
||||
IPC::IPCMemory* IPC::global()
|
||||
{
|
||||
return static_cast<IPCMemory*>(globalMemory.data());
|
||||
}
|
75
example/src/tool/IPC.h
Normal file
@ -0,0 +1,75 @@
|
||||
#ifndef IPC_H
|
||||
#define IPC_H
|
||||
|
||||
#include <QMap>
|
||||
#include <QObject>
|
||||
#include <QSharedMemory>
|
||||
#include <QTimer>
|
||||
#include <ctime>
|
||||
#include <functional>
|
||||
|
||||
using IPCEventHandler = std::function<bool(const QByteArray&)>;
|
||||
|
||||
#define IPC_PROTOCOL_VERSION "1"
|
||||
|
||||
class IPC : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
protected:
|
||||
static const int EVENT_TIMER_MS = 1000;
|
||||
static const int EVENT_GC_TIMEOUT = 5;
|
||||
static const int EVENT_QUEUE_SIZE = 32;
|
||||
static const int OWNERSHIP_TIMEOUT_S = 5;
|
||||
|
||||
public:
|
||||
IPC(uint32_t profileId);
|
||||
~IPC();
|
||||
|
||||
struct IPCEvent
|
||||
{
|
||||
uint32_t dest;
|
||||
int32_t sender;
|
||||
char name[16];
|
||||
char data[128];
|
||||
time_t posted;
|
||||
time_t processed;
|
||||
uint32_t flags;
|
||||
bool accepted;
|
||||
bool global;
|
||||
};
|
||||
|
||||
struct IPCMemory
|
||||
{
|
||||
uint64_t globalId;
|
||||
time_t lastEvent;
|
||||
time_t lastProcessed;
|
||||
IPCEvent events[IPC::EVENT_QUEUE_SIZE];
|
||||
};
|
||||
|
||||
time_t postEvent(const QString& name, const QByteArray& data = QByteArray(), uint32_t dest = 0);
|
||||
bool isCurrentOwner();
|
||||
void registerEventHandler(const QString& name, IPCEventHandler handler);
|
||||
bool isEventAccepted(time_t time);
|
||||
bool waitUntilAccepted(time_t time, int32_t timeout = -1);
|
||||
bool isAttached() const;
|
||||
|
||||
public slots:
|
||||
void setProfileId(uint32_t profileId);
|
||||
|
||||
private:
|
||||
IPCMemory* global();
|
||||
bool runEventHandler(IPCEventHandler handler, const QByteArray& arg);
|
||||
IPCEvent* fetchEvent();
|
||||
void processEvents();
|
||||
bool isCurrentOwnerNoLock();
|
||||
|
||||
private:
|
||||
QTimer timer;
|
||||
uint64_t globalId;
|
||||
uint32_t profileId;
|
||||
QSharedMemory globalMemory;
|
||||
QMap<QString, IPCEventHandler> eventHandlers;
|
||||
};
|
||||
|
||||
#endif // IPC_H
|
@ -17,7 +17,7 @@ function Main() {
|
||||
|
||||
New-Item -ItemType Directory $archiveName
|
||||
# 拷贝exe
|
||||
Copy-Item bin\release\* $archiveName\
|
||||
Copy-Item bin\release\* $archiveName\ -Force -Recurse | Out-Null
|
||||
# 拷贝依赖
|
||||
windeployqt --qmldir . --plugindir $archiveName\plugins --no-translations --compiler-runtime $archiveName\$targetName
|
||||
# 删除不必要的文件
|
||||
|