QML 快速上手3 - QuickControl2

news2024/11/25 21:18:32

目录

      • QuickControl2
        • 简介
        • 风格设置
        • control 配置文件
        • 图像浏览器案例
        • component 组件报错问题
        • StackView
        • SwipeView

QuickControl2


简介

quickcontrol 用于快速构建风格化的用户界面

它包括了以下几个预制的组件风格

  • Default QT 默认风格
  • Universal windows 桌面风格
  • Material 谷歌推出的 MaterialDesign 风格
  • Fusion
  • Imagine

风格设置

官方文档对于风格设置提供了两种方式,此处就采用其中的一种,即使用 QQuickStyle

首先在 pro 文件内,添加对应库
QT += quick quickcontrols2

之后来到 main.cpp 设置我们的整体风格
注意,风格必须在 qml 初始化前设置,且一旦设置则全局使用此风格,不可变换!

#include <QGuiApplication>
#include <QQmlApplicationEngine>

// 第一步,导入头文件
#include <QQuickStyle>


int main(int argc, char *argv[])
{
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif

    QGuiApplication app(argc, argv);

    // 第二步,应用风格
    // 这里使用了google的material风格
    QQuickStyle::setStyle("Material");

    ...

    return app.exec();
}

最后回到我们的 qml 主文件,写一段简单的代码测试一下风格

main.qml 代码清单

import QtQuick 2.12
import QtQuick.Controls 2.12

// 默认此处根组件应该是Window,我这里用了ApplicationWindow,效果是一致的
ApplicationWindow {
    visible: true
    width: 640
    height: 480

    // 创建一个列表,包含三个单选按钮
    Column {
        anchors.centerIn: parent
        RadioButton { text: qsTr("Small") }
        RadioButton { text: qsTr("Medium");  checked: true }
        RadioButton { text: qsTr("Large") }
    }
}

如下图展示效果,风格成功应用上去了!

在这里插入图片描述


control 配置文件

对于普通项目,为便于开发,我们可以额外新建一个配置文件用于管理当前应用的整体风格

在与 main.qml 同级的目录下新建配置文件 qtquickcontrols2.conf (必须是这个名字!)

填入下方配置

; This file can be edited to change the style of the application
; Read "Qt Quick Controls 2 Configuration File" for details:
; http://doc.qt.io/qt-5/qtquickcontrols2-configuration.html

; 配置全局风格为MaterialDesign2
[Controls]
Style=Material

图像浏览器案例

推荐风格选择 Fusion

功能很简单,添加菜单栏和工具栏,选择文件并打开;
主要关注点为 FileDialog 的使用

下面是 main.qml 的完整代码

import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Dialogs 1.2

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Image Viewer")

    // 顶部菜单栏
    menuBar: MenuBar {
        // 主菜单项
        Menu {
            title: qsTr("&File")
            // 子菜单项
            MenuItem {
                text: qsTr("&Open...")
                icon.name: "document-open"
                // 点击后触发对应FileDialog
                onTriggered: fileOpenDialog.open()
            }
        }

        Menu {
            title: qsTr("&Help")
            MenuItem {
                text: qsTr("&About...")
                onTriggered: aboutDialog.open()
            }
        }
    }

    // 顶部工具栏
    header: ToolBar {
        // 流式布局
        Flow {
            anchors.fill: parent
            // 工具项
            ToolButton {
                text: qsTr("Open")
                icon.name: "document-open"
                onClicked: fileOpenDialog.open()
            }
        }
    }

    // 设置背景颜色
    background: Rectangle {
        color: "darkGray"
    }

    // 图片显示组件
    Image {
        id: image
        anchors.fill: parent
        fillMode: Image.PreserveAspectFit
        asynchronous: true
    }

    // 打开文件对话框
    FileDialog {
        id: fileOpenDialog
        title: "Select an image file"
        folder: shortcuts.documents
        nameFilters: [
            "Image files (*.png *.jpeg *.jpg)",
        ]
        onAccepted: {
            image.source = fileOpenDialog.fileUrl
        }
    }

    // About对话框
    Dialog {
        id: aboutDialog
        title: qsTr("About")
        Label {
            anchors.fill: parent
            text: qsTr("QML Image Viewer\nA part of the QmlBook\nhttp://qmlbook.org")
            horizontalAlignment: Text.AlignHCenter
        }

        standardButtons: StandardButton.Ok
    }
}

运行结果

在这里插入图片描述


component 组件报错问题

当我们在需要使用 Component 定义一个组件时,通常会发现编辑器报错 Unknown component (M300)

解决方法很简单,点击编辑器菜单栏的 工具->QML/JS->重置代码模型 即可解决

在这里插入图片描述


StackView

StackView 可以实现多页面的堆栈管理,类似于 android 中的 view


