找了很长时间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. js基础梳理-究竟什么是变量对象,什么是活动对象?

    首先,回顾下上篇博文中js基础梳理-究竟什么是执行上下文栈(执行栈),执行上下文(可执行代码)?的执行上下文的生命周期: 3.执行上下文的生命周期 3.1 创建阶段 生成变量对象(Variable o ...

  2. iOS 技术篇:如何处理多个网络请求的先后(依赖)关系

    在开发过程中,不知你有没有碰到过在一个页面 用到了多个网络请求,而且根据业务需求,需要有次序的执行A B C 网络请求? 你可能会想到,我在A的请求成功回调里去处理B,在B的回调里去请求C,但你后来会 ...

  3. 2016年3月17日Android学习笔记

    1.Java.io.ByteArrayOutputStream.writeTo()方法实例 java.io.ByteArrayOutputStream.writeTo(OutputStream out ...

  4. Java内存区域与内存溢出异常--HotSpot虚拟机对象探秘

    以常用的HotSpot和常用的Java堆为例,深入探讨HotSpot虚拟机在Java堆中对象分配.布局和访问的全过程 1.对象的创建 ①虚拟机遇到一条new指令后,首先将去检查这个指令的参数是否能够在 ...

  5. 在Editplus直接运行程序的步骤

    https://www.cnblogs.com/myitroad/p/4841875.html

  6. .net framework 4.6 asp.net mvc 使用NLog

    NUGET添加NLog和NLog.Config的引用 配置NLog.config <?xml version="1.0" encoding="utf-8" ...

  7. perl 读写文件

    #http://perlmaven.com/open-and-read-from-files #mode operand create truncate#read < #write > y ...

  8. normalize.css的使用

    normalize.css有下面这几个目的: 保护有用的浏览器默认样式而不是完全去掉它们一般化的样式:为大部分HTML元素提供修复浏览器自身的bug并保证各浏览器的一致性优化CSS可用性:用一些小技巧 ...

  9. C#模拟HTTP请求Post JSON

    前言 因为接口是http的,我们站点是https的,不能https直接ajax请求http,所以需要在SharePoint中开发一个模拟请求Ajax的Service,分享一下. var httpWeb ...

  10. 国内混合APP开发技术选型

    http://www.sunzhongwei.com/weex-react-native-ionic-technology-selection 选谁? 企业级应用是要考虑性能和流畅度的, 如果只是做个 ...