上一篇文章分析了一个小游戏,使用qml编写界面+js进行复杂逻辑控制,算是一个比较完整的qml示例代码了,今天就不那么继续变态啦,来看一个简单的字体示例程序吧,该示例代码比较简单,主要是展示了几个简单的使用场景,下边我将逐个进行分析

1、淡出

  如图1所示是一个文本淡出并伴随字母间距增大的效果,该组件使用了两个序列动画,一个用于将字母间距放大,另一个用于改变文字透明度

图1 淡出

  代码如下所示

 //Hello world字样  3000ms淡出并伴随着字母间距增大  之后文本框位置瞬间重置 进行下一个3000淡出
import QtQuick 2.0 Rectangle {
id: screen width: ; height:
color: "black" Item {//文本框
id: container
x: screen.width / ; y: screen.height / Text {
id: text
anchors.centerIn: parent
color: "white"
text: "Hello world!"
font.pixelSize: //! [letterspacing]
SequentialAnimation on font.letterSpacing {//字母间距
loops: Animation.Infinite;//无限循环
NumberAnimation { from: ; to: ; easing.type: Easing.InQuad; duration: }//3000ms将字母间距从0变到50
ScriptAction {//动画结束后 使用脚本动作 重置该文本框位置
script: {
container.y = (screen.height / ) + (Math.random() * screen.height / )
container.x = (screen.width / ) + (Math.random() * screen.width / )
}
}
}
//! [letterspacing] SequentialAnimation on opacity {//应用于透明度上的序列动画
loops: Animation.Infinite;//无限循环
NumberAnimation { from: ; to: ; duration: }//淡出效果
PauseAnimation { duration: }//暂停400ms 加上该动画之前动画2600ms 总共3000ms 同letterSpacing序列动画刚好构成一个并行动画
}
}
}
}

2、字体样式

  qml有内置FontLoader可以加载系统字体、本地字体和远端字体,效果如图2所示

图2 字体样式

  改变字体样式和字体显示风格都使用了font属性组

 import QtQuick 2.0

 Rectangle {
property string myText: "The quick brown fox jumps over the lazy dog."//各Text将显示文本 width: ; height:
color: "steelblue" //! [fontloader]
FontLoader { id: fixedFont; name: "Courier" }//加载系统字体Courier
//! [fontloader]
//! [fontloaderlocal]
FontLoader { id: localFont; source: "content/fonts/tarzeau_ocr_a.ttf" }//加载本地字体
//! [fontloaderlocal]
//! [fontloaderremote]
FontLoader { id: webFont; source: "http://www.princexml.com/fonts/steffmann/Starburst.ttf" }//加载远端字体
//! [fontloaderremote] Column {
anchors { fill: parent; leftMargin: ; rightMargin: ; topMargin: }
spacing: Text {
text: myText//指定文本显示内容
color: "lightsteelblue"//指定文本颜色
width: parent.width
wrapMode: Text.WordWrap//一行显示不下时 换行模式 按字换行 保证换行时一个单词不会被显示在两行
//! [name]
font.family: "Times"//通过字体名称指定字体
//! [name]
font.pixelSize: //字体像素大小
}
Text {
text: myText
color: "lightsteelblue"
width: parent.width
wrapMode: Text.WordWrap
horizontalAlignment: Text.AlignHCenter//水平方向居中
font { //通过font指定字体各项属性 也可以通过font.attribute来单个设置
family: "Times";
pixelSize: ;
capitalization: Font.AllUppercase//设置字母都大写
}
}
Text {
text: myText
color: "lightsteelblue"
width: parent.width
horizontalAlignment: Text.AlignRight//文本右对齐
wrapMode: Text.WordWrap
font {
family: fixedFont.name; //通过字体加载器设置字体
pixelSize: ;
weight: Font.Bold; //字体加粗
capitalization: Font.AllLowercase//设置字母都小写
}
}
Text {
text: myText
color: "lightsteelblue"
width: parent.width
wrapMode: Text.WordWrap
font {
family: fixedFont.name;
pixelSize: ;
italic: true;
capitalization: Font.SmallCaps//以小写字母的大小写大写字母 首字母依然是正常大写
}
}
Text {
text: myText
color: "lightsteelblue"
width: parent.width
wrapMode: Text.WordWrap
font {
family: localFont.name;
pixelSize: ;
capitalization: Font.Capitalize//每个单词的首字母大写
}
}
Text {
text: {
if (webFont.status == FontLoader.Ready) myText
else if (webFont.status == FontLoader.Loading) "Loading..."
else if (webFont.status == FontLoader.Error) "Error loading font"
}
color: "lightsteelblue"
width: parent.width
wrapMode: Text.WordWrap
font.family: webFont.name;//设置远端字体名称
font.pixelSize:
}
}
}

