文档库 最新最全的文档下载
当前位置:文档库 › qtC++调用qml实例

qtC++调用qml实例

qtC++调用qml实例
qtC++调用qml实例

在declarative目录中,有个minehunt范例,实现了在C++中加载QML界面,并用C++来处理QML界面上的鼠标动作.这种思路和传统的GUI相似,感觉比较顺畅.否则运行一个QML,还要使用qmlviewer,上面带一大堆菜单按钮,看着够别扭的.

在main函数中,创建了一个QDeclarativeView实例,这个实例负责显示QML界面.接着创建负责处理业务逻辑的MinehuntGame实例,并在view加载QML文件后,将其设置为引擎的上下文对象.这样就可以直接在QML中使用MinehuntGame类中的属性和方法了.感觉设置上下文后,将上下文类实例与QML界面做了融合,QML中的鼠标点击等事件就可以调用类中方法进行处理,并可以绑定到实例的属性.

#include

#include

#include

#include

#include "minehunt.h"

int main(int argc, char *argv[])

{

QApplication app(argc, argv);

QDeclarativeView canvas;

qmlRegisterType();//注册TileData类,这个类不需要在QML中实例化.

MinehuntGame* game = new MinehuntGame();

canvas.engine()->rootContext()->setContextObject(game);

canvas.setSource(QString("qrc:minehunt.qml"));

QObject::connect(canvas.engine(), SIGNAL(quit()), &app, SLOT(quit())); //QML退出,应用程序也退出

canvas.setGeometry(QRect(100, 100, 450, 450));

canvas.show();

return app.exec();

}

在程序中定义了代表扫雷界面中每个方块的TileData类,用来记录这个方块的状态,如做标记的,被点开的,或有雷的.那么类的实例是如何与QML进行关联同步的呢?在MinehuntGame中定义了一个属性QDeclarativeListProperty tiles(),与_tiles成员绑定,并在类构造时向tiles中填充多个TileData实例.在QML中可以看到如下声明:

Grid {

anchors.horizontalCenter: parent.horizontalCenter

columns: 9; spacing: 1

Repeater {

id: repeater

model: tiles

delegate: Tile {}

}

}

这样就按MinehuntGame实例中的tiles属性进行构造Grid中的元素了,每个TileData实例生成一个Tile组件.在操作Tile组件时又会反过来调用MinehuntGame中的方法.先看看那个表情图标,点击时会重置界面.

Image {

anchors.bottom: field.bottom; anchors.bottomMargin: 15

anchors.right: field.right; anchors.rightMargin: 20

source: isPlaying ? 'MinehuntCore/pics/face-smile.png' ://isPlaying,hasWon是MinehuntGame实例中的属性,这里做了绑定,如果实例中的属性发生变化,则图标自动变化 hasWon ? 'MinehuntCore/pics/face-smile-big.png': 'MinehuntCore/pics/face-sad.png'

MouseArea { anchors.fill: parent; onPressed: reset() }//点击的时候调用MinehuntGame实例的reset方法,重置雷区,上面也有个关于雷区的绑定,重置后界面自动

更新

}

在看看点击雷区的一个方块时的动作触发过程.这里有两个成员对象,index和modelData,都是和模型绑定有关的,index表示当前选中的模型元素索引,modelData表示当前选中子模型对应的元素.在QML中可通过modelData访问TileData元素属性.下面的声明中指定,鼠标左键点击调用MinehuntGame的flip方法,右击调用flag方法.在这两个C++函数中判断是否触雷等逻辑,并修改类实例的状态,通过绑定,界面元素自动更新.

MouseArea {

anchors.fill: parent

acceptedButtons: Qt.LeftButton | Qt.RightButton

onClicked: {

field.clickx = flipable.x//鼠标点击时设置主界面的clickx,clicky属性 field.clicky = flipable.y

var row = Math.floor(index / 9)

var col = index - (Math.floor(index / 9) * 9)

if (mouse.button == undefined || mouse.button == Qt.RightButton) { flag(row, col)

} else {

flip(row, col)

}

}

onPressAndHold: {

field.clickx = flipable.x

field.clicky = flipable.y

var row = Math.floor(index / 9)

var col = index - (Math.floor(index / 9) * 9)

flag(row, col)

}

}

