QT之QML从入门到精通(第五章)

ListView控件

MyListView.qml(基础用法)

import QtQuick 2.0
import QtQuick.Controls 2.12

ListView{

    width: 180;height: 200
//    model: 3 //数字  或者list 方式一
//    model: ["Button","test","test333"]  方式二
    model: ListModel{//ListModel自定义模型 方式三
        ListElement{name:"Button" ;number:"222"}  // 可以自己随意加元素
        ListElement{name:"test" ;number:"test2222"}
    }
    spacing: 10 //设置每一项之间的间距
    delegate: Button {  //控制了每一项数据是怎么绘制的
//        text: index+1   方式一
//        text:modelData 方式二
          text:name +": " + number   //方式三

//        width: 100;height: 80
//        background: Rectangle{
//            anchors.fill: parent
//            color: "black"
//        }
    }

}

main.qml

import QtQuick 2.12 //2.15
import QtQuick.Window 2.12 //2.15
import QtQuick.Controls 2.12 //可以引入别的控件
import Qt.labs.folderlistmodel 2.12
import Qt.labs.platform 1.0 as Platform
//import QtQuick.Layouts 1.15

Window{
    width:800
    height:600
    title: "Mouse Area"
    visible :true

    MyListView{

    }


}


这里要注意,要是代码修改后运行发现没有变化,需要清除编译,在重新构建一边。

    MyListView.qml(高亮属性,点击切换)

import QtQuick 2.0
import QtQuick.Controls 2.12

ListView{
    id:list
    width: 180;height: 200
    model: ListModel{//ListModel自定义模型 方式三
        ListElement{name:"Button" ;number:"222"}  // 可以自己随意加元素
        ListElement{name:"test" ;number:"test2222"}
    }
    spacing: 20 //设置每一项之间的间距
    highlight:Rectangle{color:"lightsteelblue" ;radius: 5 } //设置高亮

    delegate: Rectangle {  //控制了每一项数据是怎么绘制的
        color: "transparent"
        width: list.width; height: 50 //需要一起设置
        Text {
            id:  contatInfo
            objectName: "rect " + index
            text:name +": " + number   //方式三
        }
        MouseArea{
            anchors.fill: parent
            onClicked: {
                console.log(contatInfo.objectName)
                console.log(currentIndex) //高亮选项就是currentIndex默认0
                currentIndex = index  //index是你点击的index赋值后可以切换
            }
        }

    }

}

MyListView.qml(在头部添加控件)

import QtQuick 2.0
import QtQuick.Controls 2.12

Rectangle{

    width: 330
    height: 200
    border.color: "black"

ListView{
    y:20

    id:list
    header:Rectangle{  //头部
        width: 330 ;height: 20;color: "blue"
    }
    footer: Rectangle{  //底部
        width: 330 ;height: 20;color: "green"

    }

    width: 180;height: 200
    model: ListModel{//ListModel自定义模型 方式三
        ListElement{name:"Button" ;number:"222"}  // 可以自己随意加元素
        ListElement{name:"test" ;number:"test2222"}
    }
    spacing: 20 //设置每一项之间的间距
    highlight:Rectangle{color:"lightsteelblue" ;radius: 5 } //设置高亮

    delegate: Rectangle {  //控制了每一项数据是怎么绘制的
        color: "transparent"
        width: list.width; height: 50 //需要一起设置
        Text {
            id:  contatInfo
            objectName: "rect " + index
            text:name +": " + number   //方式三
        }
        MouseArea{
            anchors.fill: parent
            onClicked: {
                console.log(contatInfo.objectName)
                console.log(currentIndex) //高亮选项就是currentIndex默认0
                currentIndex = index  //index是你点击的index赋值后可以切换
            }
        }

    }

}

}

MyListView.qml(section属性讲解)

import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick 2.12 //2.15
import QtQuick.Window 2.12 //2.15
import QtQuick.Controls 2.12 //可以引入别的控件
import Qt.labs.folderlistmodel 2.12
import Qt.labs.platform 1.0 as Platform