下方代码实现效果:点击界面实现 push 和 pop 效果,并附带自定义界面切换效果

由于要使用动画过渡属性,故导入头文件时,control 需要使用 1.4 版本的 import QtQuick.Controls 1.4

简要介绍下方代码展示的主要内容及其对应含义:

  • initialItem 设置初始展示页面/组件
  • delegate 设置当新页面 push 或者被 pop 后的过渡动画
  • Component 组件,根据 id 被 stackview 使用

代码清单 main.qml

import QtQuick 2.12

// 请使用1.4版本
import QtQuick.Controls 1.4

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Image Viewer")

    StackView {
        id:sv
        anchors.fill: parent
        initialItem: mainView   // 设置初始页面

        // 设置页面push或pop后过渡动画
        // 动画设置中有两个可用变量:exitItem正在退出的元素;enterItem正在加入的元素;
        delegate: StackViewDelegate {
            // 当动画结束后,执行的对应方法
            function transitionFinished(properties)
            {
                properties.exitItem.x = 0
                properties.exitItem.rotation = 0
            }

            // push插入动画
            // 动画内容是:让当前组件从界面左侧移动走,然后自身再旋转360度
            pushTransition: StackViewTransition {
                // 顺序动画
                SequentialAnimation {
                    ScriptAction {
                        script: enterItem.rotation = 90
                    }
                    PropertyAnimation {
                        target: enterItem
                        property: "x"
                        from: enterItem.width
                        to: 0
                    }
                    PropertyAnimation {
                        target: enterItem
                        property: "rotation"
                        from: 90
                        to: 0
                    }
                }
                PropertyAnimation {
                    target: exitItem
                    property: "x"
                    from: 0
                    to: -exitItem.width
                }
            }

            // pop弹出动画
            // 动画内容:组件颜色渐变(非常实用,建议copy)
            popTransition: StackViewTransition {
                PropertyAnimation {
                    target: enterItem
                    property: "opacity"
                    from: 0
                    to: 1
                }
                PropertyAnimation {
                    target: exitItem
                    property: "opacity"
                    from: 1
                    to: 0
                }
            }
        }

        // 在stackview内部定义组件
        Component{
            id: mainView
            MouseArea{
                Rectangle{
                    id:mvRect
                    width: 100; height: 100
                    anchors.centerIn: parent
                    color: "orange"
                }
                onClicked: sv.push(sideView) // 点击后插入新页面
            }
        }

        // 定义的另一个组件
        Component{
            id: sideView
            MouseArea{
                Rectangle{
                    id:svRect
                    width: 100; height: 100
                    anchors.centerIn: parent
                    color: "deepskyblue"
                }
                onClicked: sv.pop() // 点击后弹出当前页面
            }
        }
    }
}

外部界面文件调用案例

注意,这里全部需要使用 import QtQuick.Controls 2.2

当然了,我们不可能把所有组件或者页面都以 Component 的形式写到 stackview 里面去,我们需要对其进行充分的解构

首先来看看主文件 main.qml

import QtQuick 2.12
import QtQuick.Controls 2.2

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Image Viewer")

    StackView {
        id:sv
        anchors.fill: parent
        // 加载外部组件HomeView
        initialItem: HomeView{}
    }
}

主页面代码清单 HomeView.qml

import QtQuick 2.0
import QtQuick.Controls 2.2

// Page表示页面
Page{
    title: qsTr("Home")

    MouseArea{
        anchors.fill: parent
        Label {

            text: qsTr("Home Screen")
        }
        // sv就是我们在主页面定义的stackview组件
        // push内部直接写同级目录下的qml文件,就可以插入了
        onClicked: sv.push("SideView.qml")
    }
}

副页面代码清单 SideView.qml

import QtQuick 2.0
import QtQuick.Controls 2.2

Page{
    title: qsTr("Home")

    Button{
        id:btn
        width: 120; height: 40
        anchors.centerIn: parent
        text: qsTr("点击返回home")
        onClicked: sv.pop() // 弹出
    }
}

这里就实现了调用外部 qml 文件来执行 push 和 pop 操作


SwipeView

类似前端中的轮播图

同样的,需要注意导入 import QtQuick.Controls 2.2

import QtQuick 2.9
import QtQuick.Controls 2.2

ApplicationWindow {

    // ...

    visible: true
    width: 640
    height: 480

    title: qsTr("Side-by-side")

    // 滑动视图
    SwipeView {
        id: swipeView
        anchors.fill: parent

        // 这是三个外部Page组件,用于组成视图
        Current {
        }

        UserStats {
        }

        TotalStats {
        }

        // ...

    }

    // 导航指示点
    PageIndicator {
        anchors.bottom: parent.bottom
        anchors.horizontalCenter: parent.horizontalCenter

        currentIndex: swipeView.currentIndex
        count: swipeView.count
    }

    // ...

}

