主頁 > 前端設計 > Qt QML 自用選單/目錄/工具列的全面攻略(TabBar、MenuBar、ToolBar、Button定制、Listview、Repeater)

Qt QML 自用選單/目錄/工具列的全面攻略(TabBar、MenuBar、ToolBar、Button定制、Listview、Repeater)

2020-11-11 10:30:16 前端設計

文章目錄

  • 1. TabBar的工具列/目錄
    • 1.1 演示
    • 1.2 關鍵控制元件
    • 1.3 原始碼
  • 2 MenuBar 選單
    • 2.1 演示
    • 2.2 關鍵控制元件
    • 2.3 原始碼
  • 3 ToolBar 工具列/目錄
    • 3.1 演示
    • 3.2 關鍵控制元件
    • 3.3 原始碼
  • 4. 基于Button定制的工具列/目錄
    • 4.1 演示
    • 4.2 關鍵控制元件
    • 4.3 原始碼
  • 5. 基于Listview的側邊目錄/工具列
    • 5.1 演示
    • 5.2 控制元件
    • 5.3 核心原始碼
    • 5.4 原始碼
  • 6. 基于Repeater的目錄/工具列
    • 6.1 演示
    • 6.2 關鍵控制元件
    • 6.3 關鍵原始碼
    • 6.4 原始碼
  • 7. 總結

1. TabBar的工具列/目錄

1.1 演示

在這里插入圖片描述

1.2 關鍵控制元件

TabBar 提供了一個tab-based的導航模型,由TabButton來填充內容,

TabButton 與Button相似,都是從AbstractButton繼承它的API,一般用在TabBar中,

SwipeView :使用一組頁面填充,一次只能看到一個頁面,用戶可以通過橫向滑動在頁面之間導航,

PageIndicator :SwipeView本身完全是非可視的,與PageIndicator結合使用后,給用戶一個有多個頁面的視覺提示,

1.3 原始碼

如下為TabBar、TabButton放入header中的實體:

import QtQuick          2.12
import QtQuick.Window   2.12
import QtQuick.Controls 2.5
import QtQuick.Layouts  1.12

ApplicationWindow  {
    visible: true
    width: 480
    height: 360
    title: qsTr("TabBar工具列")
   
    ///--1. ApplicationWindow 中才有 header
    ///--2. QtQuick.Controls 2.0 版本后才有header
    ///--3. TabBar不一定要用在header中
    header: TabBar {
        id:             tabBar
        TabButton { text: qsTr("我是目錄1") }
        TabButton { text: qsTr("我是目錄2") }
        TabButton { text: qsTr("我是目錄3") }
    }

    SwipeView {
        id: view
        currentIndex: tabBar.currentIndex
        anchors.fill: parent
        
		onCurrentIndexChanged: {
			tabBar.currentIndex = currentIndex
			indicator.currentIndex  = currentIndex
        }
        //第一頁
        Image {
            id:                 firstPage
            smooth:             true
            mipmap:             true
            antialiasing:       true
            fillMode:           Image.PreserveAspectFit
            sourceSize.height:  height
            source:             "/images/code"
        }
        //第二頁
        Image {
            id:                 secondPage
            smooth:             true
            mipmap:             true
            antialiasing:       true
            fillMode:           Image.PreserveAspectFit
            sourceSize.height:  height
            source:             "/images/working"
        }
        //第三頁
        Image {
            id:                 thirdPage
            smooth:             true
            mipmap:             true
            antialiasing:       true
            fillMode:           Image.PreserveAspectFit
            sourceSize.height:  height
            source:             "/images/focus"
        }
    }

    PageIndicator {
        id: indicator
        count: view.count
        anchors.bottom: view.bottom
        anchors.horizontalCenter: parent.horizontalCenter
    }
}

2 MenuBar 選單

2.1 演示

在上述中增加一個MenuBar選單條:
在這里插入圖片描述

2.2 關鍵控制元件

MenuBar 選單欄由下拉選單組成,通常位于視窗的頂部邊緣,

Menu 選單有兩個主要用例,其一為文本選單; 桌面右鍵單擊后顯示的選單,推薦的打開選單的方法是呼叫popup();其二為彈出選單,例如,在頂部選單欄中,單擊按鈕后顯示的選單,

Action 表示一個抽象的用戶界面操作,該操作可以具有快捷鍵,也可以分配給選單項和工具列按鈕,

