前段时间接触了一下QML,深深地被这门强大易用的语言所吸引。
QML的语法类似CSS,可以引入javascript作为逻辑,还能够和C++对象交互。
QML带来的好处至少有以下几点:
- 分工更明确:设计师可以专攻QML制作UI,C++工程师也能专注于自己的本职工作。
- 开发更高效:重新编写的QML不需要编译(因为它是一门脚本语言),所以只需要刷新一下你的QML Viewer就可以了。
- 界面更精美:QML开发和网页开发很相似,所以我们可以比较容易地把一个精美的网页效果移植到本地程序。
- 风格更一致:Qt本身是一个跨平台的开发框架,所以我们在Window XP上看到的是一个样子,Win7上看到的是另一个样子,到了Ubuntu或者Mac更是变了模样,使用QML可以屏蔽这些不一致。
下面带来一个简单的示例,希望对读者们有帮助。
谷歌桌面相信很多人都用过,双击ctrl可以呼出一个浮动的搜索框,非常方便。我们将使用QML仿制这一效果。先看效果图:
怎么样?很炫吧~
好的,首先打开你的Qt Creator(QML是Qt4.7以后才有的特性,请升级你的SDK到最新版本
)。然后新建一个项目。接着新建一个C++ Class,命名为FloatBox。现在你的工程的目录结构应该像这样:
接着,再新建一个QML文件:
我们将这个QML文件命名为TextBox。这个QML文件主要是实现搜索框中的文本框。
输入以下代码:
import Qt 4.7
FocusScope {
id: focusScope
width: 600; height: 40
focus:true
BorderImage {
source: "../images/lineedit-bg.png"
width: parent.width; height: parent.height
border { left: 4; top: 4; right: 4; bottom: 4 }
}
Text {
id: typeSomething
anchors.fill: parent; anchors.leftMargin: 8
verticalAlignment: Text.AlignVCenter
text: "\u8BF7\u8F93\u5165\u7F51\u5740"
color: "gray"
}
MouseArea {
anchors.fill: parent
onClicked: { focusScope.focus = true; textInput.openSoftwareInputPanel(); }
}
TextInput {
id: textInput
anchors { left: parent.left; leftMargin: 8; right: clear.left; rightMargin: 8; verticalCenter: parent.verticalCenter }
focus: true
font.pixelSize:20
}
Image {
id: clear
anchors { right: parent.right; rightMargin: 8; verticalCenter: parent.verticalCenter }
source: "../images/clear.png"
opacity: 0
MouseArea {
anchors.fill: parent
onClicked: { textInput.text = ''; focusScope.focus = true; textInput.openSoftwareInputPanel(); }
}
}
states: State {
name: "hasText"; when: textInput.text != ''
PropertyChanges { target: typeSomething; opacity: 0 }
PropertyChanges { target: clear; opacity: 1 }
}
transitions: [
Transition {
from: ""; to: "hasText"
NumberAnimation { exclude: typeSomething; properties: "opacity" }
},
Transition {
from: "hasText"; to: ""
NumberAnimation { properties: "opacity" }
}
]
}
你也许会注意到,在Text的text属性中,我输入的是utf编码的汉字。事实上,想要在QML文件里显示中文还是有一点小麻烦的,要么就是用utf编码过的汉字,要么使用Qt翻译家来转换。直接在QML中输入中文将无法显示。
接着,新建ShadowRectangle文件。该文件实现的是阴影效果。代码如下:
import Qt 4.7
Item {
property alias color : rectangle.color
BorderImage {
anchors.fill: rectangle
anchors { leftMargin: 0; topMargin: 0; rightMargin: -8; bottomMargin: -8 }
border { left: 10; top: 10; right: 10; bottom: 10 }
source: "../images/shadow.png"; smooth: true
}
Rectangle { id: rectangle; anchors.fill: parent; radius:5}
}
最后新建main.qml文件,该文件实现的是整个搜索栏的效果。其代码如下:
import Qt 4.7
Rectangle {
id: page
width: 614; height: 54
color: "#7bffffff"
radius:5
MouseArea {
anchors.fill: parent
onClicked: page.focus = false;
}
ShadowRectangle {
color: "#434343"
transformOrigin: "Center"
opacity: 0.97
visible: true
anchors.centerIn: parent; width: 610; height: 50
}
TextBox {
id: search;
visible: true
opacity: 1
anchors.centerIn: parent
}
}
QML的代码通俗易懂,这里就不去解释每一行代码的意思了。
好的,下面让我们把QML制作的搜索栏放置到桌面程序的窗体上。
在你的floatbox.h中添加一个私有变量:
private:
QDeclarativeView *ui;
然后在你的floatbox.cpp的构造函数中输入以下代码:
// 使窗体透明而控件不透明
setWindowFlags(Qt::FramelessWindowHint);
setAttribute(Qt::WA_TranslucentBackground, true);
setStyleSheet("background:transparent;");
ui = new QDeclarativeView;
ui->setSource(QUrl("qrc:/resources/qml/main.qml"));
setCentralWidget(ui);
resize(QSize(630, 60));
细心的你可以发现,我将qml文件加入了Qt的资源系统。这里要说明一点,非常重要:
在QML文件中如果引入了其他文件(包括js文件、图片文件等),要么都加入Qt的资源系统,要么都不加入,因为Qt的资源文件无法和本地文件相互访问。
所以,如果你也和我一样新建了qrc文件,请将qml文件和图片文件一并加入到资源系统中去。如下图:
到了这一步,我们的搜索工具栏差不多要完工了,想要运行,千万不要忘记在pro文件添加declarative模块。
QT += core gui declarative
好的,现在你就可以按下ctrl+R欣赏一下成果了。
最后,老规矩,附上源代码。
- 大小: 5.3 KB
- 大小: 7.4 KB
- 大小: 83.2 KB
- 大小: 3.5 KB
- 大小: 15.9 KB
分享到:
相关推荐
【使用QML实现的一个音乐播放器】是一个基于Qt框架的轻量级音乐播放软件,它利用了QML(Qt Quick)技术来构建用户界面。QML是一种声明式语言,允许开发者以直观的方式定义UI元素,并结合JavaScript进行逻辑处理。这...
而KDDockWidget中其实是支持Tab合并效果,但是在实际使用过程中遇到很多问题,该功能并不是很完善,所以索性自己使用QML来实现tabbar效果,然后结合KDDockWidget,可将每个tab页面进行单独的浮动和缩放。本Demo使用...
在Qt Quick(QML)中实现异型按钮是一种在用户界面上创造独特视觉效果的方法,它可以帮助提升应用的用户体验和吸引力。QML是Qt框架的一部分,用于构建高度动态和交互式的用户界面,其语法简洁且易读,非常适合创建...
在本项目中,“qml实现的侧边弹窗效果”是一个使用QML在Ubuntu 16.04环境下,结合Qt 5.7.1版本构建的示例应用。这个项目可能包含一个名为"popUpWin"的主文件,该文件是QML脚本,用于实现从侧边弹出的窗口效果。 QML...
在本文中,我们将深入探讨如何使用Qt Quick QML(一种声明式用户界面设计语言)来实现虚线效果,特别关注如何结合C++扩展QML的功能。由于QML本身不直接支持绘制虚线,我们将探讨如何通过自定义QML类型和C++插件来...
在本文中,我们将深入探讨如何使用Qt的QML(Quantum MetaObject Language)来实现具有毛玻璃效果的用户界面。毛玻璃效果,也被称为模糊效果或亚克力效果,是现代用户界面设计中的一种流行元素,它能为应用程序提供一...
在QML(Qt Quick)中实现树形组件可以是一项挑战,因为默认的`TreeView`控件可能不完全符合开发者的期望。本篇文章将深入探讨如何根据个人需求自定义一个更灵活、功能更丰富的树形组件。 QML是Qt框架的一部分,它...
这篇描述的是一个初学者使用QML创建的第一个UI界面,具有天蓝色的主题,并计划与C++进行交互。 首先,QML的语法简洁明了,允许开发者以一种声明性的方式来描述UI元素和它们的布局。通过QML,你可以定义各种组件,如...
在本教程中,我们将深入探讨如何使用QML实现一个登录界面,以及如何处理界面跳转和单选框的应用。 首先,创建一个登录界面通常包括用户名输入框、密码输入框、登录按钮以及可能的记住密码和自动登录选项。在QML中,...
本教程将深入讲解如何利用QML实现GridView的上下左右翻页效果,以增强用户交互体验。 首先,GridView是QML中的一个布局组件,它允许你以网格形式排列元素。每个元素的位置由行和列的索引决定。在创建GridView时,你...
【Qml技术详解】 Qml,全称Qt Meta Language,是Qt框架的一部分,主要用于构建...通过学习并实践“纯Qml实现的酷狗播放器界面”项目,开发者可以深入了解Qml的特性和应用,从而提升在UI设计和应用程序开发方面的能力。
在本项目中,"QML实现点赞送礼物效果" 是一个使用Qt5的QML技术构建的用户界面功能。QML(Qt Meta Language)是Qt框架下的一种声明式语言,用于设计富有动态和交互性的图形用户界面。它允许开发者通过简洁的JSON-like...
【标题】"高仿360安全卫士 9.2 界面 (纯qml实现)" 描述了一个项目,该项目旨在使用QML语言模仿360安全卫士的9.2版本用户界面。QML是Qt框架下用于构建用户界面的一种声明式语言,它允许开发者以一种直观、高效的方式...
QML是Qt框架的一部分,用于构建高度动态、可视化的用户界面,尤其适用于桌面应用和嵌入式系统。下面我们将深入探讨如何在QML中创建一个时间选择器。 首先,我们需要了解QML的基本元素。在QML中,我们可以使用`Item`...
在本文中,我们将深入探讨如何使用Qt Quick QML来实现一个引人注目的Cover Flow图片轮播效果。Cover Flow是一种视觉上吸引人的用户界面元素,它以流畅的3D翻转效果展示一系列图像,通常用于应用程序中的媒体库或菜单...
在本文中,我们将深入探讨如何使用Qt的QML(Qt Quick)技术来实现网易云音乐的用户界面(UI)。QML是一种声明式语言,用于构建高效、动态且具有视觉吸引力的用户界面,非常适合用于跨平台的桌面和移动应用开发。 **...
在本文中,我们将深入探讨如何使用Qt Quick的QML实现图像处理,特别是涉及浮雕、锐化等视觉效果。Qt Quick是一种高效的用户界面框架,它允许开发者使用声明式语法创建丰富的图形用户界面,并且可以轻松地与C++进行...
QML(Qt Meta Language)是Qt框架的一部分,用于创建丰富的用户界面,特别是在桌面应用和嵌入式系统中。通过利用QML的灵活性和强大的图形功能,我们可以轻松地实现这种效果。 首先,让我们了解QML中的Text元素。...
基于 Qt + Qml 实现的Markdown文本编辑器
最近学习了Qml的基础,没有在实际项目中用过,所以参考市面上的视频播放器的界面做了一个简易demo。 demo中包含了Qml界面布局,自定义控件,信号槽、JavaScript等Qml的基本用法,方便以后需要时查看,大家有需要也...