那么触雷后的例子系统是如何声明的呢?

transitions: Transition {

SequentialAnimation {

ScriptAction {

script: {

var ret = Math.abs(flipable.x - field.clickx)

+ Math.abs(flipable.y - field.clicky);

if (modelData.hasMine && modelData.flipped)

pauseDur = ret * 3

else

pauseDur = ret

}

}

PauseAnimation {

duration: pauseDur

}

RotationAnimation { easing.type: Easing.InOutQuad }

ScriptAction { script: if (modelData.hasMine && modelData.flipped) { expl.explode = true } }//这里指定如果modelData即TileData数据对象属性hasMine或flipped为true,则触发例子效果.

}

}

expl的定义:Explosion { id: expl }.

Explosion的定义:

import QtQuick 1.0

import https://www.wendangku.net/doc/2c1639109.html,bs.particles 1.0

Item {

property bool explode : false

Particles {//定义了一个粒子对象

id: particles

width: 40

height: 40

lifeSpan: 1000

lifeSpanDeviation: 0

source: "pics/star.png"//粒子图像

count: 0

angle: 270

angleDeviation: 360

velocity: 100

velocityDeviation: 20

z: 100

}

states: State { name: "exploding"; when: explode

StateChangeScript {script: particles.burst(200); }

}

}

总结:要向将QML和C++结合起来,实现传统的开发方式,核心的代码就是canvas.engine()->rootContext()->setContextObject(game);这样就可以在QML中调用game实例的属性和函数了.

**************测试如何在C++中获取TextInput元素中输入的内容**************

根据上面的范例分析可以在QML中访问C++中定义的函数或属性,那么C++中怎么获取到QML中的界面内容呢?网上说有三种方法,一种是在C++的插件获取,一种是在C++中解析QML中的元素,最后一种是在C++中定义带参数的槽函数,在QML中的事件中调用这个槽,并将TextInput中的内容作为参数传到C++中.感觉最后一种方法最方便了,因此做了如下测试:

定义QML文件:

import QtQuick 1.0

Rectangle{

id: window

width: 240; height: 250

BorderImage{

y:0

id:button

source:"pics/back.png"

MouseArea{

id:mouseArea

anchors.fill:parent

onClicked:buttonClicked(textInput.text)//按钮点击的时候调用C++中的buttonClicked槽函数

}

Rectangle{

id:shade

anchors.fill:button; radius: 10; color: "black"; opacity: 0

}

states:State{

name:"pressed";when: mouseArea.pressed == true

PropertyChanges{ target: shade; opacity: 0.4}

}

}

BorderImage

{

source: "pics/back.png";width:82;height:22;y:50

TextInput{

id:textInput

text: qsTr("text")

y:1;x:1;width:80;height:20;

}

}

}

C++类:

头文件

#ifndef QMLCONTROL_H

#define QMLCONTROL_H

#include

class QmlControl : public QObject

{

Q_OBJECT//必须加上Q_OBJECT宏,否则在QML中无法触发buttonClicked函数public:

QmlControl(void);

~QmlControl(void);

public slots:

Q_INVOKABLE void buttonClicked(QString textInput);

};

#endif

cpp文件

#include "QmlControl.h"

#include

QmlControl::QmlControl(void)

{

setObjectName("mainObject");

}

QmlControl::~QmlControl(void)

{

}

void QmlControl::buttonClicked(QString textInput)

{

QMessageBox::information(NULL, "", textInput);

}

界面上放一个QDeclarativeView控件,并在构造函数中加载QML,设置引擎中的对象:

GetQMLInputTextValue::GetQMLInputTextValue(QWidget *parent, Qt::WFlags flags) : QMainWindow(parent, flags)

{

ui.setupUi(this);

qmlRegisterType();

QmlControl *ctrl = new QmlControl();

ui.declarativeView->engine()->rootContext()->setContextObject(ctrl);

ui.declarativeView->setSource(QString("qrc:/Resources/test.qml"));

connect(ui.declarativeView->engine(),SIGNAL(quit()), qApp, SLOT(quit()));

}

