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

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

2020-11-12 07:25:12 其他

文章目錄

  • 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/qita/211610.html

標籤:其他

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

下一篇:英文文獻調研方法綜述

標籤雲
其他(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)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more