我们随机找一个 swipeview 用到的外部组件,该组件很简单,根部是 Page,点击按钮返回第一个轮播项

代码清单 TotalStats.qml

import QtQuick 2.9
import QtQuick.Controls 2.2

// 和stackview一样,这里的外部组件依然需要使用page定义
Page {
    header: Label {
        text: qsTr("Community Stats")
        font.pixelSize: Qt.application.font.pixelSize * 2
        padding: 10
    }

    Column {
        anchors.centerIn: parent
        spacing: 10
        Label {
            anchors.horizontalCenter: parent.horizontalCenter
            text: qsTr("Community statistics")
        }
        Button {
            anchors.horizontalCenter: parent.horizontalCenter
            text: qsTr("Back")
            onClicked: swipeView.setCurrentIndex(0); // 点按钮回到第一个轮播项
        }
    }
}

由于内容比较简单,其余的两个轮播项就不一一展示代码了,反正也就是对应的使用 Page 组件即可!


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

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

相关文章

【FPGA】译码器、计数器及数码管显示

写在前面 万万没想到最后去了FPGA岗位&#xff0c;但是FPGA只在研一学过&#xff0c;确实忘得差不多了&#xff0c;因此从头把东西过亿边 这是某本书上的第一章节&#xff0c;感觉写的还是挺不错的&#xff0c;大概看了一下让我回想起很多知识&#xff0c;个人感觉比较适合学习…

《effective java》中关于解决构造函数/方法签名包含大量参数的解决方法

针对构造方法 重叠构造器模式 重叠构造器模式是一种编程中的反模式&#xff0c;指的是一个类有多个构造函数&#xff0c;每个构造函数都有不同数量的参数&#xff0c;从而可以根据不同的情况创建对象。这种方式会导致代码可读性和可维护性降低&#xff0c;因为构造函数过多&…

echarts柱状图数据太多设置滚动条

当你的项目中因数据量太大&#xff0c;导致柱状图数据全部叠在一起不便于看的时候&#xff0c;你们是怎么处理的&#xff1f; 大部分同学可能第一想法就是裁剪一部分数据&#xff0c;仅展示页面最大限度能够展示的数据&#xff0c;这确实是一个好办法&#xff0c;简单快速。但…

【分布式】分布式存储架构

文章目录 一、集中存储结构二、分布式存储2.1 、分布式存储的兴起2.2 、分布式存储的重要性2.3 、分布式存储的种类和比较 三、分布式理论浅析3.1 、一致性和可用性3.2 、数据分布哈希分布&#xff08; Swift &#xff09;顺序分布&#xff08; Bigtable &#xff09;CRUSH 分布…

模版方法模式在 JDK 及 spring 源码中的引用

模版方法模式 模板方法模式是一种行为设计模式&#xff0c; 它在超类中定义了一个算法的框架&#xff0c; 允许子类在不修改结构的情况下重写算法的特定步骤。 更多有关于模版方法模式的介绍详见&#xff1a;https://refactoringguru.cn/design-patterns/template-method 模版…

【4】tf实现神经网络模型

1 M-P神经元与神经网络前向传输 1.1 训练单个神经元 一个含有两个输入的神经元&#xff0c;指定一个输入x1x21,期望y能输出0.3。要求不断的输入x1x21,然后不断的训练权重w与偏置b值&#xff0c;训练一万次后&#xff0c;再次输入x1与x2输出y的值是否为0.3 # 导入TensorFlow库…

Linux 进程的睡眠和唤醒详解

概要 在Linux中&#xff0c;仅等待CPU时间的进程称为就绪进程&#xff0c;它们被放置在一个运行队列中&#xff0c;一个就绪进程的状 态标志位为 TASK_RUNNING。一旦一个运行中的进程时间片用完&#xff0c; Linux 内核的调度器会剥夺这个进程对CPU的控制权&#xff0c;并且从…

QGIS实现tiff影像栅格数据切片教程

