golang跨平台Qt GUI开发绑定插件库qt的使用
Golang跨平台Qt GUI开发绑定插件库qt的使用
介绍
Qt是一个免费开源的widget工具包,用于创建图形用户界面以及跨平台应用程序,可以在各种软件和硬件平台上运行,而底层代码库几乎不需要修改。
Go(又称Golang)是Google设计的一种编程语言。
therecipe/qt允许你完全用Go编写Qt应用程序,同时还支持JavaScript/TypeScript、Dart/Flutter、Haxe和Swift等语言绑定。
除了提供的语言绑定外,therecipe/qt还大大简化了Qt应用程序在各种软件和硬件平台上的部署。
在编写本文时,几乎所有Qt函数和类都可以访问,你应该能够找到构建功能齐全的Qt应用程序所需的一切。
安装
以下说明假设你已经安装了Go和Git
(实验性)无cgo版本(如果你是新手并想测试绑定,请先尝试这个)
Windows
go get -ldflags="-w" github.com/therecipe/examples/basic/widgets && for /f %v in ('go env GOPATH') do %v\bin\widgets.exe
macOS/Linux
go get -ldflags="-w" github.com/therecipe/examples/basic/widgets && $(go env GOPATH)/bin/widgets
默认版本
Windows
set GO111MODULE=off
go get -v github.com/therecipe/qt/cmd/... && for /f %v in ('go env GOPATH') do %v\bin\qtsetup test && %v\bin\qtsetup -test=false
macOS
export GO111MODULE=off; xcode-select --install; go get -v github.com/therecipe/qt/cmd/... && $(go env GOPATH)/bin/qtsetup test && $(go env GOPATH)/bin/qtsetup -test=false
Linux
export GO111MODULE=off; go get -v github.com/therecipe/qt/cmd/... && $(go env GOPATH)/bin/qtsetup test && $(go env GOPATH)/bin/qtsetup -test=false
示例代码
下面是一个简单的Go Qt应用程序示例:
package main
import (
"os"
"github.com/therecipe/qt/widgets"
)
func main() {
// 创建一个应用程序
app := widgets.NewQApplication(len(os.Args), os.Args)
// 创建一个主窗口
window := widgets.NewQMainWindow(nil, 0)
window.SetWindowTitle("Qt Go Example")
window.SetMinimumSize2(400, 300)
// 创建一个中央widget
centralWidget := widgets.NewQWidget(nil, 0)
window.SetCentralWidget(centralWidget)
// 创建一个垂直布局
layout := widgets.NewQVBoxLayout2(centralWidget)
// 创建一个按钮
button := widgets.NewQPushButton2("Click Me", nil)
button.ConnectClicked(func(bool) {
widgets.QMessageBox_Information(nil, "Info", "Button Clicked!", widgets.QMessageBox__Ok, widgets.QMessageBox__Ok)
})
// 创建一个标签
label := widgets.NewQLabel2("Hello Qt with Go!", nil, 0)
// 将控件添加到布局中
layout.AddWidget(label, 0, 0)
layout.AddWidget(button, 0, 0)
// 显示窗口
window.Show()
// 运行应用程序
app.Exec()
}
部署目标
目标 | 架构 | 链接方式 | Docker部署 | 主机操作系统 |
---|---|---|---|---|
Windows | 32 / 64 | 动态/静态 | 是 | 任意 |
macOS | 64 | 动态 | 是 | 任意 |
Linux | arm / arm64 / 64 | 动态/静态/系统 | 是 | 任意 |
Android (+Wear) | arm / arm64 | 动态 | 是 | 任意 |
Android-Emulator (+Wear) | 32 | 动态 | 是 | 任意 |
SailfishOS | arm | 系统 | 是 | 任意 |
SailfishOS-Emulator | 32 | 系统 | 是 | 任意 |
Raspberry Pi (1/2/3) | arm | 动态/系统 | 是 | 任意 |
Ubuntu Touch | arm / 64 | 系统 | 是 | 任意 |
JavaScript | 32 | 静态 | 是 | 任意 |
WebAssembly | 32 | 静态 | 是 | 任意 |
iOS | arm64 | 静态 | 否 | macOS |
iOS-Simulator | 64 | 静态 | 否 | macOS |
AsteroidOS | arm | 系统 | 否 | Linux |
FreeBSD | 32 / 64 | 系统 | 否 | FreeBSD |
许可证
本软件包根据LGPLv3发布。
Qt本身根据多种许可证授权和提供。
更多关于golang跨平台Qt GUI开发绑定插件库qt的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang跨平台Qt GUI开发绑定插件库qt的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang 跨平台 Qt GUI 开发指南
Qt 是一个强大的跨平台 GUI 框架,而 Go 是一种高效的编程语言。虽然 Go 本身没有原生的 GUI 库,但我们可以通过绑定 Qt 来实现跨平台的 GUI 开发。
常用的 Go Qt 绑定库
目前主要有两个流行的 Go Qt 绑定库:
- therecipe/qt - 功能最全面的 Qt 绑定
- go-qml/qml - 专注于 QML 的绑定
下面我将重点介绍 therecipe/qt 的使用方法。
therecipe/qt 安装与配置
1. 安装前提条件
- 安装 Go (1.13+ 推荐)
- 安装 Qt (5.13+ 推荐)
- 确保 qmake 在 PATH 中
- 安装 Qt 开发工具包
2. 安装 therecipe/qt
go get -v github.com/therecipe/qt/cmd/...
3. 设置环境变量
# Windows
set QT_DIR=C:\Qt\5.15.2\mingw81_64
# macOS/Linux
export QT_DIR=/path/to/Qt/5.15.2/clang_64
4. 安装 Qt 工具
$(go env GOPATH)/bin/qtsetup
基本示例代码
下面是一个简单的窗口应用程序示例:
package main
import (
"github.com/therecipe/qt/widgets"
"github.com/therecipe/qt/gui"
"os"
)
func main() {
// 创建应用程序
app := widgets.NewQApplication(len(os.Args), os.Args)
// 创建主窗口
window := widgets.NewQMainWindow(nil, 0)
window.SetWindowTitle("Go Qt 示例")
window.SetMinimumSize2(400, 300)
// 创建中央部件
centralWidget := widgets.NewQWidget(nil, 0)
window.SetCentralWidget(centralWidget)
// 创建布局
layout := widgets.NewQVBoxLayout2(centralWidget)
// 创建标签
label := widgets.NewQLabel2("Hello, Qt from Go!", nil, 0)
label.SetAlignment(gui.Qt__AlignCenter)
layout.AddWidget(label, 0, gui.Qt__AlignCenter)
// 创建按钮
button := widgets.NewQPushButton2("点击我", nil)
button.ConnectClicked(func(checked bool) {
widgets.QMessageBox_Information(nil, "信息", "按钮被点击了!",
widgets.QMessageBox__Ok, widgets.QMessageBox__Ok)
})
layout.AddWidget(button, 0, gui.Qt__AlignCenter)
// 显示窗口
window.Show()
// 运行应用程序
app.Exec()
}
构建与运行
1. 构建应用程序
# 使用 qtdeploy 工具构建
$(go env GOPATH)/bin/qtdeploy build desktop ./path/to/your/project
2. 运行应用程序
构建完成后,在 deploy 目录中会生成可执行文件。
跨平台支持
therecipe/qt 支持以下平台:
- Windows (MinGW/MSVC)
- macOS
- Linux
- Android (实验性)
- iOS (实验性)
高级功能示例
1. 使用 QML
package main
import (
"github.com/therecipe/qt/quick"
"github.com/therecipe/qt/widgets"
"os"
)
func main() {
app := widgets.NewQApplication(len(os.Args), os.Args)
// 创建 QML 视图
view := quick.NewQQuickView(nil)
view.SetSource(NewQUrl("qrc:/main.qml"))
view.SetResizeMode(quick.QQuickView__SizeRootObjectToView)
view.Show()
app.Exec()
}
2. 信号与槽连接
button.ConnectClicked(func(checked bool) {
// 按钮点击处理逻辑
})
// 自定义信号
type CustomWidget struct {
*widgets.QWidget
_ func() `signal:"customSignal"`
}
// 发射信号
widget := NewCustomWidget(nil)
widget.ConnectCustomSignal(func() {
println("自定义信号被触发")
})
widget.EmitCustomSignal()
注意事项
-
性能考虑:Go 和 Qt 之间的调用会有一定的性能开销,对于性能敏感的应用需要谨慎。
-
内存管理:Go 的垃圾回收和 Qt 的内存管理机制不同,需要注意对象生命周期。
-
部署大小:由于需要包含 Qt 库,最终的可执行文件会比较大。
-
版本兼容性:确保 Go 和 Qt 的版本兼容性。
总结
使用 therecipe/qt 绑定库可以让你在 Go 中充分利用 Qt 的强大功能,开发跨平台的 GUI 应用程序。虽然有一些限制和性能考虑,但对于大多数应用场景来说,这是一个非常可行的解决方案。