This commit is contained in:
zhuzihcu 2023-06-19 09:12:59 +08:00
commit 5acf664492
19 changed files with 431 additions and 234 deletions

View File

@ -130,7 +130,8 @@ FluExpander{
"FluBreadcrumbBar", "FluBreadcrumbBar",
"FluCopyableText", "FluCopyableText",
"FluAcrylic", "FluAcrylic",
"FluRemoteLoader" "FluRemoteLoader",
"FluMenuBar"
]; ];
code = code.replace(/\n/g, "<br>"); code = code.replace(/\n/g, "<br>");
code = code.replace(/ /g, "&nbsp;"); code = code.replace(/ /g, "&nbsp;");

View File

@ -210,20 +210,18 @@ FluScrollablePage{
verticalCenter: parent.verticalCenter verticalCenter: parent.verticalCenter
left: parent.left left: parent.left
} }
items:[ FluMenuItem{
FluMenuItem{ text:"Menu_1"
text:"Menu_1" }
}, FluMenuItem{
FluMenuItem{ text:"Menu_2"
text:"Menu_2" }
}, FluMenuItem{
FluMenuItem{ text:"Menu_3"
text:"Menu_3" }
}, FluMenuItem{
FluMenuItem{ text:"Menu_4"
text:"Menu_4" }
}
]
} }
FluToggleSwitch{ FluToggleSwitch{
id:drop_down_button_switch id:drop_down_button_switch

View File

@ -9,6 +9,24 @@ FluScrollablePage{
title:"Menu" title:"Menu"
FluMenu {
id:menu
title: qsTr("File")
Action { text: qsTr("New...")}
Action { text: qsTr("Open...") }
Action { text: qsTr("Save") }
FluMenuSeparator { }
Action { text: qsTr("Quit") }
FluMenuSeparator { }
Action { text: qsTr("Check");checkable: true;checked: true}
FluMenu{
title: "Save As..."
Action { text: qsTr("Doc") }
Action { text: qsTr("PDF") }
}
}
FluArea{ FluArea{
Layout.fillWidth: true Layout.fillWidth: true
height: 100 height: 100
@ -22,28 +40,19 @@ FluScrollablePage{
left:parent.left left:parent.left
} }
FluText{
text:"Menu"
}
FluButton{ FluButton{
text:"左击菜单" text:"Show Menu Popup"
Layout.topMargin: 20 Layout.topMargin: 20
onClicked:{ onClicked:{
menu.popup() menu.popup()
} }
} }
FluButton{
text:"右击菜单"
Layout.topMargin: 20
onClicked: {
showSuccess("请按鼠标右击")
}
MouseArea{
anchors.fill: parent
acceptedButtons: Qt.RightButton
onClicked: {
menu.popup()
}
}
}
} }
} }
@ -69,20 +78,74 @@ menu.popup()
' '
} }
FluMenu{
id:menu FluArea{
FluMenuItem{ Layout.fillWidth: true
text:"删除" height: 100
onClicked: { paddings: 10
showError("删除") Layout.topMargin: 20
Column{
spacing: 15
anchors{
verticalCenter: parent.verticalCenter
left:parent.left
} }
}
FluMenuItem{ FluText{
text:"修改" text:"MenuBar"
onClicked: {
showInfo("修改")
} }
FluMenuBar {
id:menu_bar
FluMenu {
title: qsTr("File")
Action { text: qsTr("New...") }
Action { text: qsTr("Open...") }
Action { text: qsTr("Save") }
FluMenuSeparator { }
Action { text: qsTr("Quit") }
FluMenu{
title: "Save As..."
Action { text: qsTr("Doc") }
Action { text: qsTr("PDF") }
}
}
FluMenu {
title: qsTr("Edit")
Action { text: qsTr("Cut") }
Action { text: qsTr("Copy") }
Action { text: qsTr("Paste") }
}
FluMenu {
title: qsTr("Help")
Action { text: qsTr("About") }
}
}
} }
} }
CodeExpander{
Layout.fillWidth: true
Layout.topMargin: -1
code:'FluMenuBar{
id:menu
FluMenu:{
title:"File"
Action { text: qsTr("New...") }
}
FluMenu:{
title:"Edit"
Action { text: qsTr("Cut") }
Action { text: qsTr("Copy") }
Action { text: qsTr("Paste") }
}
}
menu.popup()
'
}
} }