Rectangle{

    width: 330
    height: 200
    border.color: "black"

    // The delegate for each section header
    Component {
        id: sectionHeading
        Rectangle {
            width: container.width
            height: childrenRect.height
            color: "lightsteelblue"
            required property string section //由于没用required所以该示例无用
            Text {
                text: parent.section
                font.bold: true
                font.pixelSize: 20
            }
        }
    }

ListView{
    y:20

    id:list
    header:Rectangle{  //头部
        width: 330 ;height: 20;color: "blue"
    }
    footer: Rectangle{  //底部
        width: 330 ;height: 20;color: "green"

    }
    section.property: "size"
    section.criteria: ViewSection.FullString
    section.delegate: sectionHeading

    width: 180;height: 200
    model: ListModel{//ListModel自定义模型 方式三
        ListElement{name:"Button" ;number:"222" ;size:"small"}  // 可以自己随意加元素
        ListElement{name:"test" ;number:"test2222";size:"large"}
    }
    spacing: 20 //设置每一项之间的间距
    highlight:Rectangle{color:"lightsteelblue" ;radius: 5 } //设置高亮

    delegate: Rectangle {  //控制了每一项数据是怎么绘制的
        color: "transparent"
        width: list.width; height: 50 //需要一起设置
        Text {
            id:  contatInfo
            objectName: "rect " + index
            text:name +": " + number   //方式三
        }

        MouseArea{
            anchors.fill: parent
            onClicked: {
                console.log(contatInfo.objectName)
                console.log(currentIndex) //高亮选项就是currentIndex默认0
                currentIndex = index  //index是你点击的index赋值后可以切换
            }
        }

    }

}

}

ComboBox控件

MyComboBox.qml

import QtQuick 2.0
import QtQuick 2.12
import QtQuick.Controls 2.12

ComboBox {
//    model: 3 //
//    model: ["button","checkbox","popup"]
    model:ListModel{
        ListElement{text:"Button";}
        ListElement{text:"checkbox"}
        ListElement{text:"popup"}
    }
    editable: true //可以编辑下拉选项

    onAccepted: { //按下回车键触发
        if(find(editText) === -1){  // ===三个等号代表比较  ==等号是强制匹配
            model.append({text:editText}) // ListModel对象才有append属性,其他没有
        }
    }
    Component.onCompleted: {
        console.log(count ) // 获取总数
    }

}
import QtQuick 2.0
import QtQuick 2.12
import QtQuick.Controls 2.12

ComboBox {
    textRole:"text"
//    valueRole:"value" //2.12没有这个属性2.15可以试试
    displayText: currentText +" "+ currentIndex //可以制定显示的文本样式

//    model:ListModel{
//        ListElement{text:"Button";value:100}
//        ListElement{text:"checkbox";value:200 }
//        ListElement{text:"popup";value:300 }
//    }
    model: [
        {value:100,text:"111"},
        {value:200,text:"222"},
        {value:300,text:"333"}

    ]
    onCurrentTextChanged: {
        console.log("text: ",currentText)
    }
    onCurrentIndexChanged: {
        console.log("index: ",currentIndex)
    }
//    onCurrentValueChanged:{ //2.12没有这个属性2.15可以试试
//        console.log("value:",value)
//    }

    Component.onCompleted: {
        console.log(count ) // 获取总数
    }

}
import QtQuick 2.0
import QtQuick 2.12
import QtQuick.Controls 2.12

ComboBox {
    editable:true
    model:20
    validator:IntValidator{ //输入验证器
//        top:20
//        bottom: 0
//        regExp: /[0-9]{2}/  //我的当前版本没用正则匹配
    }

    onAcceptableInputChanged: {  //接收输入值改变信号
        console.log(acceptableInput) // 判断当前是否匹配  验证器正确性
    }


}

ComboBox自定义绘制

        

import QtQuick 2.0
import QtQuick 2.12
import QtQuick.Controls 2.12