3、系统字体

图3 系统字体

  如图3所示,使用了ListView展示了当前系统支持的所有字体,文本项所使用的字体样式就是文本内容,代码如下

 //展示当前系统所有字体
import QtQuick 2.0 Rectangle {
width: ; height: ; color: "steelblue" ListView {
anchors.fill: parent
//! [model]
model: Qt.fontFamilies()//数据源是所有的qt字体
//! [model] delegate: Item {
height: ; width: ListView.view.width
Text {
anchors.centerIn: parent
text: modelData//文本内容显示字体名称
//! [delegate]
font.family: modelData//设置字体名称
//! [delegate]
font.pixelSize: //字体像素大小
color: "white"//字体颜色
}
}
}
}

4、跑马灯

  示例代码中banner.qml组件实现了跑马灯效果,不过个人感觉效果不是特别好,因此这里就不细说,如果感兴趣的同学可自行到Qt5.7.0_vs2013\Examples\Qt-5.7\quick\text目录下查找,该文件代码量比较少

5、图文混用

  qml对css支持的相对来说还可以,css已经发展到3.0版本,具体qml友好的支持到哪一版本感兴趣的同学可自行上网上查找

图4 图文混合

  如图4所示是简单的图文混用,其实代码也比较简单,主要还是使用了web技术中的一些关键字,比如<b>:加粗,<img>:远端图片等。代码如下

 import QtQuick 2.0

 Rectangle {
id: main
width: ; height:
focus: true
color: "#dedede" property var hAlign: Text.AlignLeft Flickable {//可滑动区域
anchors.fill: parent
contentWidth: parent.width
contentHeight: col.height + Column {
id: col
x: ; y:
spacing:
width: parent.width - TextWithImage {
text: "This is a <b>happy</b> face<img src=\"images/face-smile.png\">"//谁用css语法 设置happy字体加粗 并使用img关键字导入图片
}
TextWithImage {
text: "This is a <b>very<img src=\"images/face-smile-big.png\" align=\"middle\"/>happy</b> face vertically aligned in the middle."//使用middle属性将图片置于中间位置
}
TextWithImage {
text: "This is a tiny<img src=\"images/face-smile.png\" width=\"15\" height=\"15\">happy face."//使用width和height属性设置图片大小
}
TextWithImage {
text: "This is a<img src=\"images/starfish_2.png\" width=\"50\" height=\"50\" align=\"top\">aligned to the top and a<img src=\"images/heart200.png\" width=\"50\" height=\"50\">aligned to the bottom."
}
TextWithImage {//连续导入3张图片 并设置其大小 位置居中
text: "Qt logos<img src=\"images/qtlogo.png\" width=\"55\" height=\"60\" align=\"middle\"><img src=\"images/qtlogo.png\" width=\"37\" height=\"40\" align=\"middle\"><img src=\"images/qtlogo.png\" width=\"18\" height=\"20\" align=\"middle\">aligned in the middle with different sizes."
}
TextWithImage {
text: "Some hearts<img src=\"images/heart200.png\" width=\"20\" height=\"20\" align=\"bottom\"><img src=\"images/heart200.png\" width=\"30\" height=\"30\" align=\"bottom\"> <img src=\"images/heart200.png\" width=\"40\" height=\"40\"><img src=\"images/heart200.png\" width=\"50\" height=\"50\" align=\"bottom\">with different sizes."
}
TextWithImage {//从远端加载图片
text: "Resized image<img width=\"48\" height=\"48\" align=\"middle\" src=\"http://qt-project.org/images/qt13a/Qt-logo.png\">from the internet."
}
TextWithImage {
text: "Image<img align=\"middle\" src=\"http://qt-project.org/images/qt13a/Qt-logo.png\">from the internet."
}
TextWithImage {
height:
verticalAlignment: Text.AlignVCenter
text: "This is a <b>happy</b> face<img src=\"images/face-smile.png\"> with an explicit height."
}
}
} Keys.onUpPressed: main.hAlign = Text.AlignHCenter//水平居中
Keys.onLeftPressed: main.hAlign = Text.AlignLeft//水平居左
Keys.onRightPressed: main.hAlign = Text.AlignRight//水平居右
}

  如上代码54-56行,对键盘事件进行了简单处理,向上键:文本水平居中,向左键:水平居左,向右键:水平居中

