This commit is contained in:
zhuzihcu 2023-05-17 18:15:15 +08:00
parent 7d7cd4144c
commit a89d36fd14
15 changed files with 150 additions and 144 deletions

View File

@ -94,6 +94,8 @@ set_target_properties(example PROPERTIES
target_link_libraries(example PRIVATE target_link_libraries(example PRIVATE
Qt6::Quick Qt6::Quick
fluentuiplugin fluentuiplugin
FramelessHelper::Core
FramelessHelper::Quick
) )
# #

View File

@ -0,0 +1,62 @@
import QtQuick
import QtQuick.Layouts
import FluentUI
import org.wangwenx190.FramelessHelper
FluWindow {
id:window
property bool fixSize
property alias titleVisible: title_bar.titleVisible
property bool appBarVisible: true
default property alias content: container.data
onFixSizeChanged: {
framless_helper.setWindowFixedSize(fixSize)
title_bar.maximizeButton.visible = !fixSize
}
FluAppBar {
id: title_bar
title: window.title
visible: window.appBarVisible
anchors {
top: parent.top
left: parent.left
right: parent.right
}
}
Item{
id:container
anchors{
top: title_bar.bottom
left: parent.left
right: parent.right
bottom: parent.bottom
}
clip: true
}
FramelessHelper{
id:framless_helper
onReady: {
setTitleBarItem(title_bar)
framless_helper.moveWindowToDesktopCenter()
setHitTestVisible(title_bar.minimizeButton())
setHitTestVisible(title_bar.maximizeButton())
setHitTestVisible(title_bar.closeButton())
window.visible = true
}
}
function setHitTestVisible(com){
framless_helper.setHitTestVisible(com)
}
function setTitleBarItem(com){
framless_helper.setTitleBarItem(com)
}
}

View File

@ -2,17 +2,15 @@
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Layouts import QtQuick.Layouts
import FluentUI import FluentUI
import "../component"
FluWindow { CustomWindow {
id:window id:window
title:"关于" title:"关于"
width: 600 width: 600
height: 600 height: 600
minimumWidth: 600 fixSize: true
minimumHeight: 600
maximumWidth: 600
maximumHeight: 600
launchMode: FluWindow.SingleTask launchMode: FluWindow.SingleTask
ColumnLayout{ ColumnLayout{

View File

@ -2,17 +2,15 @@
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Controls import QtQuick.Controls
import FluentUI import FluentUI
import "../component"
FluWindow { CustomWindow {
id:window id:window
title:"登录" title:"登录"
width: 400 width: 400
height: 400 height: 400
minimumWidth: 400 fixSize: true
minimumHeight: 400
maximumWidth: 400
maximumHeight: 400
onInitArgument: onInitArgument:
(argument)=>{ (argument)=>{

View File

@ -4,9 +4,10 @@ import QtQuick.Controls
import QtQuick.Layouts import QtQuick.Layouts
import Qt.labs.platform import Qt.labs.platform
import FluentUI import FluentUI
import "../component"
import "qrc:///example/qml/global/" import "qrc:///example/qml/global/"
FluWindow { CustomWindow {
id:window id:window
title: "FluentUI" title: "FluentUI"
@ -15,6 +16,7 @@ FluWindow {
closeDestory:false closeDestory:false
minimumWidth: 520 minimumWidth: 520
minimumHeight: 460 minimumHeight: 460
appBarVisible: false
launchMode: FluWindow.SingleTask launchMode: FluWindow.SingleTask
closeFunc:function(event){ closeFunc:function(event){
@ -71,12 +73,33 @@ FluWindow {
window.deleteWindow() window.deleteWindow()
FluApp.closeApp() FluApp.closeApp()
} }
}
FluAppBar {
id: title_bar
anchors {
top: parent.top
left: parent.left
right: parent.right
}
showDark: true
Component.onCompleted: {
setTitleBarItem(title_bar)
setHitTestVisible(title_bar.minimizeButton())
setHitTestVisible(title_bar.maximizeButton())
setHitTestVisible(title_bar.closeButton())
}
} }
FluNavigationView{ FluNavigationView{
id:nav_view id:nav_view
anchors.fill: parent anchors{
top: title_bar.bottom
topMargin: -20
left: parent.left
right: parent.right
bottom: parent.bottom
}
items: ItemsOriginal items: ItemsOriginal
footerItems:ItemsFooter footerItems:ItemsFooter
z:11 z:11
@ -94,32 +117,10 @@ FluWindow {
ItemsOriginal.startPageByItem(data) ItemsOriginal.startPageByItem(data)
} }
} }
actionItem:Item{
height: 40
width: 148
RowLayout{
anchors.centerIn: parent
spacing: 5
FluText{
text:lang.dark_mode
}
FluToggleSwitch{
selected: FluTheme.dark
clickFunc:function(){
if(FluTheme.dark){
FluTheme.darkMode = FluDarkMode.Light
}else{
FluTheme.darkMode = FluDarkMode.Dark
}
}
}
}
}
Component.onCompleted: { Component.onCompleted: {
ItemsOriginal.navigationView = nav_view ItemsOriginal.navigationView = nav_view
ItemsFooter.navigationView = nav_view ItemsFooter.navigationView = nav_view
nav_view.setCurrentIndex(0) nav_view.setCurrentIndex(0)
} }
} }
} }

View File

@ -2,8 +2,9 @@
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Layouts import QtQuick.Layouts
import FluentUI import FluentUI
import "../component"
FluWindow { CustomWindow {
title:"视频播放器" title:"视频播放器"
width: 640 width: 640

View File

@ -2,17 +2,15 @@
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Layouts import QtQuick.Layouts
import FluentUI import FluentUI
import "../component"
FluWindow { CustomWindow {
id:window id:window
title:"SingleInstance" title:"SingleInstance"
width: 500 width: 500
height: 600 height: 600
minimumWidth: 500 fixSize: true
minimumHeight: 600
maximumWidth: 500
maximumHeight: 600
launchMode: FluWindow.SingleInstance launchMode: FluWindow.SingleInstance
FluTextBox{ FluTextBox{
@ -35,4 +33,9 @@ FluWindow {
text:"我是一个SingleInstance模式的窗口如果我存在我会销毁之前的窗口并创建一个新窗口" text:"我是一个SingleInstance模式的窗口如果我存在我会销毁之前的窗口并创建一个新窗口"
} }
FluAppBar{
id:appbar
width: parent.width
height: 30
}
} }

View File

@ -2,17 +2,15 @@
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Layouts import QtQuick.Layouts
import FluentUI import FluentUI
import "../component"
FluWindow { CustomWindow {
id:window id:window
title:"SingleTask" title:"SingleTask"
width: 500 width: 500
height: 600 height: 600
minimumWidth: 500 fixSize: true
minimumHeight: 600
maximumWidth: 500
maximumHeight: 600
launchMode: FluWindow.SingleTask launchMode: FluWindow.SingleTask
FluText{ FluText{

View File

@ -2,17 +2,15 @@
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Layouts import QtQuick.Layouts
import FluentUI import FluentUI
import "../component"
FluWindow { CustomWindow {
id:window id:window
title:"Standard" title:"Standard"
width: 500 width: 500
height: 600 height: 600
minimumWidth: 500 fixSize: true
minimumHeight: 600
maximumWidth: 500
maximumHeight: 600
launchMode: FluWindow.Standard launchMode: FluWindow.Standard
FluText{ FluText{

View File

@ -4,21 +4,31 @@
#include <QDir> #include <QDir>
#include <QQuickWindow> #include <QQuickWindow>
#include <QProcess> #include <QProcess>
#include <FluentUI/FluentUI.h> #include <FramelessHelper/Quick/framelessquickmodule.h>
#include <FramelessHelper/Core/private/framelessconfig_p.h>
#include "lang/Lang.h" #include "lang/Lang.h"
#include "AppInfo.h" #include "AppInfo.h"
#include "tool/IPC.h" #include "tool/IPC.h"
FRAMELESSHELPER_USE_NAMESPACE;
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
FramelessHelper::Quick::initialize();
qputenv("QT_QUICK_CONTROLS_STYLE","Basic");
//6.4及以下监听系统深色模式变化
#ifdef Q_OS_WIN
qputenv("QT_QPA_PLATFORM","windows:darkmode=2");
#endif
//将样式设置为Basic不然会导致组件显示异常 //将样式设置为Basic不然会导致组件显示异常
FluentUI::preInit();
QGuiApplication::setOrganizationName("ZhuZiChu"); QGuiApplication::setOrganizationName("ZhuZiChu");
QGuiApplication::setOrganizationDomain("https://zhuzichu520.github.io"); QGuiApplication::setOrganizationDomain("https://zhuzichu520.github.io");
QGuiApplication::setApplicationName("FluentUI"); QGuiApplication::setApplicationName("FluentUI");
// QQuickWindow::setGraphicsApi(QSGRendererInterface::Software); // QQuickWindow::setGraphicsApi(QSGRendererInterface::Software);
QGuiApplication app(argc, argv); QGuiApplication app(argc, argv);
FluentUI::postInit(); FramelessHelper::Core::setApplicationOSThemeAware();
// FramelessConfig::instance()->set(Global::Option::EnableBlurBehindWindow);
// FramelessConfig::instance()->set(Global::Option::DisableLazyInitializationForMicaMaterial);
AppInfo* appInfo = new AppInfo(); AppInfo* appInfo = new AppInfo();
IPC ipc(0); IPC ipc(0);
QString activeWindowEvent = "activeWindow"; QString activeWindowEvent = "activeWindow";
@ -35,7 +45,7 @@ int main(int argc, char *argv[])
} }
app.setQuitOnLastWindowClosed(false); app.setQuitOnLastWindowClosed(false);
QQmlApplicationEngine engine; QQmlApplicationEngine engine;
FluentUI::initEngine(&engine); FramelessHelper::Quick::registerTypes(&engine);
QQmlContext * context = engine.rootContext(); QQmlContext * context = engine.rootContext();
Lang* lang = appInfo->lang(); Lang* lang = appInfo->lang();
context->setContextProperty("lang",lang); context->setContextProperty("lang",lang);

View File

@ -44,8 +44,6 @@ foreach(filepath IN LISTS qml_files resource_files)
set_source_files_properties(${filepath} PROPERTIES QT_RESOURCE_ALIAS ${filename}) set_source_files_properties(${filepath} PROPERTIES QT_RESOURCE_ALIAS ${filename})
endforeach() endforeach()
set_source_files_properties(FluentUI.h PROPERTIES QT_RESOURCE_ALIAS "../../include/FluentUI/FluentUI.h")
#qml #qml
qt_add_library(fluentuiplugin SHARED) qt_add_library(fluentuiplugin SHARED)
qt_add_qml_module(fluentuiplugin qt_add_qml_module(fluentuiplugin
@ -56,7 +54,7 @@ qt_add_qml_module(fluentuiplugin
URI "FluentUI" URI "FluentUI"
SOURCES ${sources_files} fluentui.rc SOURCES ${sources_files} fluentui.rc
QML_FILES ${qml_files} QML_FILES ${qml_files}
RESOURCES ${resource_files} FluentUI.h RESOURCES ${resource_files}
#designer #designer
DESIGNER_SUPPORTED DESIGNER_SUPPORTED
) )
@ -66,8 +64,6 @@ target_link_libraries(fluentuiplugin PUBLIC
Qt::Core Qt::Core
Qt::Quick Qt::Quick
Qt::Qml Qt::Qml
FramelessHelper::Core
FramelessHelper::Quick
) )
# win32 mingw # win32 mingw

View File

@ -1,25 +0,0 @@
#include "FluentUI.h"
#include <FramelessHelper/Quick/framelessquickmodule.h>
#include <FramelessHelper/Core/private/framelessconfig_p.h>
FRAMELESSHELPER_USE_NAMESPACE;
void FluentUI::preInit(){
qDebug()<<"FluentUI init";
FramelessHelper::Quick::initialize();
qputenv("QT_QUICK_CONTROLS_STYLE","Basic");
//6.4及以下监听系统深色模式变化
#ifdef Q_OS_WIN
qputenv("QT_QPA_PLATFORM","windows:darkmode=2");
#endif
}
void FluentUI::postInit(){
FramelessHelper::Core::setApplicationOSThemeAware();
FramelessConfig::instance()->set(Global::Option::EnableBlurBehindWindow);
FramelessConfig::instance()->set(Global::Option::DisableLazyInitializationForMicaMaterial);
}
void FluentUI::initEngine(QQmlApplicationEngine *engine){
FramelessHelper::Quick::registerTypes(engine);
}

View File

@ -1,17 +0,0 @@
#ifndef FLUENTUI_H
#define FLUENTUI_H
#include <QObject>
#include <QQmlApplicationEngine>
#include <QDebug>
class Q_DECL_EXPORT FluentUI
{
public:
static void preInit();
static void postInit();
static void initEngine(QQmlApplicationEngine *engine);
};
#endif // FLUENTUI_H

View File

@ -19,10 +19,10 @@ Rectangle{
property color closeNormalColor: Qt.rgba(0,0,0,0) property color closeNormalColor: Qt.rgba(0,0,0,0)
property color closeHoverColor: Qt.rgba(251/255,115/255,115/255,1) property color closeHoverColor: Qt.rgba(251/255,115/255,115/255,1)
property bool showDark: false property bool showDark: false
property bool titleVisible: true
property color borerlessColor : FluTheme.dark ? FluTheme.primaryColor.lighter : FluTheme.primaryColor.dark property color borerlessColor : FluTheme.dark ? FluTheme.primaryColor.lighter : FluTheme.primaryColor.dark
id:root id:root
color: Qt.rgba(0,0,0,0) color: Qt.rgba(0,0,0,0)
visible: false
height: visible ? 30 : 0 height: visible ? 30 : 0
opacity: visible opacity: visible
z: 65535 z: 65535
@ -33,7 +33,7 @@ Rectangle{
property bool resizable: win && !(win.minimumHeight === win.maximumHeight && win.maximumWidth === win.minimumWidth) property bool resizable: win && !(win.minimumHeight === win.maximumHeight && win.maximumWidth === win.minimumWidth)
} }
TapHandler { TapHandler {
onTapped: if (tapCount === 2) toggleMaximized() onTapped: if (tapCount === 2) btn_maximize.clicked()
gesturePolicy: TapHandler.DragThreshold gesturePolicy: TapHandler.DragThreshold
} }
DragHandler { DragHandler {
@ -48,6 +48,7 @@ Rectangle{
left: parent.left left: parent.left
leftMargin: 10 leftMargin: 10
} }
visible: root.titleVisible
color:root.textColor color:root.textColor
} }
RowLayout{ RowLayout{
@ -75,6 +76,7 @@ Rectangle{
} }
} }
FluIconButton{ FluIconButton{
id:btn_minimize
width: 40 width: 40
height: 30 height: 30
iconSource : FluentIcons.ChromeMinimize iconSource : FluentIcons.ChromeMinimize
@ -85,10 +87,11 @@ Rectangle{
iconColor: root.textColor iconColor: root.textColor
color: hovered ? minimizeHoverColor : minimizeNormalColor color: hovered ? minimizeHoverColor : minimizeNormalColor
onClicked: { onClicked: {
d.win.showMinimized() d.win.visibility = Window.Minimized
} }
} }
FluIconButton{ FluIconButton{
id:btn_maximize
width: 40 width: 40
height: 30 height: 30
iconSource : d.isRestore ? FluentIcons.ChromeRestore : FluentIcons.ChromeMaximize iconSource : d.isRestore ? FluentIcons.ChromeRestore : FluentIcons.ChromeMaximize
@ -100,10 +103,14 @@ Rectangle{
text:d.isRestore?restoreText:maximizeText text:d.isRestore?restoreText:maximizeText
iconSize: 11 iconSize: 11
onClicked: { onClicked: {
toggleMaximized() if (d.win.visibility === Window.Maximized)
d.win.visibility = Window.Windowed
else
d.win.visibility = Window.Maximized
} }
} }
FluIconButton{ FluIconButton{
id:btn_close
iconSource : FluentIcons.ChromeClose iconSource : FluentIcons.ChromeClose
Layout.alignment: Qt.AlignVCenter Layout.alignment: Qt.AlignVCenter
text:closeText text:closeText
@ -118,13 +125,17 @@ Rectangle{
} }
} }
} }
function toggleMaximized() {
if(!d.resizable) function minimizeButton(){
return return btn_minimize
if (d.win.visibility === Window.Maximized) {
d.win.showNormal();
} else {
d.win.showMaximized();
} }
function maximizeButton(){
return btn_maximize
} }
function closeButton(){
return btn_close
}
} }

View File

@ -3,7 +3,6 @@ import QtQuick.Window
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Layouts import QtQuick.Layouts
import FluentUI import FluentUI
import org.wangwenx190.FramelessHelper
Window { Window {
enum LaunchMode { enum LaunchMode {
@ -25,7 +24,6 @@ Window {
event.accepted = false event.accepted = false
} }
} }
visible: true
property color backgroundColor: { property color backgroundColor: {
if(active){ if(active){
return FluTheme.dark ? Qt.rgba(26/255,34/255,40/255,1) : Qt.rgba(238/255,244/255,249/255,1) return FluTheme.dark ? Qt.rgba(26/255,34/255,40/255,1) : Qt.rgba(238/255,244/255,249/255,1)
@ -49,26 +47,9 @@ Window {
} }
} }
} }
// StandardTitleBar {
// id: title_bar
// z:999
// anchors {
// top: parent.top
// topMargin: window.visibility === Window.Windowed ? 1 : 0
// left: parent.left
// right: parent.right
// }
// // windowIcon: "qrc:///images/microsoft.svg"
// windowIconVisible: false
// }
Item{ Item{
id:container id:container
anchors{ anchors.fill: parent
top: parent.top
left: parent.left
right: parent.right
bottom: parent.bottom
}
clip: true clip: true
} }
FluInfoBar{ FluInfoBar{
@ -78,16 +59,6 @@ Window {
WindowHelper{ WindowHelper{
id:helper id:helper
} }
// FramelessHelper.onReady: {
// FramelessHelper.titleBarItem = title_bar
// FramelessHelper.moveWindowToDesktopCenter()
// if (Qt.platform.os !== "macos") {
// FramelessHelper.setSystemButton(title_bar.minimizeButton, FramelessHelperConstants.Minimize);
// FramelessHelper.setSystemButton(title_bar.maximizeButton, FramelessHelperConstants.Maximize);
// FramelessHelper.setSystemButton(title_bar.closeButton, FramelessHelperConstants.Close);
// }
// window.visible = true
// }
function showSuccess(text,duration,moremsg){ function showSuccess(text,duration,moremsg){
infoBar.showSuccess(text,duration,moremsg) infoBar.showSuccess(text,duration,moremsg)
} }
@ -111,5 +82,4 @@ Window {
pageRegister.onResult(data) pageRegister.onResult(data)
} }
} }
} }