找了很长时间go的gui库,试了gtk,准备试qt的时候发现了这个qml库,试了下很好用。

##准备工作

**1、Go 1.2RC1**

go的版本应该不能低于这个,我是在1.2RC发布当天升级后发现的qml,并测试的。

**2、qml**

项目主页 https://github.com/niemeyer/qml 目前还是alpha版。

项目主页里面有各个平台的安装方法

装好后会顺带把qtcreator的ubuntu sdk plugin也给装上。

然后运行qml的示例程序 github.com/niemeyer/qml/examples/particle

![qml](http://images.cnblogs.com/cnblogs_com/hangxin1940/508415/o_qml1.png "qml")

##Go qml

这里尝试写一个简单的登录窗口

![qml](http://images.cnblogs.com/cnblogs_com/hangxin1940/508415/o_qml2.png "qml")

**1、编写qml**

打开ubuntu sdk creator,设置下编译环境

![qml](http://images.cnblogs.com/cnblogs_com/hangxin1940/508415/o_qml3.png "qml")

在 tools -> options 中 build & run 条目中找到 qt versions,然后添加qmake的路径

32-bit: /usr/lib/i686-linux-gnu/qt5/bin/qmake
64-bit: /usr/lib/x86_64-linux-gnu/qt5/bin/qmake

然后创建一个qml项目,这里可以尝试创建一些示例项目,这里我选择了 qt quick2 ui。

他会创建3个文件,一个工程文件,一个源码文件,还有一个与当前用户有关的xml。

首先修改工程文件,加入ubuntu sdk的import路径。

修改`qmlproject`后缀名的文件,在最后面`List of plugin directories passed to QML runtime`注释下面加入几行:

/* List of plugin directories passed to QML runtime */
importPaths: [ "." ,"/usr/bin","/usr/lib/x86_64-linux-gnu/qt5/qml" ]

然后编辑`qml`后缀的UI文件:

// 这里用到了quick2和ubuntu sdk的模块
import QtQuick 2.0
import Ubuntu.Components 0.1
import Ubuntu.Layouts 0.1

MainView {
id: root
objectName: "mainView"
applicationName: "LoginWindow"

width: units.gu(50)
height: units.gu(30)

Page {
title: "Login Window"
objectName: "mainPage"
Column {
anchors.leftMargin: units.gu(2)
anchors.rightMargin: units.gu(2)
anchors.topMargin: units.gu(2)
anchors.bottomMargin: units.gu(2)
anchors.fill: parent
spacing: units.gu(3)
width: parent.width

Item {
anchors.left: parent.left
height: txtName.height
anchors.right: parent.right

Label {
id: lblUsername
width: units.gu(7)
anchors.verticalCenter: txtName.verticalCenter
text: "User Name"
}

TextField {
id: txtName
anchors.left: lblUsername.right
width: parent.width - lblUsername.width - units.gu(4)
anchors.leftMargin: units.gu(4)
objectName: "txtName"
placeholderText: "type your username"

//焦点变更事件
onFocusChanged: {
if(focus){
//当获得焦点时就用js控制台输出,qml会把它默认转到绑定语言的控制台标准输出
console.log("qml: txtName focused")
}
}
onTextChanged: {
console.log("qml: " + txtName.text)
//goObject将会被注入,它是一个go对象
//这里要注意,go对象的属性或方法在go层面必须是暴露的
//但在qml中被js调用时首字母必须小写,多试几次就知道了
goObject.txtNameChanged(txtName.text)
}
}
}

Item {
anchors.left: parent.left
height: txtName.height
anchors.right: parent.right

Label {
id: lblPasswd
width: units.gu(7)
anchors.verticalCenter: txtPasswd.verticalCenter
text: "Password"
}

TextField {
id: txtPasswd
anchors.left: lblPasswd.right
width: parent.width - lblPasswd.width - units.gu(4)
anchors.leftMargin: units.gu(4)
objectName: "txtPassword"
echoMode: TextInput.Password

text: "password"
}
}

}
}

}

然后在qtcreator的build菜单中选择run,它会用qmlscene来加载这个ui,以便调试效果。

在qtcreator中design好像有点问题,所以不建议这种所见即所得的编辑方法,这在ubuntu 13.10版本中,qt5正式引入后可能会改善。

**2、编写main.go**

在qml项目目录编写main.go

package main

import (
"github.com/niemeyer/qml"
"log"
)

// 用于注入qml的go结构
type GoObject struct {}

func (g *GoObject) TxtNameChanged(text string) {
log.Println("go: ",text)
}

func main() {
// 初始化qml
qml.Init(nil)
// 创建引擎
engine := qml.NewEngine()

// 加载qml
component, err := engine.LoadFile("atomqq.qml")
if err != nil {
panic(err)
}

// 获得上下文
context := engine.Context()

// 将一个go对象注入进qml上下文
goObject := GoObject{}
context.SetVar("goObject", &goObject)

// 创建qml窗口
window := component.CreateWindow(nil)

// 获得根控件
root := window.Root()

// 根据Name属性获得空间
//obj := root.ObjectByName("mainPage")
//obj.Set("title", "xx登录窗口")

// 显示窗口
window.Show()

// 获得根控件的一个属性
width := root.Int("width")
log.Println(width)

// 设置一个属性的值
// 这里将窗体的宽度增加1个像素,来出发qt对窗体进行重回
// 由于使用的qml、qt5还有go在ubuntu中都不是稳定版,可能时某个里面还有bug.
// qml窗体在初始化时,貌似没有画好,必须得手动重绘一次
root.Set("width", width + 1)

// 等待退出
window.Wait()
}

然后go run main.go

![qml](http://images.cnblogs.com/cnblogs_com/hangxin1940/508415/o_qml4.png "qml")

可以看到qml的信号被正确触发,控制台也有输出了

ubuntu下使用golang、qml与ubuntu sdk开发桌面应用 (简单示例)的更多相关文章

  1. ubuntu下使用golang、qml与ubuntu sdk开发桌面应用

    ubuntu下使用golang.qml与ubuntu sdk开发桌面应用 (简单示例) 找了很长时间go的gui库,试了gtk,准备试qt的时候发现了这个qml库,试了下很好用. 准备工作 1.Go ...

  2. Ubuntu 下ibus拼音输入法启用 (ubuntu 16.04

    Ubuntu 下ibus拼音输入法启用 我安装的是英文版的ubuntu 16.04,打开只带英文,并没有中文. 设置输入法为iBus 从system settings 进入language suppo ...

  3. Ubuntu下安装Golang并测试HelloWorld

    Intel Core i5-8250U,Ubuntu 18.04(安装在虚拟机Oracle VirtualBox 5.2.12上),Go 1.11, 安装步骤如下: -进入Go文档官网: https: ...

  4. Ubuntu下全命令行安装Android SDK

    为了在AWS云服务器上实现自动化打包Android APP的APK包,我需要远程命令行环境下安装Android SDK,当然还要用代理或者科学上网,这里简单整理一下过程: 首先,由于墙的原因,Andr ...

  5. ubuntu下安装golang

    1.安装 sudo apt-get install golang 2.查看go的安装路径 go env 查看 GOROOT="/usr/lib/go-1.6" 3.修改环境变量 e ...

  6. ubuntu下建立golang的build脚本

    在不在os中设置gopath,goroot的情况下 建立build.sh文件,文件内容如下: export GOARCH="386"export GOBIN="/home ...

  7. ubuntu下配置JDK,Eclipse,android开发环境

    前言:由于我的电脑是64位的,所以下面使用的jdk ; eclipse : 包括我安装的 ubuntu12.0.4LTS 都是64位的:如果你是32位请下载32位的系统以及jdk,eclipse等软件 ...

  8. Ubuntu下VirtualBox虚拟机与主机机互相ping通的简单配置心得

    virtualbox 是个非常优秀的软件,通常与主机之间有3种方式,Bridged方式,NAT方式,host-only方式,安装的默认方式是NAT,可是这样的方式在virtualbox虚拟机下有个缺点 ...

  9. Ubuntu下Django初体验(一)——开发环境搭建

    一.开发 环境搭建 1. linux下一般有自带的python,如果对版本不满意,可以再自行安装. 2. 安装ipython(推荐) sudo apt-get install ipython sudo ...

随机推荐

  1. vue 如何拿到后台传回的富文本中的img,进行9宫格排列展示以及相关处理

    描述: res.data.list 返回的数组, 数组中的每个对象有一个 content,就是传回来的富文本的内容,要拿到这里面的所有的img,进行9宫格排列处理: 1.let img = this. ...

  2. Python3 里面的线程池

    from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor import time def task(i): print ...

  3. python魔法方法-单目运算及一般算数运算

    在比较的魔法方法中,我们讨论了魔法方法其实就是重载了操作符,例如>.<.==等.而这里,我们继续讨论有关于数值的魔法方法. 1.单目运算符或单目运算函数 __pos__(self) 实现一 ...

  4. 洛谷P1525 关押罪犯

    To 洛谷.1525 关押罪犯 题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用 ...

  5. Python面向对象——多态

    多态的作用 调用不同的子类将会产生不同的行为. 多态是在继承上实现的. 图解多态1 图解多态2 图解多态1代码 class AudioFile: def __init__(self, filename ...

  6. 数值分析之Neville's Algorithm

        Neville插值方法详解 牛顿的插值方法涉及两个步骤:计算系数,随后评估多项式. 如果插值运作良好使用相同的多项式在x的不同值处重复执行. 要是一点是内插,一种单步计算插值的方法,如Nevi ...

  7. spring如何解决单例循环依赖问题?

    更多文章点击--spring源码分析系列 1.spring循环依赖场景2.循环依赖解决方式: 三级缓存 1.spring循环引用场景 循环依赖的产生可能有很多种情况,例如: A的构造方法中依赖了B的实 ...

  8. .Net机试题——编写一个BS架构的多层表结构的信息管理模块

      要求: 编写一个BS架构的多层表结构的信息管理模块,用户体验需要注意.包含错误处理,需要最终能完整的跑起来.页面可以不美化,但是整洁还是必须的.在不能完成详细功能需求的情况下优先保证基本功能. 1 ...

  9. Introduction to pinatrace annotate version 2: a look into latches again

    https://fritshoogland.wordpress.com/2017/12/22/introduction-to-pinatrace-annotate-version-2-a-look-i ...

  10. 奇怪吸引子---RayleighBenard

    奇怪吸引子是混沌学的重要组成理论,用于演化过程的终极状态,具有如下特征:终极性.稳定性.吸引性.吸引子是一个数学概念,描写运动的收敛类型.它是指这样的一个集合,当时间趋于无穷大时,在任何一个有界集上出 ...