设为首页 收藏本站
查看: 1568|回复: 0

[经验分享] 【golang-GUI开发】Qt项目的打包发布

[复制链接]

尚未签到

发表于 2018-9-20 13:33:26 | 显示全部楼层 |阅读模式
  这是本系列的第三篇文章,前两篇我们讲了qt的安装和编译,今天我们讲一讲程序的打包。
  好像我们现在都没怎么讲到qt的使用,因为想要放开手脚写代码,一些基础是要打牢的。
  不过请放心,下一篇文章开始我们就会真正进入正题了。
  这是针对使用qtdeploy时的打包教程,不适用于使用qt-tools + go build进行构建的情况。
  打包
  首先我们做一些打包前的准备工作,没错,做事之前先做好准备是个好习惯:-p。
  这次用于打包的仍然是一个小例子,将一张图片缩小一半显示出来,这个例子正好需要使用外部资源,因此我也会在其中展示qrc的用法。
  项目结构:
  

tree makedeb  makedeb
  
├── images
  
│   └── 1.jpg
  
├── main.go
  
└── makedeb.qrc
  

  没错,images里的就是我们要显示的图片,makedeb.qrc是我们的资源配置文件,因为是打包发布,所以我们使用qrc来同一管理外部资源。
  

  

  images/1.jpg
  

  

  

  qrc的配置和原生Qt一样,这里不多做解释。
  下面是主程序:
  

package main  

  
import (
  
     "os"
  

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

  
func main() {
  
     widgets.NewQApplication(len(os.Args), os.Args)
  

  
     window := widgets.NewQMainWindow(nil, 0)
  
     window.SetWindowTitle("Test deb package")
  

  
     img := gui.NewQPixmap5(":/images/1.jpg", "", core.Qt__AutoColor)
  
    >  
     img = img.ScaledToHeight(size.Height()/2, core.Qt__FastTransformation)
  
     img = img.ScaledToWidth(size.Width()/2, core.Qt__FastTransformation)
  

  
     canvas := widgets.NewQLabel(window, 0)
  
     canvas.SetPixmap(img)
  

  
     window.SetCentralWidget(canvas)
  
     window.Show()
  

  
     widgets.QApplication_Exec()
  
}
  

  将图片读取至QPixmap,然后在使用QLabel来显示的简单例子,其中
  

img := gui.NewQPixmap5(":/images/1.jpg", "", core.Qt__AutoColor)  

  “:/images/1.jpg”表示按照.qrc指定的规则来获取资源文件1.jpg。
  接下来就是编译了,只需要简单的一条代码
  

qtdelpoy build desktop makedeb  

  再看一看现在的目录结构:

DSC0000.gif DSC0001.gif
  

makedeb  
├── deploy
  
│   └── linux
  
│       ├── lib
  
│       ├── makedeb
  
│       ├── makedeb.sh
  
│       ├── plugins
  
│       └── qml
  
├── images
  
│   └── 1.jpg
  
├── linux
  
├── main.go
  
├── makedeb.qrc
  
├── rcc_cgo_linux_linux_amd64.go
  
└── rcc.cpp
  


View Code  如上一篇文章所说,qtdeploy会自动调用qtrcc去解析.qrc文件生成rcc.cpp和rcc_cgo_*.go,里面包含有我们在.qrc文件里指定的资源。
  下面我们对生成的目标打包,如何制作deb包可以点击这里。
  我们需要新建一个用于打包的目录:build
  然后在build里创建目录DEBIAN,这个目录里的文件用于控制包的信息和安装/卸载前后的行为。
  

mkdir build && cd build  

mkdir DEBIAN  

  打包时会把指定目录下所有文件包含进去,解包时会将除了DEBIAN目录之外所有目录和文件按照在build目录里的结构解压到根目录/ 之下。
  举个例子,build里有个目录usr/local/bin/test,打包后安装时会被安装到/usr/local/bin/test,如果有etc/test那么就会安装到/etc/test。
  所以我们需要根据想要的安装路径来在build目录里创建这些目录,我想把程序安装在/usr/local/bin下,所以这样创建目录:
  

mkdir usr/local/bin/  

  根据上一篇文章的讲解,运行我们的程序需要deploy/linux里的lib,plugins,qml这三个目录和makedeb,makedeb.sh这两个文件,所以我们把他们复制到打包的目录里:
  

mkdir usr/local/bin/makedeb_bin  

cp -r ../deploy/linux/lib usr/loacl/bin/makedeb_bin/  
cp -r ../deploy/linux/plugins usr/local/bin/makedeb_bin/
  
cp -r ../deploy/linux/qml usr/local/bin/makedeb_bin/
  
cp ../deploy/linux/makedeb usr/local/bin/makedeb_bin/
  

  为什么我们没有复制makedeb.sh?而且makedeb_bin目录建立的意义是什么?
  因为一篇文章里说过,这个脚本在打包时有问题需要一点改造,现在我们就来改造它了。
  原先的脚本只能在和程序同一目录下才能工作,所以我们想使用它的话就要把deploy/linux/...直接复制到usr/local/bin里,如果只有这一个包那么没问题,但是如果你写了其他的Qt程序,然后打包安装在了同一目录下,那么这个安装目录里就会有两个lib目录,两个plugins目录。。。。当然同时存在两个同名目录是不可能的,后一个会覆盖前项,如此一来之前安装的程序很可能就会因为使用了错误的依赖项导致异常,这是不可接受的。
  解决办法并不复杂,我们把程序和他的依赖放入一个projectname_bin的目录里,然后在这个目录的外层目录使用改造的脚本调用它,这样的话不管安装多少个你打包的qt程序也不会发生冲突了。下面是改造后的makedeb.sh,为了能在命令行里用makedeb启动程序,可以将.sh后缀删除:

  

#!/bin/bash  

app=`basename $0`  

appdir=`dirname $0`/${app}_bin  

  
export LD_LIBRARY_PATH=$appdir/lib
  
export QT_PLUGIN_PATH=$appdir/plugins
  
export QML_IMPORT_PATH=$appdir/qml
  
export QML2_IMPORT_PATH=$appdir/qml
  
$appdir/$app "$@"
  


makedeb.sh  聪明的你或许已经发现了,这个脚本是可以复用到任何项目打包里的!只需要把文件名改成项目名称即可。
  之后按照这里的教程配置好之后就可以用
  

# 打包需要权限  

sudo dpkg -b . # 我们当前正在build目录里  

  来打包了,打包完成后的build目录结构:

  

build  
├── DEBIAN
  
│   └── control
  
├── makedeb.deb
  
└── usr
  └── local
  └── bin
  ├── makedeb
  └── makedeb_bin
  


View Code  那个在build目录下的makedeb.deb就是我们打包的程序啦,接下来你可用dpkg -i来安装,也可以将他发布出去。
  自动化
  如果你觉得这个过程太繁琐,那么我提供了自动化工具:-p。
  工具地址:https://github.com/apocelipes/golang_qt2deb
  具体使用方法:
  

golang_qt2deb.sh -t makedeb --prefix '/usr/local/bin'  

  程序会寻问control需要的配置信息,然后自动帮你构建deb包。
DSC0002.jpg

  你也可以通过 --nobuild 参数来只生成配置和必要的数据复制,而不构建deb包文件,这样你可以添加和修改自己需要的配置。
  更多参数和用法可以在项目主页找到,同时也欢迎提出意见和建议。
  祝玩得愉快!



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-598925-1-1.html 上篇帖子: golang中四种方式实现子goroutine与主协程的同步 下篇帖子: gocommand:一个跨平台的golang命令行执行package
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表