View File

@ -21,36 +21,34 @@ FluScrollablePage{
id:btn_status_mode id:btn_status_mode
Layout.preferredWidth: 140 Layout.preferredWidth: 140
text:"Loading" text:"Loading"
items:[ FluMenuItem{
FluMenuItem{ text:"Loading"
text:"Loading" onClicked: {
onClicked: { btn_status_mode.text = text
btn_status_mode.text = text status_view.statusMode = FluStatusView.Loading
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
}
} }
] }
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
}
}
} }
} }
} }

View File

@ -40,57 +40,53 @@ FluScrollablePage{
id:btn_tab_width_behavior id:btn_tab_width_behavior
Layout.preferredWidth: 140 Layout.preferredWidth: 140
text:"Equal" text:"Equal"
items:[ FluMenuItem{
FluMenuItem{ text:"Equal"
text:"Equal" onClicked: {
onClicked: { btn_tab_width_behavior.text = text
btn_tab_width_behavior.text = text tab_view.tabWidthBehavior = FluTabView.Equal
tab_view.tabWidthBehavior = FluTabView.Equal
}
},
FluMenuItem{
text:"SizeToContent"
onClicked: {
btn_tab_width_behavior.text = text
tab_view.tabWidthBehavior = FluTabView.SizeToContent
}
},
FluMenuItem{
text:"Compact"
onClicked: {
btn_tab_width_behavior.text = text
tab_view.tabWidthBehavior = FluTabView.Compact
}
} }
] }
FluMenuItem{
text:"SizeToContent"
onClicked: {
btn_tab_width_behavior.text = text
tab_view.tabWidthBehavior = FluTabView.SizeToContent
}
}
FluMenuItem{
text:"Compact"
onClicked: {
btn_tab_width_behavior.text = text
tab_view.tabWidthBehavior = FluTabView.Compact
}
}
} }
FluDropDownButton{ FluDropDownButton{
id:btn_close_button_visibility id:btn_close_button_visibility
text:"Always" text:"Always"
Layout.preferredWidth: 120 Layout.preferredWidth: 120
items:[ FluMenuItem{
FluMenuItem{ text:"Nerver"
text:"Nerver" onClicked: {
onClicked: { btn_close_button_visibility.text = text
btn_close_button_visibility.text = text tab_view.closeButtonVisibility = FluTabView.Nerver
tab_view.closeButtonVisibility = FluTabView.Nerver
}
},
FluMenuItem{
text:"Always"
onClicked: {
btn_close_button_visibility.text = text
tab_view.closeButtonVisibility = FluTabView.Always
}
},
FluMenuItem{
text:"OnHover"
onClicked: {
btn_close_button_visibility.text = text
tab_view.closeButtonVisibility = FluTabView.OnHover
}
} }
] }
FluMenuItem{
text:"Always"
onClicked: {
btn_close_button_visibility.text = text
tab_view.closeButtonVisibility = FluTabView.Always
}
}
FluMenuItem{
text:"OnHover"
onClicked: {
btn_close_button_visibility.text = text
tab_view.closeButtonVisibility = FluTabView.OnHover
}
}
} }
} }
} }

View File