注意我将QML和其中的图片放入资源中,这里引用QML的时候需要以qrc开头,否则访问不到图片文件.

人体头部五官的画法

教师授课计划

侧面眼睛可先画出类似三角形的轮廓,再画眼珠。上眼皮向前突出并有卷翘、浓密的长睫毛,下眼皮内收,眼珠要画扁。 (2)鼻子的画法 鼻子由鼻根、鼻梁、鼻尖、鼻翼和鼻孔组成。画正面的鼻

注意鼻根的内收,鼻梁的挺直和鼻底的角度;斜面的鼻子是否 画鼻梁要视头部转动角度而定,角度越大越应表现鼻梁的挺直。 男性鼻梁的中部因鼻骨隆起而凸起,整体轮廓比女性大。儿童的鼻子鼻梁短小,有很柔和的弯曲、上翘,非常可爱。 (3)嘴的画法 嘴由口中缝、口角、上下唇组成,和眼睛一样具有丰富的表情。画正面嘴时先画出山形的上唇,接着画出弧线形的下唇 且比上唇稍厚,唇角略翘起。中缝线条要画得浓重并表现出上唇尖的形状。嘴上的润色可表现出上妆后的感觉,下唇画出高光。斜面嘴的 轮廓与正面相同,但因透视而显得左右唇的长度不同。 画侧面嘴时也要先画出一个三角形, 注意上唇要突出于下唇,切忌画成“地包天”,同时侧面嘴要与人中、下巴顺畅连接。画男性嘴时,可着重表现口中缝 的线条强弱的变化,不能完整地画出上下唇的轮廓。 2.面部比例 我国传统绘画对成人的头部描绘归纳出“三停五眼”的规律,它有利于我们更好地掌握面部五官的大小和位置。“三停”是指在正面平视时,从发际至眉毛为“一停”,眉毛至鼻底为“二停”,鼻底至下颏为“三停”。耳朵位于“二停”位置且等于一个停长。 “五眼”指在正面平视人面部时,把左右耳孔水平连线分成五等份,面部总宽度为五个眼的长度,即左耳→左眼外缘→左眼→两眼之间→右眼→右眼外缘→右耳。 此外,眼睛的位置在头长的1/2处左右,儿童的眼睛要低 教师带领学生简单表现鼻子,重 点强调鼻梁 教师分步骤带领 学生画正面和侧面的嘴的基本形,在此基础上学生完成正侧面完整的嘴形。 在主要五官掌握要领的基础上学生进行独立的五官创作练习,可分正侧斜面。 利用图片讲解比例,反复强调促使学生牢记。 学生自己利用手中的正面人物肖像划分三停五眼比例

画漫画软件

AI,CRD,这两个是矢量软件,可以画画类似喜洋洋灰太狼这种简单风格的卡通,鼠标可以轻易完成。 当然市场的主流还是comicstudio,如果能调试好就用这个吧,很专业,尤其是那个自动修线的功能简直王道到逆天。。。。 sai也是个不错的软件,和cs一样专业,非常值得一试! 另外还有一个oc,就是opencavans,这个软件的特点就是-----实用~,没有乱七八糟很难用上的功能,线条很流畅,上色是漂亮的水彩风格(很飘逸的~~)而且里面旋转画布的功能比cs更好用,最重要的是它体积小,运行流畅,我现在沟线都用这个。不过oc最好用4.0以下的版本,以上的版本经常不稳定,文件保存失败(你知道我画了5、6个小时后前功尽弃的那种心情吧55) 还有著名的painter,闪光点是画笔丰富,绝对专业画家软件,画漫画当然也没问题,上色那绝对是王道! 当然以上几个除了painter都是漫画专用软件,不适合用来上色,画插画的话,还需要配合photoshop或者painter(ps的沟线效果简直惨不忍睹,你说世界第一的图形软件勾起线来怎么就那么鸡肋?) 还有lz说的情况也很有可能是板子的问题,如果真是那样换块板吧!wacom当然王道,不过还得问问钱包。。。。。。 以上是鄙人的一点看法,lz看着办吧! 推荐大碗岛学习漫画网站,是学习漫画的好地方。 00 美少年的画法 00 G笔勾线的技巧 01 国内漫画封面设计教学 02 现学现画动漫造型 03 萌少女 04 日本漫画名家的艺术世界2 05 新世纪卡通漫画技法光影篇 06 新漫画彩画技法 07 影视卡通漫画绘画技法1表情篇 08 卡通动漫30日速成美少女篇