MenuItem 與Button相似,都是從AbstractButton繼承它的API,一般用在Menu選單中,

MenuSeparator 是通過用一行線來分隔選單中的不同項

2.3 原始碼

在TabBar的導航模型中加入以下代碼即可,以下都未系結觸發事件

    //不用 "menuBar:" 就不會固定在header的上方
    menuBar: MenuBar {
        Menu {
            title: qsTr("&File")
            Action { text: qsTr("&New...") }
            Action { text: qsTr("&Open...") }
            Action { text: qsTr("&Save") }
            Action { text: qsTr("Save &As...") }
            MenuSeparator { }
            Action { text: qsTr("&Quit") }
        }
        Menu {
            title: qsTr("&Edit")
            MenuItem {
                text: "Cut"
                //快捷鍵,QtQuick.Controls 2.0后沒有了,當然可以用其他方式實作
//                shortcut: "Ctrl+X"
                onTriggered: {}
            }
            MenuItem { text: "Copy" }
            MenuItem { text: "Paste" }
        }
        Menu {
            title: qsTr("&Help")
            Action { text: qsTr("&About") }
        }
    }

3 ToolBar 工具列/目錄

3.1 演示

與TabBar 相似:
在這里插入圖片描述

3.2 關鍵控制元件

ToolBar :常用在頁眉或頁腳作導航按鈕和搜索欄位,它通常要與布局,一起使用,如通過創建RowLayout,

ToolButton :繼承于Button按鈕,但是提供了更適合在工具列中使用的外觀,

RowLayout :能自動調整的橫向排列,

3.3 原始碼

ToolBar 與 TabBar相似,ToolBar 主要沒有tabBar.currentIndex屬性,需要自定義,在上述代碼中作如下修改,其一替換了"header" ,其二為修改控制元件之間的觸發邏輯,(可搜索 “[ToolBar修改]” )

import QtQuick          2.12
import QtQuick.Window   2.12
import QtQuick.Controls 2.5
import QtQuick.Layouts 1.12

ApplicationWindow  {
    visible: true
    width: 480
    height: 360
    title: qsTr("3.ToolBar工具列")

    //[ToolBar修改]1: 替換header
    /*  ///--1 TabBar工具列
    header: TabBar {
        id:             tabBar
        TabButton { text: qsTr("我是目錄1") }
        TabButton { text: qsTr("我是目錄2") }
        TabButton { text: qsTr("我是目錄3") }
    }
    */
    ///--2.ToolBar
    header: ToolBar {
        id:     toolBar
        RowLayout {
            id:     rowLayout
            anchors.fill: parent
            ToolButton {
                text: qsTr("目錄0")
                onClicked: view.currentIndex = 0
            }
            ToolButton {
                text: qsTr("目錄1")
                onClicked: view.currentIndex = 1
            }
            ToolButton {
                text: qsTr("目錄2")
                onClicked: view.currentIndex = 2
            }
        }
    }

    SwipeView {
        id: view
        anchors.fill: parent
        //[ToolBar修改]2: 修改控制元件之間的觸發邏輯
        //currentIndex: tabBar.currentIndex
        onCurrentIndexChanged: {
            //tabBar.currentIndex = currentIndex
            for (var i=0; i<rowLayout.children.length; i++) {
                rowLayout.children[i].checked = false
            }
            rowLayout.children[currentIndex].checked = true

            indicator.currentIndex = currentIndex
        }
        //第一頁
        Image {
            id:                 firstPage
            smooth:             true
            mipmap:             true
            antialiasing:       true
            fillMode:           Image.PreserveAspectFit
            sourceSize.height:  height
            source:             "/images/code"
        }
        //第二頁
        Image {
            id:                 secondPage
            smooth:             true
            mipmap:             true
            antialiasing:       true
            fillMode:           Image.PreserveAspectFit
            sourceSize.height:  height
            source:             "/images/working"
        }
        //第三頁
        Image {
            id:                 thirdPage
            smooth:             true
            mipmap:             true
            antialiasing:       true
            fillMode:           Image.PreserveAspectFit
            sourceSize.height:  height
            source:             "/images/focus"
        }
    }
    PageIndicator {
        id: indicator
        count: view.count
        anchors.bottom: view.bottom
        anchors.horizontalCenter: parent.horizontalCenter
    }
}