@ -60,29 +60,27 @@ FluScrollablePage {
id:btn_selection_model id:btn_selection_model
Layout.preferredWidth: 140 Layout.preferredWidth: 140
text:"None" text:"None"
items:[ FluMenuItem{
FluMenuItem{ text:"None"
text:"None" onClicked: {
onClicked: { btn_selection_model.text = text
btn_selection_model.text = text tree_view.selectionMode = FluTabView.Equal
tree_view.selectionMode = FluTabView.Equal
}
},
FluMenuItem{
text:"Single"
onClicked: {
btn_selection_model.text = text
tree_view.selectionMode = FluTabView.SizeToContent
}
},
FluMenuItem{
text:"Muiltple"
onClicked: {
btn_selection_model.text = text
tree_view.selectionMode = FluTabView.Compact
}
} }
] }
FluMenuItem{
text:"Single"
onClicked: {
btn_selection_model.text = text
tree_view.selectionMode = FluTabView.SizeToContent
}
}
FluMenuItem{
text:"Muiltple"
onClicked: {
btn_selection_model.text = text
tree_view.selectionMode = FluTabView.Compact
}
}
} }
FluFilledButton{ FluFilledButton{
text:"获取选中的数据" text:"获取选中的数据"

View File

@ -135,7 +135,7 @@ CustomWindow {
FluRemoteLoader{ FluRemoteLoader{
id:loader id:loader
anchors.fill: parent anchors.fill: parent
// source: "http://localhost:9000/RemoteComponent.qml" // source: "http://localhost:9000/RemoteComponent.qml"
source: "https://zhu-zichu.gitee.io/RemoteComponent.qml" source: "https://zhu-zichu.gitee.io/RemoteComponent.qml"
} }
} }

View File

@ -13,6 +13,28 @@ CustomWindow {
fixSize: true fixSize: true
launchMode: FluWindow.Standard launchMode: FluWindow.Standard
FluMenuBar {
FluMenu {
title: qsTr("File")
Action { text: qsTr("New...") }
Action { text: qsTr("Open...") }
Action { text: qsTr("Save") }
Action { text: qsTr("Save As...") }
FluMenuSeparator { }
Action { text: qsTr("Quit") }
}
FluMenu {
title: qsTr("Edit")
Action { text: qsTr("Cut") }
Action { text: qsTr("Copy") }
Action { text: qsTr("Paste") }
}
FluMenu {
title: qsTr("Help")
Action { text: qsTr("About") }
}
}
FluText{ FluText{
anchors.centerIn: parent anchors.centerIn: parent
text:"我是一个Standard模式的窗口每次我都会创建一个新的窗口" text:"我是一个Standard模式的窗口每次我都会创建一个新的窗口"

View File

@ -43,6 +43,10 @@ void FluApp::navigate(const QString& route,const QJsonObject& argument,FluRegist
} }
QQmlEngine *engine = qmlEngine(appWindow); QQmlEngine *engine = qmlEngine(appWindow);
QQmlComponent component(engine, routes().value(route).toString()); QQmlComponent component(engine, routes().value(route).toString());
if (component.isError()) {
qWarning() << component.errors();
return;
}
QVariantMap properties; QVariantMap properties;
properties.insert("route",route); properties.insert("route",route);
if(fluRegister){ if(fluRegister){

View File

@ -8,7 +8,7 @@ FluTextStyle::FluTextStyle(QObject *parent)
Caption(caption); Caption(caption);
QFont body; QFont body;
body.setPixelSize(14); body.setPixelSize(13);
Body(body); Body(body);
QFont bodyStrong; QFont bodyStrong;

View File

@ -3,5 +3,5 @@ import QtQuick.Window
import FluentUI import FluentUI
Rectangle { Rectangle {
color: FluTheme.dark ? Window.active ? Qt.rgba(55/255,55/255,55/255,1):Qt.rgba(45/255,45/255,45/255,1) : Qt.rgba(226/255,230/255,234/255,1) color: FluTheme.dark ? Qt.rgba(60/255,60/255,60/255,1) : Qt.rgba(210/255,210/255,210/255,1)
} }

View File

@ -30,7 +30,7 @@ Button {
} }
} }
property var window : Window.window property var window : Window.window
property alias items: menu.content default property alias contentData: menu.contentData
Accessible.role: Accessible.Button Accessible.role: Accessible.Button
Accessible.name: control.text Accessible.name: control.text
Accessible.description: contentDescription Accessible.description: contentDescription
@ -75,9 +75,9 @@ Button {
color: control.textColor color: control.textColor
} }
onClicked: { onClicked: {
if(items && menu.getContainerCount()!==0){ if(items && menu.count !==0){
var pos = control.mapToItem(null, 0, 0) var pos = control.mapToItem(null, 0, 0)
var containerHeight = menu.getContainerHeight() var containerHeight = menu.height
if(window.height>pos.y+control.height+containerHeight){ if(window.height>pos.y+control.height+containerHeight){
menu.y = control.height menu.y = control.height
}else if(pos.y>containerHeight){ }else if(pos.y>containerHeight){

View File

@ -1,62 +1,65 @@
import QtQuick import QtQuick
import QtQuick.Layouts
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Controls.impl
import QtQuick.Templates as T
import FluentUI import FluentUI
Menu { T.Menu {
default property alias content: container.data id: control
property bool enableAnimation: true
id: popup implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
width: 140 contentWidth + leftPadding + rightPadding)
height: container.height implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
modal:true contentHeight + topPadding + bottomPadding)
dim:false
margins: 0
overlap: 1
spacing: 0
delegate: FluMenuItem { }
enter: Transition { enter: Transition {
reversible: true reversible: true
NumberAnimation { NumberAnimation {
property: "opacity" property: "opacity"
from:0 from:0
to:1 to:1
duration: enableAnimation ? 83 : 0 duration: 83
} }
} }
exit:Transition { exit:Transition {
NumberAnimation { NumberAnimation {
property: "opacity" property: "opacity"
from:1 from:1
to:0 to:0
duration: enableAnimation ? 83 : 0 duration: 83
} }
} }
background:Item{ contentItem: ListView {
FluShadow{ implicitHeight: contentHeight
radius: 5 model: control.contentModel
} interactive: Window.window
} ? contentHeight + control.topPadding + control.bottomPadding > Window.window.height
contentItem: Item { : false
clip: true clip: true
Rectangle{ currentIndex: control.currentIndex
anchors.fill: parent ScrollIndicator.vertical: ScrollIndicator {}
color:FluTheme.dark ? Qt.rgba(45/255,45/255,45/255,1) : Qt.rgba(249/255,249/255,249/255,1)
border.color: FluTheme.dark ? Window.active ? Qt.rgba(55/255,55/255,55/255,1):Qt.rgba(45/255,45/255,45/255,1) : Qt.rgba(226/255,229/255,234/255,1)
border.width: 1
radius: 5
}
Column{
id:container
spacing: 5
topPadding: 5
bottomPadding: 5
width: popup.width
function closePopup(){
popup.close()
}
}
} }
function getContainerHeight(){
return container.height
background: Rectangle {
implicitWidth: 150
implicitHeight: 40
color:FluTheme.dark ? Qt.rgba(45/255,45/255,45/255,1) : Qt.rgba(240/255,240/255,240/255,1)
border.color: FluTheme.dark ? Window.active ? Qt.rgba(55/255,55/255,55/255,1):Qt.rgba(45/255,45/255,45/255,1) : Qt.rgba(226/255,229/255,234/255,1)
border.width: 1
radius: 5
FluShadow{}
} }
function getContainerCount(){
return container.children.length T.Overlay.modal: Rectangle {
color: Color.transparent(control.palette.shadow, 0.5)
}
T.Overlay.modeless: Rectangle {
color: Color.transparent(control.palette.shadow, 0.12)
} }
} }

View File

@ -0,0 +1,25 @@
import QtQuick
import QtQuick.Templates as T
import QtQuick.Controls.impl
T.MenuBar {
id: control
implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
contentWidth + leftPadding + rightPadding)
implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
contentHeight + topPadding + bottomPadding)
delegate: FluMenuBarItem { }
contentItem: Row {
spacing: control.spacing
Repeater {
model: control.contentModel
}
}
background: Item {
implicitHeight: 30
}
}

View File

@ -0,0 +1,53 @@
import QtQuick
import QtQuick.Templates as T
import QtQuick.Controls.impl
import FluentUI
T.MenuBarItem {
id: control
implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
implicitContentWidth + leftPadding + rightPadding)
implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
implicitContentHeight + topPadding + bottomPadding,
implicitIndicatorHeight + topPadding + bottomPadding)
spacing: 6
padding: 6
leftPadding: 12
rightPadding: 16
icon.width: 24
icon.height: 24
icon.color: control.palette.buttonText
contentItem: FluText {
verticalAlignment: Text.AlignVCenter
text: control.text
}
background: Rectangle {
implicitWidth: 30
implicitHeight: 30
radius: 3
color: {
if(FluTheme.dark){
if(control.highlighted){
return Qt.rgba(1,1,1,0.06)
}
if(control.hovered){
return Qt.rgba(1,1,1,0.03)
}
return Qt.rgba(0,0,0,0)
}else{
if(control.highlighted){
return Qt.rgba(0,0,0,0.06)
}
if(control.hovered){
return Qt.rgba(0,0,0,0.03)
}
return Qt.rgba(0,0,0,0)
}
}
}
}

View File

@ -1,53 +1,69 @@
import QtQuick import QtQuick
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Controls.impl
import QtQuick.Templates as T
import FluentUI import FluentUI
Item { T.MenuItem {
property string text: "MenuItem" id: control
property var onClickFunc
signal clicked implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
id:control implicitContentWidth + leftPadding + rightPadding)
width: { implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
if(control.parent){ implicitContentHeight + topPadding + bottomPadding,
return control.parent.width implicitIndicatorHeight + topPadding + bottomPadding)
}
return 140 padding: 6
spacing: 6
icon.width: 24
icon.height: 24
icon.color: control.palette.windowText
height: visible ? implicitHeight : 0
contentItem: FluText {
readonly property real arrowPadding: control.subMenu && control.arrow ? control.arrow.width + control.spacing : 0
readonly property real indicatorPadding: control.checkable && control.indicator ? control.indicator.width + control.spacing : 0
leftPadding: !control.mirrored ? indicatorPadding : arrowPadding
rightPadding: control.mirrored ? indicatorPadding : arrowPadding
verticalAlignment: Text.AlignVCenter
text: control.text
} }
height: 32
Rectangle{ indicator: FluIcon {
anchors.centerIn: parent x: control.mirrored ? control.width - width - control.rightPadding : control.leftPadding
width: control.width-40 y: control.topPadding + (control.availableHeight - height) / 2
height: 32 visible: control.checked
radius: 4 iconSource: FluentIcons.CheckMark
}
arrow: FluIcon {
x: control.mirrored ? control.leftPadding : control.width - width - control.rightPadding
y: control.topPadding + (control.availableHeight - height) / 2
visible: control.subMenu
iconSource: FluentIcons.ChevronRightMed
}
background: Rectangle {
implicitWidth: 150
implicitHeight: 40
x: 1
y: 1
width: control.width - 2
height: control.height - 2
color:{ color:{
if(FluTheme.dark){ if(FluTheme.dark){
if(mouse_area.containsMouse){ if(control.highlighted){
return Qt.rgba(1,1,1,0.05) return Qt.rgba(1,1,1,0.06)
} }
return Qt.rgba(0,0,0,0) return Qt.rgba(0,0,0,0)
}else{ }else{
if(mouse_area.containsMouse){ if(control.highlighted){
return Qt.rgba(0,0,0,0.05) return Qt.rgba(0,0,0,0.03)
} }
return Qt.rgba(0,0,0,0) return Qt.rgba(0,0,0,0)
} }
} }
FluText{
text: control.text
anchors.centerIn: parent
}
MouseArea{
id:mouse_area
hoverEnabled: true
anchors.fill: parent
onClicked: {
if(control.onClickFunc){
control.onClickFunc()
return
}
control.parent.closePopup()
control.clicked()
}
}
} }
} }

View File

@ -0,0 +1,22 @@
import QtQuick
import QtQuick.Controls.impl
import QtQuick.Templates as T
import FluentUI
T.MenuSeparator {
id: control
implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
implicitContentWidth + leftPadding + rightPadding)
implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
implicitContentHeight + topPadding + bottomPadding)
padding: 0
verticalPadding: 0
contentItem: Rectangle {
implicitWidth: 188
implicitHeight: 1
color: FluTheme.dark ? Qt.rgba(60/255,60/255,60/255,1) : Qt.rgba(210/255,210/255,210/255,1)
}
}

View File

@ -73,6 +73,5 @@ TextField{
id:menu id:menu
inputItem: control inputItem: control
} }
} }

View File

@ -9,8 +9,7 @@ FluMenu{
property string selectAllText : "全选" property string selectAllText : "全选"
property var inputItem property var inputItem
id:menu id:menu
focus:false width: 120
enableAnimation:false
onVisibleChanged: { onVisibleChanged: {
if(visible){ if(visible){
inputItem.forceActiveFocus() inputItem.forceActiveFocus()