Qt实现自定义按钮的三态效果

Qt实现自定义按钮的三态效果 好久之前做的一个小软件,好长时间没动过了,在不记录下有些细节可能都忘了,这里整理下部分功能的实现。按钮的三态,指的是普通态、鼠标的停留态、点击态,三态是界面交互非常基本的一项功能,Qt中如果使用的是原始的按钮,三态的效果是有的,鼠标放上去会变色,点击的时候有凹陷的效果,工具栏中的图标也具备三态效果,但是如果自定义的图标这个效果就没有了。下面整理下自定义按钮图标的方法,先看下我做的效果图:图中表示了鼠标放在按钮上和按下的效果,完成了基本的三态,下面说下我的具体实现过程。资源准备首先要准备好对应状态的按钮图标,按钮图标可以从网上搜集,图标需要找png格式的,ico格式的可以使用工具转换为png格式的,而且是背景透明的png格式,要想实现不同状态对应不同的效果还需要处理出其他状态,这就得靠PS来完成了,使用PS也非常简单,我这里使用PS的内阴影来实现按下的效果,用斜面和浮雕来实现鼠标停留效果。具体设置如下面两幅图所示:图:使用内阴影实现的按下效果图:使用斜面和浮雕实现的鼠标停留效果处理好后的图标如下图。加入工程将处理好的图标文件放入工程文件夹下,新建Qt-Qt资源文件。输入文件名保存并加入工程。依次添加前缀,添加文件将文件

加入工程,如下图所示。这些文件添加到工程后就可以在界面设计中使用,很多人在界面设计中改变按钮的样式会直接选择按钮图标,如下图所示。通过选择按钮的icon设置对应大小来实现,然而这样的一个效果就是按钮仍然是有背景和边框的,效果如下图所示。因此很多人的实现方法是通过继承QToolButton或者重绘按钮来实现,然而这些操作仍然相对麻烦,经过对比和查找,这里使用StyleSheet来实现。找到对应的按钮,先在界面编辑中编辑对应的样式表,这里添加border-image,对应普通情况下的按钮图标。然后在主程序中在按钮使用之前指定其他两种状态所对应的图标,代码非常直接,就是指定每种状态对应的文件,QPushButton:hover标示鼠标悬停所对应的状态,QPushButton:pressed则对应鼠标点击的状态,代码如下,注意包含的头文件。#include ui->play_button->setStyleSheet("QPushButton{border-ima ge: url(:/new/icons/icons/play-pause.png);}" "QPushButton:hover{border-image: url(:/new/icons/icons/play-pause-hover.png);}" "QPushButton:pressed{border-image: url(:/new/icons/icons/play-pause-pressed.png);}");

____画漫画,跟我学呀 漫画速成技法