4. 基于Button定制的工具列/目錄

4.1 演示

在這里插入圖片描述

4.2 關鍵控制元件

MyButton :在 “Button” 上的定制,包括背景、內部的文字,圖片等,

ColoredImage :彩色圖片,之前的文章已經講過,對普通的 “image” 加一層 “ColorOverlay” 顏色覆寫即可,后續不再講述, QML 影像顏色漸變和顏色覆寫

Loader :加載器,動態的加載QML檔案,也可以根據需要創建QML,此處為最簡單的Loader的加載,

4.3 原始碼

main.qml:

import QtQuick          2.12
import QtQuick.Window   2.3
import QtQuick.Controls 2.5
import QtQuick.Layouts  1.12

ApplicationWindow {
    visible:                        true
    width:                          480
    height:                         360
    title:                          qsTr("4. 定制Button")
    minimumWidth:                   450
    minimumHeight:                  240
    property int index:             1

    header: ToolBar {
        id:                         tabBar
        RowLayout {
            id:                     rowLayout
            anchors.fill:           parent
            spacing:                10
            //head
            ColoredImage {
                id:                 innerImage
                width:              30
                height:             width
                source:             "/images/menu"
                color:              "black"
            }
            //first Button
            MyButton {
                id:                 firstButton
                text:               qsTr("我是目錄1")
                icon.source:        "/images/1"
                onClicked: {
                    clearAllChecks()
                    checked = true
                    index = 1
                }
            }
            //second Button
            MyButton {
                text:               qsTr("我是目錄2")
                icon.source:        "/images/2"
                onClicked: {
                    clearAllChecks()
                    checked = true
                    index = 2
                }
            }
            //third Button
            MyButton {
                text:               qsTr("我是目錄3")
                icon.source:        "/images/3"
                onClicked: {
                    clearAllChecks()
                    checked = true
                    index = 3
                }
            }
        }
    }

    Component.onCompleted: {
        firstButton.checked = true
    }

    function clearAllChecks() {
        for (var i=0; i<rowLayout.children.length; i++) {
           if (rowLayout.children[i].toString().startsWith("MyButton"))
                rowLayout.children[i].checked = false
            }
    }

    //界面的顯示的形式有多種多樣的,這里不做多說明,如前三個用的SwipeView,
    Loader {
        id:             firstPage
        anchors.fill:   parent
        visible:        index==1
        source:         "TestPage1.qml"
    }
    Loader {
        id:             secondPage
        anchors.fill:   parent
        visible:        index==2
        source:         "TestPage2.qml"
    }
    TestPage3 {
        id:             thirdPage
        anchors.fill:   parent
        visible:        index==3
    }
}

MyButton.qml:

import QtQuick          2.9
import QtQuick.Controls 2.5

Button {
    id:                         button
    height:                     20
    leftPadding:                4
    rightPadding:               4
    checkable:                  false

    property alias  labelColor: _label.color

    onCheckedChanged: checkable = false

    background: Rectangle {
        anchors.fill: parent
        color:  button.checked ? "#FFDC35" : Qt.rgba(0,0,0,0)
    }

    contentItem: Row {              //可修改為Column
        spacing:                    10
        anchors.verticalCenter:     button.verticalCenter

        ColoredImage {
            id:                     innerImage
            width:                  20
            height:                 width
            source:                 button.icon.source
            color:                  button.checked ?  "#007979" : "black"
        }

        Text {
            id:                         _label
            visible:                    text !== ""
            text:                       button.text
            anchors.verticalCenter:     parent.verticalCenter
            color:                      button.checked ? "#007979" : "black"
            font.bold:                  true
            font.pointSize:             15
        }
    }
}

ColoredImage.qml 就不貼出了,具體見原始碼,

5. 基于Listview的側邊目錄/工具列

5.1 演示

在這里插入圖片描述

5.2 控制元件

ListView :ListView有一個模型(model)和一個委托(delegate),前者定義要顯示的資料,后者定義資料應該如何顯示,串列視圖中的專案可以水平放置,也可以垂直放置,此處ListView放與左側且垂直排列,

MouseArea 滑鼠區域是一個不可見的項,通常與可見項一起使用,以便為該項提供滑鼠處理,

Connections :信號連接器,其它文章也已講過,此處為連接根目錄的listIndex信號,

