Go语言使用Qt开发界面

Go 语言跨平台,Qt 也跨平台,两个跨平台的框架/语言愉快地交织在了一起。我本应该获得了这种如梦一般的幸福时光才对。可是,为什么,会变成现在这样呢……(白学家梗)

Go 的 UI 库

Go 语言本身是没有 UI 库的,不过有许多第三方的库支持将 Go 语言绑定到其他 UI 库,比如 Qt、GTK。本文就介绍使用这个 Qt 绑定的库,therecipe/qt

环境搭建(windows)

非 windows 或者需要参数说明的可以参考官方的wikiwindows 安装

Qt 安装

下载你需要的版本,下载地址。如果需要安装 VS 编译器什么的也可以参考下我之前的文章,Qt5.12.0 + VS2017 环境搭建

therecipe/qt 安装

终端执行下面的命令:

# Go的环境变量配置,配置过一次就不用在设置了
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn

# 下载therecipe/qt库
go get -v -tags=no_env github.com/therecipe/qt/cmd/...

执行 qtsetup

下载好库后会在%GOPATH%/bin目录下出现几个帮助执行绑定工作的可执行文件

Go-Use-Qt-2020-04-19-20-06-08

现在还需要根据你本地的 Qt 再配置下编译环境,就是执行上面目录中的 qtsetup,但是直接执行是会有问题的:


Go-Use-Qt-2020-04-19-20-23-26

需要配置几个环境变量,qtsetup只需要执行一次。如果你有多个环境要切换,需要注意和编译时的环境变量保持一致,可以用 bat 临时设置下环境变量方便切换,下面就是 bat 的内容:

SET PATH=%PATH%;%GOPATH%\bin;

REM 配置Qt目录和Qt版本
SET QT_DIR=C:\Qt\Qt5.12.5
SET QT_VERSION_MAJOR=5.12.5

REM 编译32位程序,前提是你的Qt有Mingw32套件
SET GOARCH=386

REM 默认使用Mingw编译,使用MSVC编译的话开启下面的选项,qtsetup可以运行,但是后面qtdeploy会报cgo相关错误
REM SET QT_MSVC=true
REM SET PATH=%PATH%;C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build;
REM call vcvarsall.bat amd64_x86

REM 语言绑定安装,只需执行一次
qtsetup.exe

demo 运行

创建一个 Go 项目目录

终端运行:

mkdir qtwidget && cd qtwidget
go mod init

main.go

在项目目录新建一个 main.go 文件,复制下面的内容:

package main

import (
    "os"

    "github.com/therecipe/qt/widgets"
)

func main() {

    // needs to be called once before you can start using the QWidgets
    app := widgets.NewQApplication(len(os.Args), os.Args)

    // create a window
    // with a minimum size of 250*200
    // and sets the title to "Hello Widgets Example"
    window := widgets.NewQMainWindow(nil, 0)
    window.SetMinimumSize2(250, 200)
    window.SetWindowTitle("Hello Widgets Example")

    // create a regular widget
    // give it a QVBoxLayout
    // and make it the central widget of the window
    widget := widgets.NewQWidget(nil, 0)
    widget.SetLayout(widgets.NewQVBoxLayout())
    window.SetCentralWidget(widget)

    // create a line edit
    // with a custom placeholder text
    // and add it to the central widgets layout
    input := widgets.NewQLineEdit(nil)
    input.SetPlaceholderText("Write something ...")
    widget.Layout().AddWidget(input)

    // create a button
    // connect the clicked signal
    // and add it to the central widgets layout
    button := widgets.NewQPushButton2("and click me!", nil)
    button.ConnectClicked(func(bool) {
        widgets.QMessageBox_Information(nil, "OK", input.Text(), widgets.QMessageBox__Ok, widgets.QMessageBox__Ok)
    })
    widget.Layout().AddWidget(button)

    // make the window visible
    window.Show()

    // start the main Qt event loop
    // and block until app.Exit() is called
    // or the window is closed by the user
    app.Exec()
}

编译

编译就是执行 qtdeploy 命令,具体参数可以自己运行 qtdeploy -h 查看,这个终端文件也是在%GOPATH%/bin的,如果你的编译环境有多个也可以用 bat 配置下,与上面的类似,新建个 build.bat 拷贝下面的内容并运行:

SET PATH=%PATH%;%GOPATH%\bin;

REM 配置Qt目录和Qt版本
SET QT_DIR=C:\Qt\Qt5.12.5
SET QT_VERSION_MAJOR=5.12.5

REM 编译32位程序
SET GOARCH=386

REM 默认使用Mingw编译,使用MSVC编译的话开启下面的选项,qtsetup可以运行,但是后面qtdeploy会报cgo相关错误
REM SET QT_MSVC=true
REM SET PATH=%PATH%;C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build;
REM call vcvarsall.bat amd64_x86

REM 语言绑定安装,只需执行一次
REM qtsetup.exe

REM 编译具体项目时运行
qtdeploy build desktop ./

生成的可执行文件在当前目录/deploy/windows,本体 exe 和相关的 dll 都在这个目录下

Go-Use-Qt-2020-04-19-20-52-51

注:我使用 Mingw 编译成功,但是 MSVC 编译会有 cgo 的错误,太难用了...

main.go:6:2: G:\Go\src\go_learn\qtwidget\vendor\github.com\therecipe\qt\widgets\minimal_cgo_windows_windows_386.go: invalid #cgo verb: #cgo MSCFLAGS: -nologo -Zc:wchar_t -FS -Zc:strictStrings -O2 -MD -W3 -w44456 -w44457 -w44458 -D_ALLOW_KEYWORD_MACROS -DUNICODE -D_UNICODE -DWIN32 -D_ENABLE_EXTENDED_ALIGNED_STORAGE -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG

运行结果

demo 执行效果如下:

Go-Use-Qt-2020-04-19-20-53-54

项目代码

虽然没几行,不过如果懒得复制的话也可以直接下载,Github 链接,喜欢的话记得点个 Star~

使用感受

  • 编译的命令行配置中没有多核编译的选项,改个代码编译起码要几分钟,很难受
  • 这个库没有官方文档,wiki直接指向 Qt 的文档,所以调用都要在源码搜,看看转换函数咋写的,把 Qt 函数名大写、函数重载就名字后面加序号等,很蛋疼...
  • 语法也不适应,Qt 的 connect 改成了类似方法回调的样子:btn.ConnectClicked(func(){})
  • 支持不完善,使用 MSVC 编译会有 cgo 的错误,还是直接通过 rpc 调用或者 http 调用来让 Go 和 Qt 通信比较好
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容