Go语言的GUI方案,与Qt和QML都能绑定,也有从头写的gxui

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go语言的GUI方案,与Qt和QML都能绑定,也有从头写的gxui相关的知识,希望对你有一定的参考价值。

半官方:https://godoc.org/golang.org/x/exp/shiny

作者:王益
链接:https://www.zhihu.com/question/22483719/answer/21753337
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

我从2014年底开始使用 andlabs/ui · GitHub 开发GUI 程序。这个库支持多个操作系统,包括 Linux 和 MacOSX。而且 API 和程序结构充分使用了 Go 的特色语法:lambda、goroutine 和channels。看看这个库的代码,能充分意识到 Go 其实比 Objective-C、Java、C++、Python、Tcl/Tk、MATLAB 都更适合用来开发 GUI 程序——程序简练,功能丰富,执行高效。唯一的遗憾是,它只支持桌面操作系统。我问了一下作者可否支持 mobile 开发(support iOS? · Issue #64 · andlabs/ui · GitHub,作者觉得 mobile GUI 程序写法和桌面GUI 程序差异太大,应该用另一个库来支持 mobile GUI 的开发。

以下回答来自我的博客:GUI Programming Using Go;希望起到收集汇总一些信息的作用。

Go语言里有个有意思的话题,是如何用Go语言写GUI程序。因为Go的标准packages没有用来写GUI程序的,所以很多人在问,能否有一个标准GUI package?

2013年6月,有一个Go Authors的访谈。其中也有人问到上述问题。Rob Pike直接提到他年轻的时候设计的Newsqueak语言,一个专门用来写GUI程序的语言。Andrew Gerrand赶紧把话题拉回来,介绍了几个他看到的比较好的第三方GUI packages。这段访谈的缩减版可以在Go的主页里找到:

我用过几个比较方便的GUI toolkit,包括GTK和Qt。根据这么点儿经验,我赞同Rob Pike对Go语言在GUI编程中的前景:

  1. Go支持memory garbage collection。这样可以方便的管理widgets的memory消耗。用过GTK的人应该都被迫理解基于C设计的floating reference机制吧?这篇gotk3的作者写的博客,专门介绍了如何基于Go语言重新设计GUI widgets的内存管理机制。值得一读,很有启发!

  2. Go的concurrency应该能方便的让GUI不被后台处理拖累,保持界面反应的流畅。大家还记得当年BeOS(要不是Jobs介入,Apple本来要收购的;最后收购了NeXT)吗?它的一个重要特点就是使用multithreading技术保证GUI总是有反应。

虽然Andrew Gerrand当时举得例子go.uik的作者已经把项目关掉了,并且号称“如果再打开,一定要重写”:

This project is closed. If I begin again, it will be from scratch and using lessons learned while writing go.uik. Of course, if I begin again it will still be called go.uik.

但是其他项目层出不穷。我上周在我的iMac(Mavericks)上尝试了go-qt5,这是一个Qt 5的Go语言binding。今天刚刚尝试了gotk3,一个完全用Go的内存管理方式(idiomatic)写的GTK的binding。感觉都很不错。因为这两个项目都在快速演进中,它们主页上介绍的用法和实际操作略有不同。这里列一下我的操作。

go-qt5

主页上的tutorial在我的环境下不完全好使,我的总结在这里。或者简单记录操作流程如下:

  1. 用Homebrew安装5.2:

     brew update && brew doctor && brew install qt5
    

    这会提醒你说“目前世界上大部分人都在用Qt4,要不不要这么激进用Qt5啊?”(Homebrew真的很人性化。)但是很不好意思的,Qt4不支持最新版本的OS X Mavericks。

  2. 检出go-qt5代码:

     mkdir -p /home/you/go-qt5
     export GOPATH=/home/you/go-qt5
     go get github.com/salviati/go-qt5
    
  3. Build go-qt5

基本上可以按照go-qt5的README来操作。有几点要注意:因为Homebrew不会在/usr/local/bin下面创建指向Qt 5的symbolic links,所以你调用qmake的时候可能需要用全路径名:/usr/local/Cellar/qt5/5.2.0/bin/qmake。另外,运行自己写的Qt程序的时候,要记得把链接库$GOPATH/src/github.com/salviati/go-qt5/lib/libgoqt5drv.1.0.0.dylib和你的程序放在同一个目录下。

gotk3

在Mac OS X上得安装和使用基本上就根据这篇文章来,但是有两点需要注意:

如果build GTK3的时候,报错找不到-lpython2.7,可以通过LDFLAGS环境变量告诉jhbuild Python的库在哪里。比如:

LDFLAGS=-L/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/usr/lib/ jhbuild build meta-gtk-osx-gtk3

另外,编译gotk3的时候,不需要用jhbuild shell启动一个新的shell,只需要设置一下环境变量:

export PKG_CONFIG_PATH=/Users/wangyi/gtk/inst/lib/pkgconfig:/Users/wangyi/gtk/inst/share/pkgconfig:/usr/lib/pkgconfig    

然后就可以通过go get下载和编译gotk3了。

go get github.com/conformal/gotk3/gtk

 

https://github.com/go-qml/qml
https://github.com/google/gxui

https://www.zhihu.com/question/22483719

 

以上是关于Go语言的GUI方案,与Qt和QML都能绑定,也有从头写的gxui的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 和 Qt Quick QML 应用程序中实现简化的双向数据绑定

利用Qml与Golang打造Gui客户端

在没有 QML 的情况下部署 Qt 项目

为脚本创建基于 Qt 的 GUI

✿4-The Basics-Qt Quick and QML

✿4-The Basics-Qt Quick and QML