5.3 核心原始碼

整體結構是通過ListView來確定的,通過點擊事件,觸發每一個modelData的listIndex信號,來改變checked的值,來確認是否點擊,還可以確保其它model的互斥,主要邏輯如下:

    property alias listModel:       leftListView.model
    signal listIndex(int idx);

    ListView{
        id:             leftListView
		...
        delegate:       listDelegate
    }
    
    Component{
        id: listDelegate
        Rectangle{
            property bool checked: 		false
			...
    	    Connections{
            	target:                     _leftMenu
            	onListIndex:                listItem.checked = (idx===index);  
	        }
	        ...
	        MouseArea {
				...
	            onClicked: {
	                listIndex(index)
	            }
	        }
        }
	}

5.4 原始碼

main.qml: (省去部分非關鍵代碼)

import QtQuick 2.12
import QtQuick.Controls 2.5
import QtQuick.Window 2.12

Window {
    id:                         root
    visible:                    true
    width:                      480
    height:                     360
    minimumWidth:               450
    minimumHeight:              240
    title:                      qsTr("ListView選單/工具列")

    property int    pageIndex:          0
    property bool   fullMenuShow:       false
    property real   menuWidthShort:     40

    //三個圖片界面:
    Item {
        id: page
        height:                 parent.height
        anchors.left:           parent.left
        anchors.leftMargin:     40
        anchors.right:          parent.right
        //firstPage
        Image {
            id:                 firstPage
            anchors.fill:       parent
            smooth:             true
            mipmap:             true
            antialiasing:       true
            fillMode:           Image.PreserveAspectFit
            sourceSize.height:  height
            source:             "/images/code"
            visible:            pageIndex == 0

        }
        //secondPage
        Image {
            id:                 secondPage
            ...
            source:             "/images/working"
            visible:            pageIndex == 1
        }
        //thirdPage
        Image {
            id:                 thirdPage
            ...
            source:             "/images/focus"
            visible:            pageIndex == 2
        }
    }

    //左側工具列/目錄的外框
    Rectangle {
        id:                     rectMenu
        width:                  fullMenuShow ? 40*4 : 40
        height:                 parent.height
        anchors.left:           parent.left
        anchors.top:            parent.top
        color:                  "gray"

        MouseArea {
            anchors.fill:       parent
            hoverEnabled:       true
            onEntered:          fullMenuShow = true
            onExited:           fullMenuShow = false
        }
//        Behavior on width {
//            NumberAnimation { duration: 200 }
//        }
    }

    //左側工具列/目錄
    ListviewMenu {
        id:                     listViewMenu
        width:                  rectMenu.width
        listViewIndex:          0;
        color:                  "gray"
        listModel:   [
            {
                name:           qsTr("我是目錄1"),
                iconSource:     "/images/1.png",
            },
            {
                name:           qsTr("我是目錄2"),
                iconSource:     "/images/2.png",
            },
            {
                name:           qsTr("我是目錄3"),
                iconSource:     "/images/3.png",
            }
        ]

        onListIndex: { //使用信號連接器都可以
            pageIndex = idx;
        }
    }
}

ListviewMenu.qml: (省去部分非關鍵代碼)

import QtQuick 2.7
import QtQuick.Controls 1.2
import QtGraphicalEffects 1.0