ComboBox {
    id: control
    model: ["First", "Second", "Third"]
    property bool bIsPopupShowDown: true
    x:100;y:100
    delegate: ItemDelegate {  //针对model每一个项的具体绘制
        width: control.width
        contentItem: Text {
            text: modelData
            color: index%2?"red":"blue"  //下拉框每一个项为红色
            font: control.font
            elide: Text.ElideRight
            verticalAlignment: Text.AlignVCenter
        }
        highlighted: control.highlightedIndex === index
    }

//    indicator: Canvas { //右侧的下拉箭头绘制,使用画布,也可以之间使用image控件
//        id: canvas
//        x: control.width - width - control.rightPadding
//        y: control.topPadding + (control.availableHeight - height) / 2
//        width: 12
//        height: 8
//        contextType: "2d"

//        Connections {
//            target: control
//            function onPressedChanged() { canvas.requestPaint(); }
//        }

//        onPaint: {
//            context.reset();
//            context.moveTo(0, 0);
//            context.lineTo(width, 0);
//            context.lineTo(width / 2, height);
//            context.closePath();
//            context.fillStyle = control.pressed ? "#17a81a" : "#21be2b";
//            context.fill();
//        }
//    }

    contentItem: Text { //控制当前控件的显示内容
        leftPadding: 0
        rightPadding: control.indicator.width + control.spacing

        text: control.displayText
        font: control.font
        color: control.pressed ? "red" : "blue" //不安下是蓝色,按下红色
        verticalAlignment: Text.AlignVCenter
        elide: Text.ElideRight
    }

    background: Rectangle {  //设置背景,不会影响到文字颜色
        implicitWidth: 120
        implicitHeight: 40
        border.color: control.pressed ? "#17a81a" : "#21be2b"
        border.width: control.visualFocus ? 2 : 1
        radius: 2
    }

    popup: Popup {  //重中之重 popup之后必须是Popup控件 和delegate区别delegate绘制单个项目,popup是整个下拉控件
        y:bIsPopupShowDown?control.height + 10 :-control.height-10 //距离Combobox的间隙,+代表向下 -代表向上,可以用一个属性来控制
        width: control.width
        implicitHeight: contentItem.implicitHeight
        padding: 1

        contentItem: ListView {
            clip: true
            implicitHeight: contentHeight
            model: control.popup.visible ? control.delegateModel : null
            currentIndex: control.highlightedIndex

//            ScrollIndicator.vertical: ScrollIndicator { } //添加了滚动条,一般用下面这个
            ScrollBar.vertical: ScrollBar{
                policy: ScrollBar.AlwaysOn //设置政策:总是显示
            }
//            interactive: false //设置是否需要鼠标进行拖动,默认true
//            boundsBehavior: Flickable.StopAtBounds //设置不需要回弹效果
        }

        background: Rectangle {
            border.color: "red"
            radius: 2
        }
    }
}
import QtQuick 2.0
import QtQuick 2.12
import QtQuick.Controls 2.12
import QtGraphicalEffects 1.0 //可以设置阴影,效果

