QML学习笔记【04】:常用控件

news2024/9/23 15:29:08

1 Repeater与model

Window {
    width: 640; height: 480
    visible: true
    title: qsTr("Hello World")
    Column{
        id: col
        spacing: 30
        Repeater{
            model: 3 //model控制了所有的数据,这里定义了Button的数量
            Button{
                width: 100; height: 50
                text: "btn" + index
            }
        }
    }
}

2 ListView与ListModel、ObjectModel、XmlListModel、FolderListModel

model用于定义数据,delegate用于控制每一项数据如何绘制

(1)ListView 与数值、list类型、ListModel类型model配合使用

import QtQuick 2.0
import QtQuick.Controls 2.0

ListView {
    width: 180; height: 200
    spacing: 10 //控制两个项之间的距离
    
    //1、model控制了所有的数据
//    model: 3 //数字类型
//    model:["btn1", "btn2", "btn3"] //list类型
    model: ListModel { 
         ListElement { name: "Bill Smith"; number: "555 3264"}
         ListElement { name: "John Brown"; number: "555 8426"}
         ListElement { name: "Sam Wise"; number: "555 0473" }
     }
    //2、delegate控制了每一项数据如何绘制的
    delegate: Button {
//        text: index
//        text: modelData //model类型为list时,要获取list数据可以用modelData获取
        text: name + " " + number//model类型为ListModel时,可直接使用ListModel中的自定义数据
    }
 }

(2)ListView与ObjectModel 类型model配合使用 

//5、ListView扩展,实现SwipeView界面切换的效果
Window {
    id: root
    width: 640; height: 480
    visible: true
    title: qsTr("ListView(实现SwipeView界面切换的效果)")

    //左侧的按钮
    Button{
        id: btn
        width: 100; height: 480
    }

    //右侧切换的界面
    ObjectModel{
        id: myModel
        Rectangle{
            width: 540; height: 480
            color: "lightsteelblue"
        }
        Rectangle{
            width: 540; height: 480
            color: "grey"
        }
        Rectangle{
            width: 540; height: 480
            color: "black"
        }
    }
    ListView{
        model: myModel
        anchors.left: btn.right
        anchors.right: root.right
        width: 540; height: 480
        orientation: ListView.Horizontal //水平滑动
        snapMode: ListView.SnapOneItem //控制一次滑动一个item
        clip: true //超过当前范围后会被裁剪
    }
}

(3)ListView用于XmlListModel类型model配合使用,用于读取xml文件数据