Item {
    id:                             _leftMenu
    visible:                        true
    height:                         leftMunu.height;

    property alias color:           leftMunu.color
    property alias listViewIndex:   leftListView.currentIndex;
    property alias listModel:       leftListView.model

    property bool bMenuShown:       false
    property real listItemHeight:   30

    signal listIndex(int idx);

    Component.onCompleted: {
        listIndex(0)
    }

    Rectangle {
        id:                                 leftMunu
        height:                             rectHeader.height + leftItem.anchors.margins + leftItem.height
        width:                              parent.width
        ///--header
        Rectangle {
            id:                             rectHeader
            height:                         35
            width:                          parent.width
            color:                          "#5D478B"  //紫色
            Row {
                id:                         _rowHeader
                ...
                Image {
                   id:                      innerImageHeader
                   source:                  "/images/menu.png"
                   ...
                }
                Label {
                   id:                      innerTextHeader
                   ...
                   text:                    qsTr("目  錄")
                   visible:                 root.fullMenuShow ? true : false
                }
            }
            Image {
                id:                         dottedlineHeader
                ...
                source:                     "/images/line.png"
                visible:                    root.fullMenuShow ? true : false
            }
        }
        ///--list view
        Item {
            id:                 leftItem
            height:             listItemHeight * leftListView.count
            width:              parent.width
            anchors.top:        rectHeader.bottom
            ListView{
                id:             leftListView
                anchors.fill:   parent
                delegate:       listDelegate
            }
        }
    }

    Component{
        id: listDelegate

        Rectangle{
            id: listItem
            property bool checked: false
            color:                          _leftMenu.color
            width:                          parent.width
            height:                         listItemHeight

            Connections{
                target:                     _leftMenu
                onListIndex:                listItem.checked = (idx===index);
            }

            Row {
                id:                         _row
                anchors.centerIn:           parent
                height:                     parent.height * 0.6
                width:                      parent.width
                spacing:                    6

                ColoredImage {
                    id:                     innerImage
                    width:                  menuWidthShort
                    height:                 parent.height
                    source:                 modelData.iconSource
                    color:                  listItem.checked?  "yellow" : "white"
                }
                Text {
                   id:                      innerText
                   text:                    modelData.name
                   color:                   listItem.checked?  "yellow" : "white"  //"#5DB6EA"
                   font.family:             "Microsoft Yahei" //友情提醒:商業用途會收費的
                   font.pointSize:          15
                   anchors.verticalCenter:  parent.verticalCenter
                   visible:                 root.fullMenuShow ? true : false
                }
            }
            Image {
                id:                         dottedline
                ...
                fillMode:                   Image.Stretch
                source:                     "/images/line.png"
                visible:                    root.fullMenuShow ? true : false
            }
            MouseArea {
                anchors.fill: parent
                hoverEnabled: true
                onEntered: {
                    root.fullMenuShow = true
                    color = "green"
                }
                onExited: {
                    root.fullMenuShow = false
                    color  = _leftMenu.color
                }
                onClicked: {
                    listIndex(index)
                }
            }
        }
    }
}

6. 基于Repeater的目錄/工具列

6.1 演示

在這里插入圖片描述

6.2 關鍵控制元件

Repeater Repeater型別用于創建大量類似的項,與上文中ListView一樣,Repeater有一個模型(model)和一個委托(delegate):前者定義要顯示的資料,后者定義資料應該如何顯示,

LinearGradient :彩色漸變圖片,之前的文章已經講過,使用它也是對其它知識點的學習, QML 影像顏色漸變和顏色覆寫

6.3 關鍵原始碼

