QML Book 学习基础5(An Image Viewer)

news2025/1/15 13:15:42

目录

桌面版(win端)

移动端


下面我们用更有挑战性例子来使用Qt控件,将创建一个简单的图像查看器。

桌面版(win端)

程序主要由四个主要区域组成,如下所示。菜单栏、工具栏和状态栏,通常由控件的实例填充,而内容区域是窗口子项所在的位置。

 

原书作者(应该创建Qt Quick项目,但是不影响我们使用Qt Quick 2 UI项目)

由于我们面向桌面,因此我们强制使用 Fusion 样式。这可以通过配置文件、环境变量、命令行参数或在C++代码中以编程方式完成。我们采用后一种方式,将以下行添加到 :main.cpp

QQuickStyle::setStyle("Fusion");

 

import QtQuick 2.12
import QtQuick.Window 2.12
import Qt.labs.platform 1.0
import QtQuick.Dialogs 1.0
import QtQuick.Controls 2.4
import QtQuick.Controls.Material 2.12

ApplicationWindow
{
    visible: true
    id:window
    width: 640
    height: 480
    background: Rectangle{color:"darkGray"}
    //创建一个ToolBar,当点击的时候会相应咱们创建的对话框打开
    header:ToolBar
    {
        anchors.fill:parent
        ToolButton
        {
            text: qsTr("open")
            icon.name: "open pictrue"
            onClicked: fileOpenDialog.open()
        }
    }
    //创建两个MenuBar,当点击的时候会相应咱们创建的对话框打开,或者打开关于这个软件对话框
    menuBar:MenuBar
    {
        Menu
        {
            title:qsTr("&file")
            MenuItem
            {
                text: qsTr("&open..")
                icon.name: "document-open"
                icon.source: "documentopen.png"
                onTriggered: fileOpenDialog.open()
            }
        }
        Menu
        {
            title:qsTr("&Help")
            MenuItem
            {
                text: qsTr("&About")
                onTriggered: aboutDialog.open()
            }
        }
    }

    //将打开的图片设置成缓存图像
    Image {
        id: image
        anchors.fill: parent
        fillMode: Image.PreserveAspectFit
        asynchronous: true
        cache: false

    }
    //图像文件打开窗口
    FileDialog
    {
        id:fileOpenDialog
        title:"Select Image file "
        //获取文档写的权限
        folder: StandardPaths.writableLocation(StandardPaths.DocumentsLocation)
        nameFilters: ["Image files (*.png *.jpeg *.jpg)",]
        onAccepted: {image.source = fileOpenDialog.fileUrl}
    }
    //关于这个软件信息窗口
    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
    }

移动端

在原本基础上添加下面代码就可以

    Drawer {
           id: drawer

           width: Math.min(window.width, window.height) / 3 * 2
           height: window.height

           ListView {
               focus: true
               currentIndex: -1
               anchors.fill: parent

               delegate: ItemDelegate {
                   width: parent.width
                   text: model.text
                   highlighted: ListView.isCurrentItem
                   onClicked: {
                       drawer.close()
                       model.triggered()
                   }
               }

               model: ListModel {
                   ListElement {
                       text: qsTr("Open...")
                       triggered: function() { fileOpenDialog.open(); }
                   }
                   ListElement {
                       text: qsTr("About...")
                       triggered: function() { aboutDialog.open(); }
                   }
               }

               ScrollIndicator.vertical: ScrollIndicator { }
           }
       }

    header: ToolBar {
            // 桌面端无作用
            Material.background: Material.Orange
            ToolButton {
                id: menuButton
                anchors.left: parent.left
                anchors.verticalCenter: parent.verticalCenter
                icon.source: "baseline-menu-24px.svg"
                onClicked: drawer.open()
            }
            Label {
                anchors.centerIn: parent
                text: "Image Viewer"
                font.pixelSize: 20
                elide: Label.ElideRight
            }
        }

代码的详细解释:

