Chinaunix首页 | 论坛 | 博客
  • 博客访问: 304860
  • 博文数量: 174
  • 博客积分: 3061
  • 博客等级: 中校
  • 技术积分: 1740
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-04 22:43
文章分类

全部博文(174)

文章存档

2011年(54)

2010年(14)

2009年(30)

2008年(26)

2007年(27)

2006年(23)

我的朋友

分类: WINDOWS

2011-09-02 09:56:27

最近有空,了解一下qml的一些事情,也为自己以后如果需要开发一些ui程序做做准备,比如做做demo,纯粹搞
html,js自己有点不感冒,呵呵,传统client 程序员得思维,当然这样还可以继续研究qt的一些机制。


首先qml 按照我的初步理解,应该是一种 简化版的html,js,css组合模型; 即它抛却了browser的很多指责,仅仅将界面展示布局,界面业务处理 抽象出来实现。  所以从思想上它和html,js,css是类似的,但是实现上或者描述上它更加集中,因为它的任务不需要处理下载,xhr,dom tree,rendering tree等浏览器业务。



先看看它的一些基本语法。

import QtQuick 1.0   // 这个表示引入一些qt内在的对象,比如item,rectangle等,是不是有点像idl

  {              // 这个有点像js的json对象定义格式,定义了一些对象以及它们的属性
     width: 200
     height: 200
     color: "blue"

     Image {
         source: "pics/logo.png"
         anchors.centerIn: parent
     }
 }
其实这个文件时可以直接执行的,它不是用browser来执行的,而是用一个叫做qmlview的程序,当然你也可以认为它也是一个特殊用途的browser。

效果如下

通过这个效果可以看到,图片居中显示在一个矩形内。


回到source code。

可以看到我们定义了一个对象叫做rectangle , 它有一些外观属性,然后有一个子对象,这个子对象也有一些外观属性。 这些都很直观,但是一般在使用的时候,你得知道你有哪些属性可以设置。像image的anchors.centerIn 它是不是父类的属性呢?

这些打开qassistant.  QML elements 就可以找到 rectangle, image . 比如image 它派生自 item
,而anchors.centerIn 则恰恰是item提供的属性。



 Rectangle {                   
     width: 200   // item 的属性
     height: 200  // item的属性              
     color: "blue"  // 自己的属性,表示如何fill rectangle

     Image {
         source: "pics/logo.jpg" // 自己的属性
         anchors.centerIn: parent  // item的属性,表示以谁居中,像本例,它就表示在parent内居中
     }
 }

再来看一个关于anchors.xxx 的例子。




下面讲一下qml的注释,qml的注释,和c++一样, // /**/ 都可以。



对象识别。

刚才的例子还是过于简单,对象都没有标识,而只有一个类型。 实际上稍复杂些的例子,就需要给对象一个标识id。 

import QtQuick 1.0   
 Rectangle {             
     width: 200
     height: 200
     color: "blue"

     Image {
     id : img1   // 标识
         source: "pics/logo.png"
         anchors.left : parent.left
         anchors.leftMargin : 5 
     }
     
     Image {
      source: "pics/flower.png"
      anchors.left : img1.right      // 我在左边图片的右边
      anchors.leftMargin : 5 
     }
 }


表达式的使用, qml也支持一些js语法的表达式使用,比如


import QtQuick 1.0   // 这个表示引入一些qt内在的对象,比如item,rectangle等,是不是有点像idl

 Rectangle {              // 这个有点像js的json对象定义格式,定义了一些对象以及它们的属性
     width: 200
     height: 200
     color: "blue"

     Image {
      id : img1
         source: "pics/logo.png"
         anchors.left : parent.left
         anchors.leftMargin : 5 
     }
     
     Image {
      source: "pics/flower.png"
      anchors.left: img1.right
      anchors.leftMargin : img1.width / 2
     }
 }


不过这儿有个注意事项,就是这个表达式使用的时候要注意类型。

  •  : real
  •  : AnchorLine

比如 你不能将一个数字计算的表达式用在一个AnchorLine 上, 也就是说如果
anchors.left: img1.right + 5  // 这样将发生错误 ,因为类型不匹配


属性变更通知

import QtQuick 1.0   
 Rectangle {             
     width: 200
     height: 200
     color: "blue"

     Image {
      id : img1
         source: "pics/logo.png"
         anchors.left : parent.left
         anchors.leftMargin : 5 
     }
     
     Image {
      source: "pics/flower.png"
      anchors.left: img1.right
      anchors.leftMargin : parent.width / 4
       
      onXChanged: console.log("left change 2:",x);  
     }     
 }




这个log实际就是我将窗口水平拖动后产生的一系列输出。

列表属性

children: [
      Text{
      id: txt1
      text: "this is test!"
      anchors.verticalCenter: img2.verticalCenter
      //anchors.topMargin: 5
      },
       
      Image{
      id: img2
      source: "pics/flower.png"
     
      anchors.left: txt1.right
      anchors.leftMargin: 5
      anchors.top: img1.bottom
      anchors.topMargin: 5
      }
     ]   


效果




分组化属性

Grouped properties can be written like this:

  {
     font.pixelSize: 12
     font.bold: true
 }

or like this:

  {
     font { pixelSize: 12; bold: true }
 }
attached 属性  (这个概念我还有点模糊)

import QtQuick 1.0

 Item {
     width: 200; height: 250

     ListModel {
         id: myModel
         ListElement { type: "Dog"; age: 8 }
         ListElement { type: "Cat"; age: 5 }
     }

     Component {
         id: myDelegate
         Text { 
         text: type + ", " + age 
         color: ListView.isCurrentItem ? "red" : "blue" 
         }         
     }

     ListView {
         anchors.fill: parent
         model: myModel
         delegate: myDelegate
     }
 }



事件处理

ListView {
      id: lv1
         anchors.fill: parent
         model: myModel
         delegate: myDelegate
         
         MouseArea {
          anchors.fill: parent
          onClicked: {
          var i = lv1.indexAt(mouse.x,mouse.y);
          if(i != -1)
          {
          lv1.currentIndex = i;
          }
          }
         }
     }



上图中算中item为红色。

阅读(9075) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~