結構與ListView相似,邏輯上也基本一樣,多了一個當前項自身的互斥(ListView也可以實作的),配合Column等排列,使用是來更加靈活,其主要結構和邏輯代碼如下:

    Column {         //改為Row RowLoyout等都行
        ...
        Repeater {
			...
            delegate:                   listDelegate
        }
    }
    Component{
        id:                     listDelegate
        Rectangle {
        	property bool checked: false
            property bool oldChecked: false
			Connections{
			    target:             menu
			    onGetListIndex: {
			        //idx: click item ---- index: every item
			        if(idx === index ) {
			            //與前一次互斥事件, 大部分目錄都是此邏輯
			            if(idx!==3) {
			                if(!listItem.oldChecked) {
			                    listItem.checked = true
			                    pageSig(idx)
			                }
			                else {
			                    listItem.checked = false
			                    pageSig(9)      //關閉此目錄(回到主頁)/工具
			                }
			            }
			            //可添加:連續點擊事件 (工具列中,需要此邏輯,如放大縮小)
			            else  {
			                listItem.checked = true
			                pageSig(idx)
			            }
			        }
		        //所有的子Item互斥
		        else {
		            listItem.checked = false
		        }
		        listItem.oldChecked = listItem.checked
		    }
}
	...
          MouseArea {
		      ...
              onClicked: {
                  getListIndex(index)
              }
}

6.4 原始碼

main.qml(洗掉不必要檔案)

import QtQuick 2.12
import QtQuick.Controls 2.5
import QtQuick.Window 2.12

//import "qrc:/qml/slider/SlidierMain.qml"

Window {
    visible:                        true
    width:                          480
    height:                         360
    title:                          qsTr("Repeater選單/工具列")
    minimumWidth:                   450
    minimumHeight:                  240
    property int pageIndex:         3

    //三個圖片界面 + 主界面:
    Item {
        id: page
        height:                 parent.height
        anchors.left:           parent.left
        anchors.leftMargin:     40
        anchors.right:          parent.right
        //miantPage
        Text {
            id:                 mainPage
            anchors.centerIn:   parent
            text:               "我是主頁"
            font.pointSize:     30
            font.bold:          true
            visible:            (pageIndex != 0) ||  (pageIndex != 1) ||  (pageIndex != 2)
        }
        //firstPage
        Image {
            id:                 firstPage
            anchors.fill:       parent
            smooth:             true
            mipmap:             true
            antialiasing:       true
            fillMode:           Image.PreserveAspectFit
            sourceSize.height:  height
            source:             "/images/code"
            visible:            pageIndex == 0

        }
        //secondPage
        Image {
            id:                 secondPage
            ...
            source:             "/images/working"
            visible:            pageIndex == 1
        }
        //thirdPage
        Image {
            id:                 thirdPage
            ...
            source:             "/images/focus"
            visible:            pageIndex == 2
        }
    }
    
    Rectangle {
        id:                     rectMenu
        width:                  40
        height:                 parent.height
        anchors.left:           parent.left
        anchors.top:            parent.top
        color:                  "gray"
        border.color:           "black"
        border.width:           2
    }

    RepeaterMenu {
        id:                     repeaterMenu
        anchors.fill:           rectMenu
        maxWidth:               rectMenu.width
        maxHeight:              rectMenu.height
        listMode: [
            {
                name:           qsTr("我是目錄1"),
                iconSource:     "/images/1.png",
            },
            {
                name:           qsTr("我是目錄2"),
                iconSource:     "/images/2.png",
            },
            {
                name:           qsTr("我是目錄3"),
                iconSource:     "/images/3.png",
            }
        ]
        ///--信號連接器
        Connections {
            target:             repeaterMenu
            onPageSig : {
                pageIndex = idx //idx為pageSig信號的輸入引數
            }
        }
    }
}

RepeaterMenu.qml(洗掉不重要代碼)

import QtQuick.Layouts  1.2
import QtPositioning    5.2
import QtQuick 2.7
import QtQuick.Controls 2.0
import QtGraphicalEffects 1.2

Item {
    id:                 menu
    visible:            true

    property real       maxHeight           ///< Maximum height for control, determines whether text is hidden to make control shorter
    property real       maxWidth
    property alias      listMode:            _repeater.model

    signal getListIndex(int idx);
    signal pageSig(int idx);

    Column {         //改為Row RowLoyout等都行
        id:                             rowItem
        ...
        spacing:                        20
        Repeater {
            id:                         _repeater
            anchors.left:               parent.left
            delegate:                   listDelegate
        }
    }

    Component{
        id:                     listDelegate
        Rectangle {
            id:                 listItem
            property bool checked: false
            property bool oldChecked: false
            property int  clickCnt: 0

            width:                  innerImage.width
            height:                 innerImage.height
            color:                  Qt.rgba(0,0,0,0)  //無色
            opacity:                0.8               //透明度

            Connections{
                target:             menu
                onGetListIndex: {
                    //idx: click item ---- index: every item
                    if(idx === index ) {
                        //與前一次互斥事件, 大部分目錄都是此邏輯
                        if(idx!==3) {
                            if(!listItem.oldChecked) {
                                listItem.checked = true
                                pageSig(idx)
                            }
                            else {
                                listItem.checked = false
                                pageSig(9)      //關閉此目錄(回到主頁)/工具
                            }
                        }
                        //可添加:連續點擊事件 (工具列中,需要此邏輯,如放大縮小)
                        else  {
                            listItem.checked = true
                            pageSig(idx)
                        }
                    }
                    //所有的子Item互斥
                    else {
                        listItem.checked = false
                    }
                    listItem.oldChecked = listItem.checked
                }
            }

            //水平線性漸變
            LinearGradient
            {
                id:                      innerImage
                ...
                source: Image {
                    source:             modelData.iconSource
                }
                gradient: Gradient {
                    ...
            }

            Rectangle {
                id:                     innerRect
                ...
                color:                  "green"//Qt.rgba(0,0,0,0)
                border.color:           "black"
                
                Text {
                    id:                     _label
                    ...
                    text:                   modelData.name
                    font.family:            "Microsoft Yahei" //友情提醒:商業用途會收費的
                    font.pointSize:         15
                    color:                  "blue"
                }
            }

            MouseArea {
                anchors.fill: innerImage
                hoverEnabled: true
                onEntered: {
                    innerRect.visible = true
                }
                onExited: {
                    innerRect.visible = false
                }
                onClicked: {
                    getListIndex(index)
                }
            }
        }
    }
}

7. 總結

本文一共介紹了六種選單/目錄/工具列,各有優缺點,越是集成高的如TabBar、ToolBar ,就更方便使用,但不靈活,這個時候就可以考慮控制元件的定制呢, 上述對自己所使用過的目錄的總結,也是對使用過的控制元件的一些歸納,顏色配色還不夠舒服,原始碼稍長,還請見諒~

原始碼請點擊這里,如果沒有積分,各位小伙伴們關注后,可以在留個郵箱,看到的話會第一時間發過來哦!!!

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/210429.html

標籤:其他

上一篇:培訓機構出來,四面阿里淘系后端,最后成功拿到了offer。

下一篇:我要偷偷的學Python,然后驚呆所有人(第十天)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • vue移動端上拉加載

    可能做得過于簡單或者比較low,請各位大佬留情,一起探討技術 ......

    uj5u.com 2020-09-10 04:38:07 more
  • 優美網站首頁,頂部多層導航

    一個個人用的瀏覽器首頁,可以把一下常用的網站放在這里,平常打開會比較方便。 第一步,HTML代碼 <script src=https://www.cnblogs.com/szharf/p/"js/jquery-3.4.1.min.js"></script> <div id="navigate"> <ul> <li class="labels labels_1"> ......

    uj5u.com 2020-09-10 04:38:47 more
  • 頁面為要加<!DOCTYPE html>

    最近因為寫一個js函式,需要用到$(window).height(); 由于手寫demo的時候,過于自信,其實對前端方面的認識也不夠體系,用文本檔案直接敲出來的html代碼,第一行沒有加上<!DOCTYPE html> 導致了$(window).height();的結果直接是整個document的高 ......

    uj5u.com 2020-09-10 04:38:52 more
  • WordPress網站程式手動升級要做好資料備份

    WordPress博客網站程式在進行升級前,必須要做好網站資料的備份,這個問題良家佐言是遇見過的;在剛開始接觸WordPress博客程式的時候,因為升級問題和博客網站的修改的一些嘗試,良家佐言是吃盡了苦頭。因為購買的是西部數碼的空間和域名,每當佐言把自己的WordPress博客網站搞到一塌糊涂的時候 ......

    uj5u.com 2020-09-10 04:39:30 more
  • WordPress程式不能升級為5.4.2版本的原因

    WordPress是一款個人博客系統,受到英文博客愛好者和中文博客愛好者的追捧,并逐步演化成一款內容管理系統軟體;它是使用PHP語言和MySQL資料庫開發的,用戶可以在支持PHP和MySQL資料庫的服務器上使用自己的博客。每一次WordPress程式的更新,就會牽動無數WordPress愛好者的心, ......

    uj5u.com 2020-09-10 04:39:49 more
  • 使用CSS3的偽元素進行首字母下沉和首行改變樣式

    網頁中常見的一種效果,首字改變樣式或者首行改變樣式,效果如下圖。 代碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, ......

    uj5u.com 2020-09-10 04:40:09 more
  • 關于a標簽的講解

    什么是a標簽? <a> 標簽定義超鏈接,用于從一個頁面鏈接到另一個頁面。 <a> 元素最重要的屬性是 href 屬性,它指定鏈接的目標。 a標簽的語法格式:<a href=https://www.cnblogs.com/summerxbc/p/"指定要跳轉的目標界面的鏈接">需要展示給用戶看見的內容</a> a標簽 在所有瀏覽器中,鏈接的默認外觀如下: 未被訪問的鏈接帶 ......

    uj5u.com 2020-09-10 04:40:11 more
  • 前端輪播圖

    在需要輪播的頁面是引入swiper.min.js和swiper.min.css swiper.min.js地址: 鏈接:https://pan.baidu.com/s/15Uh516YHa4CV3X-RyjEIWw 提取碼:4aks swiper.min.css地址 鏈接:https://pan.b ......

    uj5u.com 2020-09-10 04:40:13 more
  • 如何設定html中的背景圖片(全屏顯示,且不拉伸)

    1 <style>2 body{background-image:url(https://uploadbeta.com/api/pictures/random/?key=BingEverydayWallpaperPicture); 3 background-size:cover;background ......

    uj5u.com 2020-09-10 04:40:16 more
  • Java學習——HTML詳解(上)

    HTML詳解 初識HTML Hyper Text Markup Language(超文本標記語言) 1 <!--DOCTYPE:告訴瀏覽器我們要使用什么規范--> 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <!--meta 描述性的標簽,描述一些 ......

    uj5u.com 2020-09-10 04:40:33 more
最新发布
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 07:59:23 more
  • 生產事故-走近科學之消失的JWT

    入職多年,面對生產環境,盡管都是小心翼翼,慎之又慎,還是難免捅出簍子。輕則滿頭大汗,面紅耳赤。重則系統停擺,損失資金。每一個生產事故的背后,都是寶貴的經驗和教訓,都是專案成員的血淚史。為了更好地防范和遏制今后的各類事故,特開此專題,長期更新和記錄大大小小的各類事故。有些是親身經歷,有些是經人耳傳口授 ......

    uj5u.com 2023-04-18 07:55:04 more
  • 記錄--Canvas實作打飛字游戲

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 打開游戲界面,看到一個畫面簡潔、卻又富有挑戰性的游戲。螢屏上,有一個白色的矩形框,里面不斷下落著各種單詞,而我需要迅速地輸入這些單詞。如果我輸入的單詞與螢屏上的單詞匹配,那么我就可以獲得得分;如果我輸入的單詞錯誤或者時間過長,那么我就會輸 ......

    uj5u.com 2023-04-04 08:35:30 more
  • 了解 HTTP 看這一篇就夠

    在學習網路之前,了解它的歷史能夠幫助我們明白為何它會發展為如今這個樣子,引發探究網路的興趣。下面的這張圖片就展示了“互聯網”誕生至今的發展歷程。 ......

    uj5u.com 2023-03-16 11:00:15 more
  • 藍牙-低功耗中心設備

    //11.開啟藍牙配接器 openBluetoothAdapter //21.開始搜索藍牙設備 startBluetoothDevicesDiscovery //31.開啟監聽搜索藍牙設備 onBluetoothDeviceFound //30.停止監聽搜索藍牙設備 offBluetoothDevi ......

    uj5u.com 2023-03-15 09:06:45 more
  • canvas畫板(滑鼠和觸摸)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>canves</title> <style> #canvas { cursor:url(../images/pen.png),crosshair; } #canvasdiv{ bo ......

    uj5u.com 2023-02-15 08:56:31 more
  • 手機端H5 實作自定義拍照界面

    手機端 H5 實作自定義拍照界面也可以使用 MediaDevices API 和 <video> 標簽來實作,和在桌面端做法基本一致。 首先,使用 MediaDevices.getUserMedia() 方法獲取攝像頭媒體流,并將其傳遞給 <video> 標簽進行渲染。 接著,使用 HTML 的 < ......

    uj5u.com 2023-01-12 07:58:22 more
  • 記錄--短視頻滑動播放在 H5 下的實作

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 短視頻已經無數不在了,但是主體還是使用 app 來承載的。本文講述 H5 如何實作 app 的視頻滑動體驗。 無聲勝有聲,一圖頂百辯,且看下圖: 網址鏈接(需在微信或者手Q中瀏覽) 從上圖可以看到,我們主要實作的功能也是本文要講解的有: ......

    uj5u.com 2023-01-04 07:29:05 more
  • 一文讀懂 HTTP/1 HTTP/2 HTTP/3

    從 1989 年萬維網(www)誕生,HTTP(HyperText Transfer Protocol)經歷了眾多版本迭代,WebSocket 也在期間萌芽。1991 年 HTTP0.9 被發明。1996 年出現了 HTTP1.0。2015 年 HTTP2 正式發布。2020 年 HTTP3 或能正... ......

    uj5u.com 2022-12-24 06:56:02 more
  • 【HTML基礎篇002】HTML之form表單超詳解

    ??一、form表單是什么

    ??二、form表單的屬性

    ??三、input中的各種Type屬性值

    ??四、標簽 ......

    uj5u.com 2022-12-18 07:17:06 more