6、文本布局

  之前一直用QTextEdit做文本显示功能,一直很羡慕html的文本布局功能,现在不用担心了,qml也可以在文本布局时做自己想做的一些事情,主要还是处理lineLaidOut信号,如图5所示,该文本显示在窗口左半侧进行展示,当展示不下时,从右半侧窗口开始展示

图5 Text自定义布局

  当窗口进行放大缩小时,这个灵活布局才能更有好多的展示,感兴趣的同学可以自己运行qt示例,要实现这个友好的功能其实代码量很少,代码如下所示

 //复杂文本显示
import QtQuick 2.0 Rectangle {
id: main
width: ; height:
focus: true property real offset:
property real margin: Text {
id: myText
anchors.fill: parent
anchors.margins:
wrapMode: Text.WordWrap
font.family: "Times New Roman"
font.pixelSize:
textFormat: Text.StyledText
horizontalAlignment: Text.AlignJustify //css关键字 <a <br <ul <ol <li <p
text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer at ante dui <a href=\"http://www.digia.com\">www.digia.com</a>.<br/>Curabitur ante est, pulvinar quis adipiscing a, iaculis id ipsum. Nunc blandit condimentum odio vel egestas.<br><ul type=\"bullet\"><li>Coffee<ol type=\"a\"><li>Espresso<li>Cappuccino<li>Latte</ol><li>Juice<ol type=\"1\"><li>Orange</li><li>Apple</li><li>Pineapple</li><li>Tomato</li></ol></li></ul><p><font color=\"#434343\"><i>Proin consectetur <b>sapien</b> in ipsum lacinia sit amet mattis orci interdum. Quisque vitae accumsan lectus. Ut nisi turpis, sollicitudin ut dignissim id, fermentum ac est. Maecenas nec libero leo. Sed ac leo eget ipsum ultricies viverra sit amet eu orci. Praesent et tortor risus, viverra accumsan sapien. Sed faucibus eleifend lectus, sed euismod urna porta eu. Quisque vitae accumsan lectus. Ut nisi turpis, sollicitudin ut dignissim id, fermentum ac est. Maecenas nec libero leo. Sed ac leo eget ipsum ultricies viverra sit amet eu orci." //! [layout]
onLineLaidOut: {
line.width = width / - (margin)//每一行的宽度只有当前根窗口宽度一半 if (line.y + line.height >= height) {//当文字显示越过窗口底部时
line.y -= height - margin//y值将去窗口高度
line.x = width / + margin//x值向右移动根窗口宽度一半 即从由半侧窗口显示剩余文本
}
}
//! [layout]
}
}

好啦。。。qml简单的文本展示就这么些了,其实应该还有很多,只是这个示例程序就这么些,那我们暂时也就说这么多吧。