//6、ListView扩展,使用XmlListModel
Window{
    id: root
    width: 640; height: 480
    visible: true
    title: qsTr("ListView扩展,使用XmlListModel")

    XmlListModel {
         id: xmlModel
         source: "/myXML.xml"  //xml资源文件路径
         query: "/rss/channel/item" //item节点路径
        //类似于ListEmelents效果
         XmlRole { name: "title"; query: "title/string()" }
         XmlRole { name: "pubDate"; query: "pubDate/string()" }
     }

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

(4)ListView用于FolderListModel类型model配合使用,用于读取文件目录

import QtQuick 2.0
import QtQuick.Window 2.0
import QtQuick.Controls 2.0
import QtQml.Models 2.12
import QtQuick.XmlListModel 2.12
import Qt.labs.folderlistmodel 2.12

//7、ListView扩展,使用FolderListModel
Window{
    id: root
    width: 640; height: 480
    visible: true
    title: qsTr("ListView扩展,使用FolderListModel")

    FolderListModel {
        id: folderModel
        //可以指定搜索的路径,路径前必须加上file:///
        folder: "file:///H:\\02-QML\\study_project\\03-control\\03-control"
        showDirs: false //显示目录下的文件夹,默认是true
        nameFilters: ["*"] //文件过滤器
        showDirsFirst: true //优先显示文件夹
    }

    ListView {
        width: 200; height: 400
        model: folderModel  //控制了数据
        delegate: Text {    //控制了每一项数据的绘制
            text: filePath + "/" + fileName
            font.pixelSize: 24
        }
    }
}

3 Popup

4 Combobox

5 ChartView

用于图表的绘制:

PieSeries:饼状图、

LineSeries:线状图、

AreaSeries与BarSeries:柱状图

6 SwipeView

用作滑动窗口切页的效果

7 ListView与自定义model配合使用

在项目开发中,常会用到 Repeater、ListView、TableView 等来进行多个重复控件的绘制,它们都用到了 model 属性来定义控件的数量和一些数据,但是实际项目中,往往数据都会很复杂,用model默认的 数值类型(model: 3)、List类型(model:["btn1", "btn2", "btn3"])、ListModel类型(model: ListModel {ListElement {}}) 不能满足所以需求,这时候就需要自定义model类型了

自定义方法如下:

1、创建一个Qt Item Model,继承自 QAbstractListModel

2、自定义数据类型和QML端的字符串跟C++端数据之间的枚举

3、添加 roleNames 函数, 映射C++端的枚举与QML端的字符串

4、实现数据的读取,QT会自动将QML端传来的字符串按照 roleNames 的映射关系映射成枚举role.然后可通过index来返回m_data中的role数据

mlistmodel.h

#ifndef MYLISTMODEL_H
#define MYLISTMODEL_H
#include <QAbstractListModel>

//1.1、定义自定义数据类型
class MyData
{
public:
    //定义有参构造函数,使用初始化列表的方式初始化变量
    MyData(QString s, int v):str(s),value(v) {}

    QString str;
    int value;
};

class MyListModel : public QAbstractListModel
{
    Q_OBJECT
public:
    //1.3、自定义枚举,映射QML端的字符串
    enum MyRoleName{
        Name = Qt::DisplayRole + 1,
        Value
    };

    explicit MyListModel(QObject *parent = nullptr);
    static MyListModel * getInstance(); //单列

    // Header:
    //几乎用不到
    QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
    
    // Basic functionality:
    //model的大小/长度 或者说是 元素的个数
    int rowCount(const QModelIndex &parent = QModelIndex()) const override;

    //3、现实数据读取,QT会自动将QML端传来的字符串按照roleNames的映射关系映射成枚举role.然后可通过index来返回m_data中的role数据
    //index是一个二维坐标,比如(0,0) 指示的是 (row index, column index)
    //对于ListModel而言,columnCount和column index是没有用的,所以实际使用的只有row index
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;

    //2、添加roleNames,它是继承自 QAbstractListModel
    //作用为 映射C++端的枚举与QML端的字符串
    QHash<int,QByteArray> roleNames() const override;

private:

    //1.2、创建自定义数据类型
    QList<MyData> m_data;
};
#endif // MYLISTMODEL_H

 mlistmodel.cpp

#include "mylistmodel.h"

MyListModel::MyListModel(QObject *parent)
    : QAbstractListModel(parent)
{
    m_data.append(MyData("zhangsan", 111));
    m_data.append(MyData("lisi", 111));
    m_data.append(MyData("wangwu", 111));
}

MyListModel *MyListModel::getInstance()
{
    static MyListModel *obj = new MyListModel;
    return obj;
}

QVariant MyListModel::headerData(int section, Qt::Orientation orientation, int role) const
{
    // FIXME: Implement me!
}
int MyListModel::rowCount(const QModelIndex &parent) const
{
    // For list models only the root node (an invalid parent) should return the list's size. For all
    // other (valid) parents, rowCount() should return 0 so that it does not become a tree model.
    if (parent.isValid())
        return 0;

    // FIXME: Implement me!
    m_data.count();
}

QVariant MyListModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid())
        return QVariant();
    if(role == MyRoleName::Name){
        return m_data[index.row()].str;
    }
    else if(role == MyRoleName::Value){
        return m_data[index.row()].value;
    }
    // FIXME: Implement me!
    return QVariant();
}


QHash<int, QByteArray> MyListModel::roleNames() const
{
    QHash<int, QByteArray> roles;

    //映射C++端的枚举与QML端的字符串
    //字符串是QML端使用,枚举是C++端判断
    roles.insert(MyRoleName::Name, "name");
    roles.insert(MyRoleName::Value, "value");

    return roles;
}

 5、在 engine.load 前注册模块

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QGuiApplication app(argc, argv);
    QQmlApplicationEngine engine;
    //注册MyListModel模块
    QQmlContext *context = engine.rootContext();
    //1、使用setContextProperty设置全局对象/上下文对象。作用域为全局
    //参数:模块名称,实例
    context->setContextProperty("MyListModel", MyListModel::getInstance());
    //2、使用qmlRegisterType注册模块,在qml中通过 import 模块名称 进行引用
    //这种方法测试不行
    //模块名称、主版本号、次版本号、类名称
//    qmlRegisterType<MyListModel>("MyModel", 1, 0, "MyListModel");

    const QUrl url(QStringLiteral("qrc:/main.qml"));
    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
                     &app, [url](QObject *obj, const QUrl &objUrl) {
        if (!obj && url == objUrl)
            QCoreApplication::exit(-1);
    }, Qt::QueuedConnection);
    engine.load(url);

    return app.exec();
}