ComboBox {
    id: control
    model: ["First", "Second", "Third"]
    property bool bIsPopupShowDown: true
    x:100;y:100
    delegate: ItemDelegate {  //针对model每一个项的具体绘制
        width: control.width
        contentItem: Text {
            text: modelData
            color: index%2?"red":"blue"  //下拉框每一个项为红色
            font: control.font
            elide: Text.ElideRight
            verticalAlignment: Text.AlignVCenter
        }
        highlighted: control.highlightedIndex === index
    }

//    indicator: Canvas { //右侧的下拉箭头绘制,使用画布,也可以之间使用image控件
//        id: canvas
//        x: control.width - width - control.rightPadding
//        y: control.topPadding + (control.availableHeight - height) / 2
//        width: 12
//        height: 8
//        contextType: "2d"

//        Connections {
//            target: control
//            function onPressedChanged() { canvas.requestPaint(); }
//        }

//        onPaint: {
//            context.reset();
//            context.moveTo(0, 0);
//            context.lineTo(width, 0);
//            context.lineTo(width / 2, height);
//            context.closePath();
//            context.fillStyle = control.pressed ? "#17a81a" : "#21be2b";
//            context.fill();
//        }
//    }

    contentItem: Text { //控制当前控件的显示内容
        leftPadding: 0
        rightPadding: control.indicator.width + control.spacing

        text: control.displayText
        font: control.font
        color: control.pressed ? "red" : "blue" //不安下是蓝色,按下红色
        verticalAlignment: Text.AlignVCenter
        elide: Text.ElideRight
    }

    background: Rectangle {  //设置背景,不会影响到文字颜色
        implicitWidth: 120
        implicitHeight: 40
        border.color: control.pressed ? "#17a81a" : "#21be2b"
        border.width: control.visualFocus ? 2 : 1
        radius: 2
    }

    popup: Popup {  //重中之重 popup之后必须是Popup控件 和delegate区别delegate绘制单个项目,popup是整个下拉控件
        y:bIsPopupShowDown?control.height + 10 :-control.height-10 //距离Combobox的间隙,+代表向下 -代表向上,可以用一个属性来控制
        width: control.width
        implicitHeight: contentItem.implicitHeight
        padding: 1

        contentItem: ListView {
            clip: true
            implicitHeight: contentHeight
            model: control.popup.visible ? control.delegateModel : null
            currentIndex: control.highlightedIndex

//            ScrollIndicator.vertical: ScrollIndicator { } //添加了滚动条,一般用下面这个
            ScrollBar.vertical: ScrollBar{
                policy: ScrollBar.AlwaysOn //设置政策:总是显示
            }
//            interactive: false //设置是否需要鼠标进行拖动,默认true
//            boundsBehavior: Flickable.StopAtBounds //设置不需要回弹效果
        }

        background: Rectangle {
            border.color: "red"
            radius: 2
            layer.enabled: true
            layer.effect: DropShadow{ //影响  widget的QComboBox下拉框有阴影效果,qml需要在这里设置
                verticalOffset: 3 //纵向偏移
                radius: 8.0
                samples: 17
                color: "#80000000"

            }
        }
    }
}

focus相关FoucusScope

import QtQuick 2.12 //2.15
import QtQuick.Window 2.12 //2.15
import QtQuick.Controls 2.12 //可以引入别的控件
import Qt.labs.folderlistmodel 2.12
import Qt.labs.platform 1.0 as Platform
//import QtQuick.Layouts 1.15

Window{
    width:800
    height:600
    title: "Mouse Area"
    visible :true
    //focus使用
    Button{
        id:btn
        focus: false
//        focusPolicy: Qt.NoFocus //设置之后点击就获取不到焦点了
        width: 100;height: 40
        background: Rectangle{
            anchors.fill: parent
            border.color: btn.focus?"blue":"red"
        }
        onClicked: {
//            focus = !btn.focus
            console.log("focus:",focus)
        }
        onFocusReasonChanged: { //焦点改变原因
            console.log("focusReason:",focusReason)  //点击是0 tab键是1
            console.log("MouseFocusReason:", Qt.MouseFocusReason)  //点击是0
            console.log("TabFocusReason:",Qt.TabFocusReason)  // tab键是1

        }
        Component.onCompleted: {
            console.log("focusPolicy",focusPolicy) // 11
            console.log("Qt.StrongFocus",Qt.StrongFocus) // 11 点击的时候可以获取到焦点
        }
    }

}


import QtQuick 2.12 //2.15
import QtQuick.Window 2.12 //2.15
import QtQuick.Controls 2.12 //可以引入别的控件
import Qt.labs.folderlistmodel 2.12
import Qt.labs.platform 1.0 as Platform
//import QtQuick.Layouts 1.15