qml demo分析(text-字体展示)的更多相关文章

  1. qml demo分析(threadedanimation-线程动画)

    一.效果预览 使用过qml的同学都知道,使用qml做动画效果是非常简单的,再也不需要像QWidget那样,自己模拟一个动画,费时又费力,往往还达不到效果.今天我们就来分析下qml的两种动画实现方式,如 ...

  2. qml demo分析(maskedmousearea-异形窗口)

    一.效果展示 如本文的标题所示,这篇文章分析的demo是一个异形窗口,主要展示鼠标在和异形区域交互的使用,效果如图1所示,当鼠标移动到白云或者月亮上时,相应的物体会高亮,当鼠标按下时,物体会有一个放大 ...

  3. qml demo分析(samegame-拼图游戏)

    一.效果展示 相信大家都玩儿过连连看游戏,而且此款游戏也是闲时一款打发时间的趣事,那么接下来我将分析一款类似的游戏,完全使用qml编写界面,复杂逻辑使用js完成.由于此游戏包含4种游戏模式,因此本篇文 ...

  4. qml demo分析(maroon-小游戏)

    1.效果展示 这篇文章我还是分析一个qt源码中的qml程序,程序运行效果如下图所示. 图1  游戏开始 图2  游戏中 2.源码分析 这个游戏的源码文件比较多,为了能更清楚的了解整个代码,我先整体分析 ...

  5. qml demo分析(externaldraganddrop-拖拽)

    一.效果展示 客户端程序拖拽是一个很常见的需求,对于QWidget程序来说,需要重写如图1这么几个方法,通过重写这几个方法的逻辑,我们就可以控制鼠标拖拽的逻辑,糟糕的是QDrag执行exec后是一个阻 ...

  6. qml demo分析(rssnews-常见新闻布局)

    一.效果展示 今儿来分析一篇常见的ui布局,完全使用qml编写,ui交互效果友好,如图1所示,是一个常见的客户端新闻展示效果,左侧是一个列表,右侧是新闻详情. 图1 新闻效果图 二.源码分析 首先先来 ...

  7. qml demo分析(photosurface-图片涅拉)

    阅读qml示例代码已有一小段时间,也陆续的写了一些自己关于qml示例代码的理解,可能由于自己没有大量的qml开发经验,总感觉复杂的ui交互qml处理起来可能会比较棘手,但事实总是会出人意料,今天我们就 ...

  8. qml demo分析(objectlistmodel-自定义qml数据)

    一.效果展示 如图1所示,是一个ListView窗口,自定义了文本内容和项背景色. 图1 ListView 二.源码分析 代码比较简单,主要使用了QQmlContext类的setContextProp ...

  9. qml demo分析(customgeometry-贝塞尔曲线)

    一.效果展示 本篇文章还是带来一个简单的qt示例分析,且看图1效果. 图1 贝塞尔曲线 二.源码分析 该示例代码所在目录quick\scenegraph\customgeometry,感兴趣的同学可以 ...

随机推荐

  1. LOJ_6178_景区路线规划

    LOJ_6178_景区路线规划 题意: 游乐园被描述成一张 nnn 个点,mmm 条边的无向图(无重边,无自环).每个点代表一个娱乐项目,第 iii 个娱乐项目需要耗费 cic_ic​i​​ 分钟的时 ...

  2. java中八大基本数据类型详解

    1.基本数据类型的分类 java中的类型分为基本数据类型和引用类型,今天我们讨论的是java中的八大基本数据类型. 基本数据类型可以分为三类:1.数值类型.2.字符类型.3.布尔类型. 数值类型又分为 ...

  3. 一文带你了解 Spring 5.0 WebFlux 应用场景

    一.什么是 Spring WebFlux 下图截自 Spring Boot 官方网站: 结合上图,在了解 Spring WebFlux 之前,我们先来对比说说什么是 Spring MVC,这更有益我们 ...

  4. this指向和apply,call,bind三者的区别

    一.前言 this指向,apply,call,bind的区别是一个经典的面试问题,同时在项目中会经常使用到的原生的js方法.同时也是ES5中的众多坑的一个.ES6中可能会极大的避免了this产生的错误 ...

  5. 用C语言做一个横板过关类型的控制台游戏

    前言:本教程是写给刚学会C语言基本语法不久的新生们. 因为在学习C语言途中,往往只能写控制台代码,而还能没接触到图形,也就基本碰不到游戏开发. 所以本教程希望可以给仍在学习C语言的新生们能提前感受到游 ...

  6. 入门系列之Scikit-learn在Python中构建机器学习分类器

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由信姜缘 发表于云+社区专栏 介绍 机器学习是计算机科学.人工智能和统计学的研究领域.机器学习的重点是训练算法以学习模式并根据数据进行预 ...

  7. C# 语音合成

    1. 引用System.Speech 2. 通过SpeechSynthesizer类朗读文本 new SpeechSynthesizer().SpeakAsync("我们都是好孩子We're ...

  8. Vue.js 学习笔记 第5章 内置指令

    本篇目录: 5.1 基本指令 5.2 条件渲染指令 5.3 列表渲染指令 v-for 5.4 方法与事件 5.5 实战:利用计算属性.指令等知识开发购物车 回顾一下第2.2节,我们己经介绍过指令(Di ...

  9. 基于Nginx进行地图瓦片缓存的方案描述

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1. 背景 在产品的迭代中,我们完成了移动端瓦片缓存方案和服务端瓦片缓存 ...

  10. QT读取xml配置文件

    //获取字符串字段 QString ConfigHelper::GetStringConfigValue(QString str) { if(str == "InitDeviceNo&quo ...