6、QML中使用

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.12
//import MyModel 1.0

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

    ListView {
        width: 200; height: 300
        //1、model为list类型
//        model: ["zhangsan", "lisi", "wangwu"]
        //2、model为ListModel类型
//        model: ListModel{
//            ListElement{
//                name: "zhangsan"
//                value: 111
//            }
//            ListElement{
//                name: "lisi"
//                value: 222
//            }
//            ListElement{
//                name: "wangwu"
//                value: 333
//            }
//        }
        //3、model为自定义model类型
        model: MyListModel
        delegate: Text {
            id: txt
            text: name + " " + value
        }
    }
}

8 Timer

Window{
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")
    color: "white"
    property int time: 0

    Timer{
        id: timer
        interval: 1000
//        running: true
        repeat: true
        triggeredOnStart: true //在start的时候也会触发onTriggered
        onTriggered: { //超时回调函数
            time += 1 //更新Text的内容
        }
    }
    Text {
        id: txt
        text: time
        font.pixelSize: 68
        anchors.centerIn: parent
    }

    Button{
        id: startbtn
        text: "start"
        onClicked: {
            timer.start()
        }
    }
    Button{
        id: stopbtn
        text: "stop"
        anchors.left: startbtn.right
        anchors.leftMargin: 30
        onClicked: {
            timer.stop()
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/132283.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

整数划分——完全背包的变形

整数划分——完全背包的变形一、题目二、思路分析1、状态转移方程&#xff08;1&#xff09;状态表示&#xff08;2&#xff09;方程书写2、循环与初始化&#xff08;1&#xff09;循环&#xff08;2&#xff09;初始化三、代码一、题目 二、思路分析 这道题这么看的话还是比较…

Docsify使用之Markdown语法

Docsify使用过程中的排版&#xff0c;他是基于Markdown语法的。我们来看一下使用的常用语法&#xff1a; 字体加粗&#xff1a; 在需要加粗的文字前后各加两个** 具体格式如下 **加粗内容** 在需要加粗的文字前后各加一个* 具体格式如下 *倾斜内容* 在需要加粗并且倾斜的…

缅怀2022,展望2023

个人主页&#xff1a;董哥聊技术我是董哥&#xff0c;嵌入式领域新星创作者创作理念&#xff1a;专注分享高质量嵌入式文章&#xff0c;让大家读有所得&#xff01;文章目录1、缘起2、收获3、憧憬不知不觉&#xff0c;2022已然到了最后一天&#xff0c;同时也是我技术创作一周年…

2.脚手架和逆向工程-使用renren开源

1.脚手架工程 脚手架工程提供了业务模块通用的类&#xff0c;比如返回结果封装、异常封装、分页工具类等 比较好用脚手架工程如renren-fast 备份地址 gitgithub.com:nome1024/renren-fast.git 2.逆向工程——使用renren-generator生成代码 逆向工程的作用是根据数据库快速生…

2022年仪器仪表行业研究报

第一章 行业概况 仪器仪表是用以检出、测量、观察、计算各种物理量、物质成分、物性参数等的器具或设备。真空检漏仪、压力表、测长仪、显微镜、乘法器等均属于仪器仪表。仪器仪表是人们对客观世界的各种信息进行测量、采集、分析与控制的手段和设备&#xff0c;是人类了解世界…

MySQL之表的修改和约束条件的添加

修改表中的数据&#xff1a;update[DML] 语法格式&#xff1a; update 表名 set 字段名1值1&#xff0c;字段名2值2&#xff0c;字段名3值3......where 条件;注意&#xff1a;没有条件限制会导致所有数据全部更新 举例&#xff1a; - 将id号为10的学生的姓名改变为"jas…

【自学Python】解释型程序与编译型程序

解释型程序与编译型程序 解释型程序与编译型程序教程 高级语言所编制的程序不能直接被计算机识别&#xff0c;必须经过转换才能被执行&#xff0c;按转换方式可将它们分为两类&#xff1a;解释型程序与编译型程序。 解释型程序 执行方式类似于我们日常生活中的 “同声翻译”…

Vue--》实现todo-list组件的封装与使用

目录 项目结构 创建todolist组件 创建todoinput组件 创建todobutton组件 项目结构 今天用 vite 脚手架搭建一个 vue3 的小案例&#xff0c;vite的搭建过程参考&#xff1a;vite的搭建 。其项目结构组件构成如下&#xff1a;注意&#xff1a;因为使用的是 vite 框架&#x…

51单片机GMS短信自动存取快递柜

实践制作DIY- GC0103-直流电机PID速度控制 一、功能说明&#xff1a; 基于51单片机设计-GMS短信自动存取快递柜 功能介绍&#xff1a; STC89C52RC最小系统板0.96寸OLED显示器DY-SV17F串口语音播报模块4*4矩阵键盘GSM短信模块4路舵机&#xff08;模拟4个柜子&#xff09; ***…

再学C语言21:循环控制语句——do while循环

一、其他赋值运算符 除了最基本的赋值运算符&#xff0c;C还有多个赋值运算符 a b等于a a ba - b等于a a - ba * b等于a a * ba / b等于a a / ba % b等于a a % b 这些赋值运算符的优先级与赋值运算符同样低 运算符优先级&#xff1a;赋值运算符 < 关系运算符 <…

《C++程序设计原理与实践》笔记 第9章 类相关的技术细节

在本章中&#xff0c;我们继续关注主要的程序设计工具——C语言。本章主要介绍与用户自定义类型&#xff08;即类和枚举&#xff09;相关的语言技术细节。这些语言特性大部分是以逐步改进一个Date类型的方式来介绍的。采用这种方式&#xff0c;我们还可以顺便介绍一些有用的类设…

数据结构与算法_五大算法之分治算法

这篇笔记记录分治算法的思想和两道leetcode题。 分治算法思想&#xff1a; 规模为n的原问题的解无法直接求出&#xff0c;进行问题规模缩减&#xff0c;划分子问题&#xff0c;子问题相互独立而且和原问题解的性质是相同的&#xff0c;只是问题规模缩小了。递归地缩小问题规模…

用Python记录一场2023的烟花

弹指间&#xff0c;2023已经到来&#xff0c;新的一年&#xff0c;祝大家新年快乐&#xff0c;阖家幸福呀~~~ 好吧&#xff0c;进入正题&#xff0c;2023的到来&#xff0c;肯定少不了烟花吧&#xff08;外面不让放炮&#xff0c;那咱们就用python放炮【DOGE】&#xff09; 首…

JSON Web Tokens(JWT)简单使用

文章目录什么是JWT&#xff1f;JWD对字符串进行Base64加密JWT加密字符串解释JWT使用场景jwt 特点JWT token在线解密什么是JWT&#xff1f; JWT&#xff08;json web token&#xff09;&#xff0c;它并不是一个具体的技术实现&#xff0c;而更像是一种标准。 JWT规定了数据传输…

Flink系列Table API和SQL之:动态表、持续查询、将流转换成动态表、更新查询、追加查询、将动态表转换为流、更新插入流(Upsert)

Flink系列Table API和SQL之&#xff1a;动态表、持续查询、将流转换成动态表、更新查询、追加查询、将动态表转换为流、更新插入流一、表和流的转换二、动态表三、持续查询四、将流转换成动态表五、更新查询六、追加查询七、将动态表转换为流八、更新插入流(Upsert)一、表和流的…

综合能源系统电压稳定研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【锟斤拷�⊠是怎样炼成的】——两分钟帮你彻底弄懂计算机的编码原理

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; &#x1f33b;&#x1f33b;&#x1f33b;Hello&#xff0c;大家好&#xff0c;我是天寒雨落&#xff0c;一名有趣的博主&#xff0c;小白一枚&#xff0c;多多关照&#x1f61c;&#x1f61c…

解决vue-cli项目打包出现空白页和路径错误的问题

今天为大家分享一篇解决vue-cli(&#xff08;vue-cli2.x版本&#xff09;项目打包出现空白页和路径错误的问题。具有很好的参考价值。希望对大家有所帮助。 vue-cli项目打包&#xff1a; 1. 命令行输入&#xff1a;npm run build 打包出来后项目中就会多了一个文件夹dist&am…

k8s1.23.15版本二进制部署/扩容及高可用架构详解

前言 众所周知&#xff0c;kubernetes在2020年的1.20版本时就提出要移除docker。这次官方消息表明在1.24版本中彻底移除了dockershim&#xff0c;即移除docker。但是在1.24之前的版本中还是可以正常使用docker的。考虑到可能并不是所有项目环境都紧跟新版换掉了docker&#xff…

五、树和二叉树

一、定义及基本术语 详见书本P111~113 二叉树不是树的特殊情况&#xff0c;它们是两个概念&#xff0c;但有关树的基本术语对二叉树都适用。 二叉树的子树一定要区分左子树还是右子树&#xff0c;即使只有一棵子树也一定要说明是左子树还是右子树&#xff0c;树只有一个孩子的…