实现栅格切片的方式有很多种,geoserver可以,qgis可以。自己写代码也可以,方式非常多。这篇文章介绍一下如何使用QGIS实现栅格切片。 首先我们要去下载一个qgis软件。下载地址如下: Welcome to the QGIS project! 随后我们打开软件,然后把要切片的栅格数据(tiff文件或者…

【Python 随练】逆序打印数字

题目&#xff1a; 给一个不多于 5 位的正整数&#xff0c;要求&#xff1a; 一、求它是几位数&#xff0c; 二、逆序打印出各位数字。 简介&#xff1a; 在本篇博客中&#xff0c;我们将解决一个关于正整数的问题。根据题目要求&#xff0c;我们需要判断给定的正整数是几位数…

你的仓库VS别人家的仓库,有什么不同?

导读&#xff1a; 近年来&#xff0c;随着新技术的蓬勃发展&#xff0c;企业的仓储管理水平大大提高&#xff0c;PDA、RFID、AGV、立体仓库、智能分拣线等各项新技术的应用层出不穷。然而&#xff0c;着眼于制造型企业&#xff0c;却发现仍有许多仓库处在比较原始、传统、粗放…

[译] DeepSpeed:所有人都能用的超大规模模型训练工具

我们于今年 2 月份发布了 DeepSpeed。这是一个开源深度学习训练优化库&#xff0c;其中包含的一个新的显存优化技术—— ZeRO&#xff08;零冗余优化器&#xff09;&#xff0c;通过扩大规模&#xff0c;提升速度&#xff0c;控制成本&#xff0c;提升可用性&#xff0c;极大地…

如何绘制甘特图?这个软件来帮你

最好用的甘特图软件是什么&#xff1f;先看效果&#xff0c;再放教程&#xff1a; 这是大家用的比较多的excel做出的甘特图&#xff1a; 这是我做的动态甘特图&#xff1a; 两种方法&#xff0c;分享给大家&#xff0c;按需选择即可。 第一种&#xff1a;用Excel制作甘特图 用…

nx安装cuda与cudnn

本文参考 Jetson xavier nx 安装CUDA10.2&#xff0c;和cudnn8.0_jetson安装cuda_三羊木木的博客-CSDN博客 NX安装cuda和cudnn_nx cuda_viatea的博客-CSDN博客 进入nx系统后&#xff0c;输入 sudo apt-get update 更新源 目录 1 cuda 2 cudnn 1 cuda sudo apt-get ins…

如何注册GitHub账号

一、注册GitHub账号 1、浏览器URL中输入地址: https://github.com/ 2、跳转至GitHub官网 3、点击右上角sign up按钮 4、填写注册信息 这个大意是产品更新时消息会通过邮箱发给你&#xff0c;根据需求选择y or n 5、验证账户 有的小伙伴会出现错误信息 Unable to verify you…

考研算法28天:优化版插入排序(折半插入排序)【二分,插入排序】

算法介绍 算法介绍就是说我们原先写的插入排序的这段代码 for(int i1;i<n;i){//开始向前遍历&#xff0c;如果发现前面的元素比//x大的话&#xff0c;就将前面的元素放到x的后面int x q[i],ji;while( j && q[j-1]>x ){q[j] q[j-1];j--;}q[j] x;}我们里面那层…

Redis_6.2.12下载及安装(CentOS7)

文章目录 Redis安装-CentOS71、下载地址2、下载安装流程2.1 安装依赖2.2 官网下载tar包2.3 进入解压目录并编译2.4 启动Redis服务2.5 全局使用redis-cli、redis-server2.6 防火墙开启6379端口查看防火墙状态以及启动、关闭配置firewalld-cmd开启防火墙端口 3、设置开机自动启动…

SpringBoot集成百度人脸识别

SpringBoot集成百度人脸识别 1、概述2、账号申请账号登录注册创建应用 3、抽取模板工具AipFacePropertiesAipFaceTemplateapplication.yml 4、测试 ​ 人脸识别&#xff08;Face Recognition&#xff09;基于图像或视频中的人脸检测、分析和比对技术&#xff0c;提供对您已获授…

如何使用 SpringBoot 创建 RESTful API

如何使用 SpringBoot 创建 RESTful API SpringBoot是一个流行的Java框架&#xff0c;它可以帮助我们快速构建应用程序。其中&#xff0c;创建RESTful API是SpringBoot的常见用例之一。在本文中&#xff0c;我们将介绍如何使用SpringBoot创建RESTful API。 什么是RESTful API …

不同业务场景、不同数据类型,对应亚马逊云科技不同数据库服务

小小的改变&#xff0c;标志一个新时代的全面开启&#xff0c;一个数据库的云原生时代。前不久&#xff0c;Gartner公布了一组数据&#xff0c;引起了不小的讨论度。在2022年全球数据库管理系统的市场份额排名中&#xff0c;作为纯云厂商的亚马逊云科技&#xff0c;超越了老牌传…

电脑如何录屏?3个方法教您win10电脑怎么录屏!

案例&#xff1a;有时手机录屏满足不了我的录制需求&#xff0c;我需要在电脑上录屏&#xff0c;但我对电脑不是特别熟悉&#xff0c;不知道如何在电脑上录屏。 很多小伙伴想在电脑上录制视频&#xff0c;但又不知道如何操作。win10电脑录屏怎么录&#xff1f;有没有简单且详细…