画漫画跟我学呀 _____画漫画技法 【转】喜欢画漫画的你~怎容错过呢改变动画人物的表情并不难,但是了解在不同情绪下面部表情的特征会很有益。本教程将说明脸上不同部位是如何协调运动来传达不同情绪。一旦你掌握随心所欲改变面部表情的方式,就可以画出自己所想到的任何表情。 面部表情 首先,我们开始学习“悲哀”表情的画法,这是一种相当普通的情绪。本图是一个典型的动画人物的脸,但是注意一下已产生的变化。在这种情况下,人物情绪的最明显特征是眉毛。请注意眉毛内部的顶端是如何向上弯曲的。同时她的下眼框略微向上弯曲,而上眼皮呈更明显的圆形曲线。弯曲下眼框能表现压迫,悲伤或忿怒的情绪;而在这情况下,眉毛的形状向我们说明人物处于悲伤状态。另外,注意嘴的形状,它很小,且嘴角向下弯曲。所以从整体来看,好像她就要大哭一场了(所谓:樱唇微开娥眉蹙,一颦一泪总关情)。 看看这幅图:他的悲哀就要含蓄些了。人物看起来很沮丧,但没有上图中那么忧伤。他的眼睛比较小(也许因为是男的吧),嘴也比较大并且向下弯曲得也不是很明显。眉毛的角度以及呈拱形的下眼框仍然会让你觉得他正在为某事心烦(大男人不好做,再辛苦也不说...)。 这一张图里的人物表情介于悲、愤之间。眉毛明显地弯下来,嘴巴看起来像在喊

叫,两者都表明他处于疯狂状态,不过他的眼珠还是画得非常大。这使他看起来像是在生气,或受到了伤害或者在为谁谁谁心烦意乱。 这家伙明显是在斥责谁,即使他并没有大喊大叫(with the sound of silence...)。^_~现在你可以画出正在生闷气的人物了。在本图中,眉毛贴着眼睛并且眉角画得很尖(我也在眉间画些皱纹),嘴角也明显地向下弯。双眼睛很窄,而且眼珠非常小,这会让他的神情看起来更生气(这种表情感觉蛮阴鸷) 这幅的表情不蛮确定,他既有些困惑又像是心里又对谁不快。高低交错的眉角让人觉得他心里又乱又疑。为了增强表情,也可以把嘴的中间稍微留些空白。 漫画里的人物好像总爱闭着眼说话,其实会有多少人说话时真的那样?但无论如何,闭着眼睛可以表达多种情绪。这幅图里,人物表现得性急或烦恼,但是闭上眼睛的样子也能表达平静,快乐或自以为是的心情。双眼呈弧线向上弯曲,这也能表达极度悲哀和激动的心情。本图中,眉头画得向下些而且嘴是张着的。注意人物的左上唇有些翘起--不论你想表现哪种消极的情绪,不论是你是要画忿怒,不爽或急躁--这种嘴型都是适用的。

八键鼠标自定义办公按键操作步骤

以定义办公常用按键为例介绍自定义用法: 一、双击配置具图标,如图,打开配置工具页面如下图 二、下面可以开始我们的自定义之旅吧: 进入界面后,首先我们要读取设备参数,这时配置软件会自动读取鼠标的 参数点击确认, 我们现在以办公常用键来自定义这款鼠标的按键, 正常情况,我们的鼠标左,右键和滚轮(中键)不需要重新定义,我们就将“Back”键“Forward”键和“DPI 循环切换键”, 自定义为办公软件经常用到的是“Ctrl C”组合键“Ctrl V” 组合键和快捷方式“打开默认邮件主页”

我们先来将“Forward”键,定义为“Ctrl V”,在按键定义区域找到“Forward”键, 在右下角箭头下拉选项中选中“Ctrl V”键, 如下图:

选中后按左键确认,变成如图示 再来将“Back”键,定义为“Ctrl C”, 在按键自定义区域找到“Back”键,在右 在右下角箭头下拉选项选中“Ctrl C”键,如图: 选中后按左键确认, 变成如图示

现在我们将“DPI 循环切换键”键,定义为“打开默认邮件主页”, 在按键自定义区域找到 “DPI 循环切换键”键, 在右下角箭头下拉选项选中 “打开默认邮件主页”,如图: 选中后按左键确认,变成如图示 最后我们将“免双击键”键, 定义为“打开我的电脑”, 在按键自定义区域找到 “免双击键”键, 在右下角箭头下拉选项选中 “打开我的电脑”,如图 选中后按左键确认,变成如图示

现在四个按键设置完毕后,点击右上角 ,出现如下对话框, 出现如下对话框,点击“确定” 鼠标会自动重启,重启后按键功能定义完成。 现在我们来对比一下定义前,定义后的按键功能图:定义前功能键