Window{
    width:800
    height:600
    title: "Mouse Area"
    visible :true
    //focusScope使用
    FocusScope{ //如果控件是focusScope的话两个控件都有焦点,具体焦点在哪里要看activateFocus,之前控件的Rectangle
        width: 300;height: 200
        id:rect
        Text {
            id: text
            focus: true //focus为true activateFocus也为true
            text: qsTr("rect  text:") +text.focus +"|" +text.activeFocus
            Component.onCompleted: {
//                console.log("text complete ") // 15版本有,12没用
            }
        }
        MouseArea{
            anchors.fill: parent
            onClicked: {
                text.activeFocus = true;
            }
        }
    }

    FocusScope{ //focusScope要使用activate focus
        y:250
        width: 300;height: 200
        id:rect1
        Text {
            id: text1
            focus: true
            text: qsTr("rect1 text:") +text1.focus +"|" +text1.activeFocus
            Component.onCompleted: {//此时text1先完成,text最后完成,所以焦点在text上
                console.log("text1 complete ")
            }
        }
        MouseArea{
            anchors.fill: parent
            onClicked: {
//                text1.activeFocus = true; // 15版本有,12没用
            }
        }
    }

}


ListView相关扩展

SwipeView

import QtQuick 2.12
import QtQuick.Window 2.12
import QtCharts 2.3
import QtQuick.Controls 2.12

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    SwipeView{ //类似于滑动窗体
        id:view
        currentIndex: 1  //第一页是0,然后下一页是1
        anchors.fill: parent
        Item{
            id:firstpage
            Rectangle{
                anchors.fill: parent
                color: "lightsteelblue"
            }
        }
        Item{
            id:secondpage
            Rectangle{
                anchors.fill: parent
                color: "grey"
            }
        }
    }
}

ObjectModel

import QtQuick 2.12
import QtQuick.Window 2.12
import QtCharts 2.3
import QtQuick.Controls 2.12
import QtQml.Models 2.12

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    Button{
        id:btn
        width: 200
        height: 480
//        z:1
    }

    ObjectModel{ // 用于填充数据的model
        id: mymodel
        Rectangle{
            width: 440
            height: 480
            color: "lightsteelblue"
        }
        Rectangle{
            width: 440
            height: 480
            color: "grey"
        }
        Rectangle{
            width: 440
            height: 480
            color: "red"
        }
    }

    ListView{
        anchors.left: btn.right
        anchors.right: parent.right
        height: 480
        orientation: ListView.Horizontal
        snapMode: ListView.SnapOneItem //实现每次滑动,都能滑动一个界面,12版本似乎设置之后界面滑动不了。todo
        clip:true //超出父控件不显示。
        model: mymodel
    }
}

XmlListModel

main.qml

import QtQuick 2.12
import QtQuick.Window 2.12
import QtCharts 2.3
import QtQuick.Controls 2.12
import QtQml.Models 2.12
import QtQuick.XmlListModel 2.12

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    XmlListModel {
        id: xmlModel
        source: "/myXml.xml" //这里不需要加":"冒号
//        source: "file:///C++/qml/qml_model/myXml.xml"
        query: "/rss/channel/item" //寻找xml的属性
        //ListElements
        XmlRole { name: "title"; query: "title/string()" }
        XmlRole { name: "pubDate"; query: "pubDate/string()" }
    }

    ListView {
        width: 180; height: 300
        model: xmlModel
        delegate: Text { text: title + ": " + pubDate }
    }

}

myxml.xml

<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
    <channel>
        <item>
            <title>A blog post</title>
            <pubDate>Sat, 07 Sep 2010 10:00:01 GMT</pubDate>
        </item>
        <item>
            <title>Another blog post</title>
            <pubDate>Sat, 07 Sep 2010 15:35:01 GMT</pubDate>
        </item>
    </channel>
</rss>

