【golang-GUI開發】Qt項目的打包發佈

来源:https://www.cnblogs.com/apocelipes/archive/2018/07/13/9307787.html
-Advertisement-
Play Games

這是本系列的第三篇文章,前兩篇我們講了qt的安裝和編譯,今天我們講一講程式的打包。 好像我們現在都沒怎麼講到qt的使用,因為想要放開手腳寫代碼,一些基礎是要打牢的。 不過請放心,下一篇文章開始我們就會真正進入正題了。 打包 首先我們做一些打包前的準備工作,沒錯,做事之前先做好準備是個好習慣:-p。 ...


這是本系列的第三篇文章,前兩篇我們講了qt的安裝和編譯,今天我們講一講程式的打包。

好像我們現在都沒怎麼講到qt的使用,因為想要放開手腳寫代碼,一些基礎是要打牢的。

不過請放心,下一篇文章開始我們就會真正進入正題了。

這是針對使用qtdeploy時的打包教程,不適用於使用qt-tools + go build進行構建的情況

 

打包

首先我們做一些打包前的準備工作,沒錯,做事之前先做好準備是個好習慣:-p。

這次用於打包的仍然是一個小例子,將一張圖片縮小一半顯示出來,這個例子正好需要使用外部資源,因此我也會在其中展示qrc的用法。

項目結構:

tree makedeb

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

沒錯,images里的就是我們要顯示的圖片,makedeb.qrc是我們的資源配置文件,因為是打包發佈,所以我們使用qrc來同一管理外部資源。

<!DOCTYPE RCC><RCC version="1.0">
<qresource>
     <file>images/1.jpg</file>
</qresource>
</RCC>

qrc的配置和原生Qt一樣,這裡不多做解釋。

下麵是主程式:

 1 package main
 2 
 3 import (
 4     "os"
 5     
 6     "github.com/therecipe/qt/gui"
 7     "github.com/therecipe/qt/core"
 8     "github.com/therecipe/qt/widgets"
 9 )
10 
11 func main() {
12     widgets.NewQApplication(len(os.Args), os.Args)
13     
14     window := widgets.NewQMainWindow(nil, 0)
15     window.SetWindowTitle("Test deb package")
16     
17     img := gui.NewQPixmap5(":/images/1.jpg", "", core.Qt__AutoColor)
18     size := img.Size()
19     img = img.ScaledToHeight(size.Height()/2, core.Qt__FastTransformation)
20     img = img.ScaledToWidth(size.Width()/2, core.Qt__FastTransformation)
21     
22     canvas := widgets.NewQLabel(window, 0)
23     canvas.SetPixmap(img)
24     
25     window.SetCentralWidget(canvas)
26     window.Show()
27     
28     widgets.QApplication_Exec()
29 }

將圖片讀取至QPixmap,然後在使用QLabel來顯示的簡單例子,其中

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

“:/images/1.jpg”表示按照.qrc指定的規則來獲取資源文件1.jpg。

接下來就是編譯了,只需要簡單的一條代碼

qtdelpoy build desktop makedeb

再看一看現在的目錄結構:

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尾碼刪除:

1 #!/bin/bash
2 app=`basename $0`
3 appdir=`dirname $0`/${app}_bin
4 
5 export LD_LIBRARY_PATH=$appdir/lib
6 export QT_PLUGIN_PATH=$appdir/plugins
7 export QML_IMPORT_PATH=$appdir/qml
8 export QML2_IMPORT_PATH=$appdir/qml
9 $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包。

你也可以通過 --nobuild 參數來只生成配置和必要的數據複製,而不構建deb包文件,這樣你可以添加和修改自己需要的配置。

更多參數和用法可以在項目主頁找到,同時也歡迎提出意見和建議。

 

祝玩得愉快!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在大容量,高負荷的web系統中,對資料庫進行一系列拆分,可有效提升資料庫容量和性能。在初學程式的早期,程式員通常都喜歡按傳統資料庫設計模式,設計為單庫和單一功能表的結構,這樣的結構在數據量和併發量達到一定程度之後,會出現嚴重性能問題和維護問題。在出現問題的時候才著手進行優化,會非常痛苦,所以應該在系 ...
  • List、Set、數據結構、Collections 初次學習,涉及到List集合,Set集合和數據結構方面的一些知識,有錯誤還請批評指正 數據結構 數據存儲的常用結構有:棧、隊列、數組、鏈表和紅黑樹。 棧 先進後出(FILO). 隊列 先進先出(FIFO). 數組 有序的元素序列,以索引訪問.查詢快 ...
  • datetime是模塊,datetime模塊還包含一個datetime類,通過from datetime import datetime導入的才是datetime這個類。 strptime(): 用戶輸入的日期和時間是字元串,要處理日期和時間,首先必須把str轉換為datetime。轉換方法是通過d ...
  • 本文主要記錄了SpringBoot中AOP註解式攔截與方法規則攔截的基本使用。 ...
  • 本文內容: servlet的介紹 servlet的基礎使用介紹 HttpServlet ServletConfig ServletContext Cookie Session 數據域對象 servlet的介紹: Servlet是sun公司提供的一門用於開發動態web資源的技術。 servlet程式運... ...
  • 工作中偶然發現Scala構造方法中的參數,無論是否有val/var修飾都可以順利編譯運行,如下: 那麼兩者的區別在哪裡呢?對於case class呢?其區別又在哪裡?其應用場景又在哪裡呢?下麵就辨析一下如下幾個類的區別 單純的從代碼中來看,發現不了什麼區別,只是簡單的多了一個val的修飾符。為了一探 ...
  • 在配置項目組件的過程中, 瞭解Tomcat載入組件順序很有必要。 例如某些框架如Quartz的集群功能需要資料庫的支持, 資料庫的載入肯定要在框架組件載入之前。 經過查閱和Debug發現, web.xml組件載入順序為:context-param -> listener -> filter -> s ...
  • 背景在很多互聯網產品應用中,有些場景需要加鎖處理,比如:秒殺,全局遞增ID,樓層生成等等。大部分的解決方案是基於DB實現的,Redis為單進程單線程模式,採用隊列模式將併發訪問變成串列訪問,且多客戶端對Redis的連接並不存在競爭關係。其次Redis提供一些命令SETNX,GETSET,可以方便實現 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...