从零开始学漫画-(跟我学画漫画入门教程)

从零开始学漫画-(跟我学画漫画入门教程) 教画漫画01-手绘漫画工具 ★☆★☆★☆手绘漫画用的工具★☆★☆★☆ 在进行漫画创作之前,首先应该了解创作漫画应必备的基本工具。由于漫画风格多种多样,绘制时所用到的工具也五花八门,我们这里所介绍的只是几种较常用的基本绘制工具。绘制漫画时,除经常用到的铅笔、橡皮外,还需要一些专门的工具。比如原稿纸、网点纸、尺子、刮网刀、拷贝台等。下面详细介绍一下这些工具: 铅笔:

主要用来打草稿,一般用自动铅笔较好,可根据个人习惯选用不同硬度的笔芯,还可以用木杆铅笔,比如“中华”牌的,一般用HB以上或硬H笔即可。 橡皮: 用来擦去铅笔线或在网点纸上做特殊效果。一定要使用不易使纸张起皱起毛的绘图橡皮。 尺子: 画漫画时需要的尺子大体上有三种:直尺、三角尺、云形尺。直尺用的最多,一般用于画分格框和拉直线,其次是三角尺,用它来画平行线和直角边,云形尺用来画曲线。应注意买尺子时不要买边缘是直角的,最好是买带有斜面的。 墨汁: 需要全部涂黑的地方,用墨汁比用黑墨水涂得更黑更漂亮。涂黑的时候要从外侧开始,沿着画的轮廓线细心地勾出轮廓,注意不要出界,随后把笔饱沾墨汁,将中间部分涂满。 鸭嘴笔: 用来画墨稿中的直线,画出的直线边缘整齐,而且粗细一致。在使用时,“鸭嘴笔”不应直接蘸墨水,而应该用蘸水笔或是毛笔蘸上墨汁后,从鸭嘴笔的夹缝处滴入使用,通过调整笔前端的螺丝来确定所画线段的粗细。画直线时,笔杆垂直于纸面,均匀用力横向拉线,速度不要太快,这样才能画出均匀的直线。 麦克笔: 常用来画大面积的黑或做特殊效果,也可用来画细线。有时,也可以用彩色麦克笔为彩稿上色,与传统风格的彩稿有区别,较前卫,其效果象效果图,有明显的笔触,初学者不易画好。麦克笔分油性、水性两种。 黑墨水: 画线条时用黑墨水的效果很好,和墨汁相比干得快,而且干了以后不易被水溶化晕开。另外,也可用黑广告色来涂黑,好处是黑广告色不会反光,有乌黑的感觉,便于电脑扫描,使用时切忌调水太多或太少。 修正白(白颜色): 用来修改画错、弄脏的部分,白色可以使画面华丽,富于变化,常用的是广告颜料的白颜色。使用时应注意调整好浓度,不同的浓度,将会产生不同的效果,

Android自定义Button按钮

Android自定义Button按钮 Android自定义Button按钮主要可以分成两种形式: 1.通过自定MyButton类来继承Button,将所有效果在类中实现. 2.通过xml文件来改变Button的样式和颜色. 今天我就先讲通过xml文件,稍后封装自定义Button类再补上. TestcActivity [html] package com.example.blueapp;n import android.app.Activity;n import android.os.Bundle;n public class TestcActivity extends Activity {n nnn @Overriden nnn protected void onCreate(Bundle savedInstanceState) {n nnnnnnn // TODO Auto-generated method stubn nnnnnnn super.onCreate(savedInstanceState);n nnnnnnn setContentView(https://www.wendangku.net/doc/2c1639109.html,yout.testc);n nnn }n }n package com.example.blueapp; import android.app.Activity; import android.os.Bundle; public class TestcActivity extends Activity { n@Override nprotected void onCreate(Bundle savedInstanceState) { nn// TODO Auto-generated method stub nnsuper.onCreate(savedInstanceState); nnsetContentView(https://www.wendangku.net/doc/2c1639109.html,yout.testc); n} } testc.xml [html] n n nnnnn nnn n nnnnn nnn n n nnn nnn