### 回答1: qt qml教程是一份关于Qt Quick技术的教学文档。Qt QMLQt框架中的一部分,用于开发跨平台的用户界面。它提供了一种声明性的方式来构建用户界面,使开发人员能够轻松地创建现代化、动态的应用程序。 qt qml教程PDF包含了基础知识和高级技巧,适合初学者和有经验的开发者。教程通常从介绍Qt QML的概念开始,然后逐步深入讲解如何编写QML代码以及如何在Qt应用程序中集成QML界面。 该教程通常涵盖以下主题: 1. QML语法和基本元素:介绍QML的基本语法、属性、信号和槽机制,以及如何使用QML中的元素构建用户界面。 2. 模型和视图:讲解如何使用Qt的模型和视图框架来管理和展示数据。 3. 动画和过渡效果:介绍如何使用QML的动画和过渡效果来创建流畅、吸引人的用户界面。 4. 响应式布局:讲解如何使用anchors和layouts来创建响应式的用户界面,以适应不同的屏幕尺寸和方向。 5. 与C++的交互:介绍如何在QML中与C++代码进行交互,以实现更复杂的功能和业务逻辑。 通过阅读qt qml教程PDF,开发人员可以快速掌握使用Qt QML开发用户界面的技巧,并能够构建出现代化、灵活和跨平台的应用程序。此外,Qt QML教程还提供了实际的示例代码和实操项目,可供开发者参考和练习。 ### 回答2: Qt qml 教程 PDF 是一份关于 Qt Quick Markup Language (QML)教程指南,提供了使用 QML 进行跨平台应用程序开发的详细步骤和示例代码。以下是该教程的一些特点: 1. 适用性广泛:Qt QML 是一种用于创建现代用户界面的语言,可用于开发跨平台的桌面应用程序、移动应用程序和嵌入式系统应用程序。 2. 官方指南:该教程Qt 官方提供,因此可以确保其准确性和更新性。它是一份全面的指南,旨在帮助开发人员快速上手 QML。 3. 详细说明:教程详细介绍了 QML 的基本语法、属性和信号的使用方法,以及如何创建可重用的组件和自定义对象。 4. 实例代码:教程中提供了大量的示例代码,涵盖了各种常见的 UI 元素和交互方式。这些示例代码可以帮助开发人员快速了解和应用 QML 的各种功能。 5. UI 设计:该教程还介绍了一些关于用户界面设计的最佳实践和技巧,帮助开发人员创建出美观、易用和可定制的界面。 6. 教学进度:教程按照逐步递增的方式组织,从简单的概念和技术开始,逐渐引入更复杂的概念和高级功能。 总而言之,Qt qml 教程 PDF 是一份全面的、由官方提供的有关 Qt QML教程指南,为开发人员提供了学习和了解 QML 的最佳途径。通过掌握这些知识,开发人员可以更高效地使用 Qt 创建强大且具有吸引力的用户界面。 ### 回答3: 有关于Qt QML教程的PDF是一种书籍或文档形式,用于指导和教授有关该技术的知识和技能。Qt QML是一种基于Qt框架的声明性编程语言,主要用于开发图形用户界面(GUI)和应用程序逻辑。这种教程PDF可以提供以下内容: 1. QML基础知识:教程PDF通常会介绍QML的基本语法、语义和数据类型,以便读者能够理解和编写QML代码。 2. QML元素和组件:教程PDF将介绍Qt提供的各种QML元素和组件,如文本框、按钮、菜单等,以及它们的属性和用法。 3. 控件布局和样式:教程PDF将详细介绍如何使用QML创建和布局GUI控件,并设置它们的样式和外观。 4. 信号与槽机制:教程PDF将解释QML中的信号和槽机制,以及如何使用它们实现不同组件之间的通信和交互。 5. 动画和过渡效果:教程PDF可能会讲解如何使用QML创建动画和过渡效果,以增强用户界面的交互性和视觉吸引力。 6. Qt Quick控件和场景图:教程PDF可能会介绍Qt Quick控件和场景图的概念和使用方法,以便读者能够使用这些高级特性进行复杂的GUI设计。 总的来说,Qt QML教程PDF可以作为学习和掌握Qt QML技术的参考资料,帮助读者了解和应用该技术,以开发高质量和可交互性强的GUI应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

only-lucky

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值