创建了一个具有两个选项的列表视图(ListView)

  1. focus: true:这将使ListView获得焦点,这意味着当用户首次打开该界面时,ListView将成为用户可以直接与之交互的第一个元素。

  2. currentIndex: -1:这将设置当前选定的列表项的索引为-1,这意味着在开始时没有任何项目被选中。

  3. anchors.fill: parent:这将使ListView填充其父元素的所有可用空间,使得列表视图占据整个界面。

  4. delegate: ItemDelegate:这是ListView的代理对象,它负责创建列表中的每个元素。在这个例子中,它是一个ItemDelegate对象,用于显示每个列表项的内容。

    • width: parent.width:这将每个列表项的宽度设置为父元素的宽度,使得每个列表项占据整个列表视图的宽度。
    • text: model.text:这将显示模型中每个元素的文本。
    • highlighted: ListView.isCurrentItem:当一个列表项成为当前选定的项时,这个列表项会被高亮显示。
    • onClicked::当用户点击一个列表项时,这个列表项将被选中,然后关闭Drawer,并执行模型中指定的函数。
  5. model: ListModel:这是ListView的数据模型,它包含了一组ListElement,每个ListElement代表一个列表项。

    • 在这个例子中,数据模型有两个元素:
      • "Open...",点击时会打开一个文件打开对话框(fileOpenDialog.open())。
      • "About...",点击时会打开一个关于对话框(aboutDialog.open())。
  6. ScrollIndicator.vertical: ScrollIndicator { }:这是垂直滚动指示器,当列表视图的内容超过视窗时,滚动指示器会显示出来。

总的来说,这段代码创建了一个具有两个选项的列表视图,用户可以通过点击来选择一个选项,并根据选项的内容执行不同的操作。

 

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

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

相关文章

ApiPost软件会对数据进行预处理,有可能会导致数据报错

文章目录 测试数据正确的请求方式当URL有数据被修改之后(数据就不一致了) 测试数据 %257B%2522pageNum%2522:1,%2522pageSize%2522:10,%2522param%2522:%257B%2522flowType%2522:1,%2522workcardType%2522:%2522作者的请求方便大家一键复制 localhost:…

记录windows7无权安装

项目场景: electron 安装程序 windows上的C盘 progrom files 、 问题描述 安装过程中出现 不能打开写入文件 提示如上。 { "name": "intergeOM-goldwind","version": "1.0.0","author": "weile",&q…

事业单位D类 — — 理论攻坚-主题班会

一、书写模版 (一)活动主题 1.书写模板 (1)(主动学习),从我做起/我能行;做(环保、诚信)卫士/标兵;(网络安全、诚信)伴…

RealVNC配置自定义分辨率(AlmaLinux 8)

RealVNC 配置自定义分辨率(AlmaLinux8) 参考RealVNC官网 how to set up resolution https://help.realvnc.com/hc/en-us/articles/360016058212-How-do-I-adjust-the-screen-resolution-of-a-virtual-desktop-under-Linux-#standard-dummy-driver-0-2 …

Linux操作系统的基本配置操作

Linux操作系统的基本操作 一、和网络有关的Linux操作二、网络如果修改完成,需要重启Linux的网卡服务三、在Linux上还有一个网络服务NetworkManagaer四、Linux上还有一个服务叫做firewalld(防火墙的服务)五、Linux安装的节点服务器我们一般都是…

数据结构体--5.0图

目录 一、定义 二、图的顶点与边之间的关系 三、图的顶点与边之间的关系 四、连通图 五、连通图的生成树定义 一、定义 图(Graph)是由顶点的又穷非空集合合顶点之间边的集合组成,通常表示为:G(V,E&…

中国知网账号包月多少钱?怎样知网包月最划算

中国知网是我们在查找下载论文资料时常用的中文数据库,也是全球最大的中文数据库之一。那么,中国知网是否可以包月使用呢?包月费用又是多少呢?如何包月最划算呢?下面本文将为您一一解答。 一、中国知网可包月使用吗&a…

C 语言不同类型变量之间的大小比较

1. 示例代码&#xff1a; #include <stdio.h>int main(void) {int a -1;unsigned int b 1;if (a b) {printf("a b\n");} else if (a < b) {printf("a < b\n");} else {printf("a > b\n");}return 0; } 2. 输出结果&#xff…

用变压器实现德-英语言翻译【01/8】:嵌入层

一、说明 本文是“用变压器实现德-英语言翻译”系列的第一篇文章。它引入了小规模的嵌入来建立感知系统。接下来是嵌入层的变压器使用。下面简要概述了每种方法&#xff0c;然后是德语到英语的翻译。 二、技术背景 嵌入层的目标是使模型能够详细了解单词、标记或其他输入之间的…

简易虚拟培训系统-UI控件的应用2

目录 Text组件-文字显示 Text组件-文字动态显示 ScrollView组件 使用文件流动态读取硬盘文件 本篇介绍Text和ScrollView的简单应用&#xff0c;以及读取硬盘中.txt文本的内容 Text组件-文字显示 1. 加入Text&#xff1a;在mainCanvas上点右键->UI->选择Text和TextMe…

CocosCreator组件上的schedule

目录 1.首先看component.ts中schedule 函数&#xff0c;核心代码就是获取director.getScheduler()&#xff0c;并调用schedule方法&#xff0c;把callback等参数传递进去。 2.再看到scheduler.ts类中的schedule方法&#xff0c;只取一些主要代码&#xff0c;下面会分段详细拆…

dockerfile 例子(二)

Dockerfile由一行一行的命令语句组成&#xff0c;#开头的为注释行。Dockerfile文件内容分为四个部分&#xff1a;基础镜像信息、维护者信息、镜像操作指令以及容器启动执行指令。 接下来给大家列出Dockerfile中主要命令的说明。 FROM&#xff0c;指定所创建镜像的基础镜像。 …

Verilog基础:块语句

相关阅读 Verilog基础专栏https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 1、块语句 块语句(block statements)是一种把语句组织在一起&#xff0c;这样他们在语法上就像单个语句一样工作。Verilog HDL中有两种类型的块&#xff1a; …

“惠医通-医院挂号订单平台”

结合已学习过的vue3和TS完成的项目&#xff0c;便于患者对自己想要就诊的科室进行挂号&#xff0c;付款 一&#xff1a;项目简介 前端技术栈 Vue3 TS vue-router Element-ui Axios Pinia 项目架构 二&#xff1a;主要模块 1. axios二次封装 1.1 创建实例 //利用axios.creat…

如何调整DOSBOX软件的运行窗口大小

前言 小编最近正在学习微机原理&#xff0c;碰到一些问题&#xff0c;在安装DOSBOX后&#xff0c;打开应用&#xff0c;会出现运行窗口特别小&#xff0c;字体也很小的情况&#xff0c;使用时会感觉特别费劲&#xff0c;看着特别的不舒服&#xff0c;那么这个时候就需要调整一…

【LeetCode题目详解】第八章 贪心算法 part01 理论基础 455.分发饼干 376. 摆动序列 53. 最大子序和 day31补

贪心算法理论基础 关于贪心算法&#xff0c;你该了解这些&#xff01; 题目分类大纲如下&#xff1a; # 什么是贪心 贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 这么说有点抽象&#xff0c;来举一个例子&#xff1a; 例如&#xff0c;有一堆钞票&…

【C#】C#:“指派给常量数组的必须是常量”

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 记录一个有意思的代码片段。 首先&#xff0c;复习一下常量。…

安防监控/磁盘阵列存储/视频汇聚平台EasyCVR调用rtsp地址返回的IP不正确是什么原因?

安防监控/云存储/磁盘阵列存储/视频汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等&#xff0c;能对外分发RTSP、RT…

leetcode 563.二叉树的坡度

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;https://leetcode.cn/problems/binary-tree-tilt/description/ 代码&#xff1a; class Solution { public:int childFind(TreeNode* root , int& sumTile) {if (root nullptr) {return 0; // 空树坡度为0}int l…

VBA技术资料MF48:VBA_在Excel中将列号与字母转换

【分享成果&#xff0c;随喜正能量】除非自己的认知获得了改变和刷新&#xff0c;否则&#xff0c;人们常说的“顺应自己的内心”&#xff0c;顺的不过是一颗旧心&#xff0c;一颗惯性的&#xff0c;充满了各种习性的套路之心。与“顺应自己的内心”恰恰相反&#xff0c;人要用…