基於Qt5 跨平臺應用開發

  • 1.Qt簡介
  • 2.Qt 編程關鍵技術
    • 2.1 信號與槽
    • 2.2 Qt事件處理
  • 3.Qt開發與實例分析
    • 3.1 開發環境
    • 3.2 系統實現基本框架
    • 3.3 數據庫管理
    • 3.5 對Excel進行操做
  • 4.系統的打包和測試
    • 4.1 Mac系統上打包Qt
    • 4.2 Windows系統上打包Qt。
    • 4.3 發佈軟件測試
  • 5.Qt開發常見問題
    • 5.1 ui文件轉換爲頭文件問題
    • 5.2 Mac打包時出現不包含「libmysqlclient.18.dylib」問題
    • 5.3 添加應用圖標
  • 6.參考文獻

1. Qt簡介

Qt是1991年奇趣科技 開發的一個跨平臺的C++圖形用戶界面應用程序框架。它提供給應用程序開發者創建藝術級的圖形用戶界面所需的全部功能。Qt很容易擴展,而且容許真正地組 件編程。基本上,Qt 同 X Window 上的 Motif,Openwin,GTK 等圖形界 面庫和 Windows 平臺上的 MFC,OWL,VCL,ATL 是同類型的東西。php

2008年,奇趣科技被諾基亞公司收購,QT也所以成爲諾基亞旗下的編程語言工具。 2012年,Qt被Digia收購。2014年4月,跨平臺集成開發環境Qt Creator 3.1.0正式發佈,實現了對於iOS的徹底支持,新增WinRT、Beautifier等插件,廢棄了無Python接口的GDB調試支持,集成了基於 Clang的C/C++代碼模塊,並對Android支持作出了調整,至此實現了全面支持iOS、Android、WP。(百度百科)html

Qt做爲高質量的跨平臺框架,具備支持平臺普遍、功能完整、開源、執行效率高、界面開發簡單、開發工具完備等特性。下表是Qt與目前較爲流行的跨平臺解決方案Java和Xamarin比較結果。java

Qt Java Xamarin
桌面平臺 Windows Mac Linux Solaris Windows Mac Linux Solaris Windows Mac Linux
移動平臺 Android iOS Window Phone Android Android iOS Window Phone
開發語言 C++ Java C#
是否開源 有基於LGPL開源版本和商業版本 OpenJDK開源 有商業版本和基於Mono框架爲開源
開發工具 Qt Creator Qt Designer Eclipse NetBeans Monodevelop Virtual Studio
功能 十分完整 十分完整 不十分完整
開發難度 簡單 較複雜 較簡單
成熟度 十分紅熟 十分紅熟 不十分紅熟
版本 5..5 8.60 5.7
效率 較差 通常
依託公司 Digia.com(以前爲Nokia) Oracle.com(以前是SUN) Xamarin.com

Qt 不但擁有了完善的C++圖形庫,並且近年來的版本逐漸集成了數據庫、OpenGL庫、多媒體庫、網絡、腳本庫、XML庫、WebKit庫等組件,其核心庫 也加入了進程間通訊、多線程等模塊,極大的豐富了Qt開發大規模複雜跨平臺應用程序的能力.Qt的開發工具Qt Creator(IDE)、GUI Designer(界面設計)、Build Tools(編譯)、Help System(幫助系統)I18n Tools(多語言工具)等,也極大簡化了開發應用的難度。下圖爲Qt的技術堆棧node

Qt SDK

2. Qt 編程關鍵技術

2.1 信號與槽

信 號和槽機制是QT的核心機制,是一種高級接口,應用於對象之間的通訊。信號和槽是QT自行定義的一種通訊機制,它獨立於標準的C/C++語言,所以要正確 的處理信號和槽,必須藉助一個稱爲 moc(Meta Object Compiler)的Qt工具,該工具是一個C++預處理程序,它爲高層次的事件處理自動生成所須要的附加代碼。mysql

全部從QObject或 其子類(例如QWidget)派生的類都可以包含信號和槽。當對象改變其狀態時,信號就由該對象發射(emit)出去,這就是對象所要作的所有事情,它不 知道另外一端是誰在接收這個信號。槽用於接收信號,但它們是普通的對象成員函數。一個槽並不知道是否有任何信號與本身相鏈接。對象甚至並不瞭解具體的通訊機 制。sql

信號與槽鏈接是任意個的,甚至信號與信號也能夠鏈接的,這時不管第一個信號何時發射系統都將馬上發射第二個信號。總之,信號與槽構造了一個強大的部件編程機制。數據庫

2.2 Qt事件處理

Qt能夠說是是以事件驅動的UI工具集,信號與槽在多線程的實現也依賴於Qt的事件處理機制。在Qt中,事件被封裝成一個個對象,全部的事件均繼承自抽象類QEvent。Qt中事件的產生、分發、接受和處理:編程

  • 事件的產生如按鍵,點擊鼠標等等動做所產生的keyPressEvent, keyReleaseEvent,mousePressEvent,mouseReleaseEvent等事件(分別被封裝成QMouseEvent和 QKeyEvent中),這些事件來自於底層的操做系統,它們以異步的形式通知Qt事件處理系統。windows

  • 事件的接受和處理使用QObject。事件處理機制是QObject三大職責(內存管理、內省與事件處理制)之一。任何一個想要接受並處理事件的對象均須繼承自QObject,能夠選擇重載QObject::event()函數或事件的處理權轉給父類。安全

  • 事件的分發:對於non-GUI的Qt程序,是由QCoreApplication負責將QEvent分發給QObject的子類-Receiver。對於Qt GUI程序,由QApplication來負責。

3. Qt開發與實例分析

下面經過一個指標計算的程序分析Qt開發完整過程。該系統需求:

  • 從數據庫中讀取計算指標參數。(數據庫操做組件)
  • 計算所的指標須要用溫度計的形式展現,並截圖以便在文檔中使用。
    *可以將計算數據經過Excel導入到數據庫中,並可以將計算結果導出到Excel中。
  • 須要有Windows和Mac兩個版本且功能和界面佈局要基本相同。(跨平臺)

3.1 開發環境

下表爲使用的開發環境,基本爲開源軟件

系統平臺 Mac OSX 10.11
SDK Qt 5.5
開發工具 Qt Creator Qt Designer
開發語言 C++ SQL
數據庫 SQLite 3
測試平臺 Mac OSX Window XP Window 7
其餘開源軟件 FireFox SQLite Manager Inno Setup Compiler VirtualBox yEd QtXlsx

3.2 系統實現基本框架

該系統綜合使用了Qt的數據庫模塊、GUI模塊和第三方的QtXlsx模塊,使用VirtualBox完成系統打包和測試,使用Inno setup對Windows程序進行封裝,使用SQLite Manager管理SQLite數據庫。下圖爲系統實現基本框架。

3.3 數據庫管理

Qt 對數據的支持至關完善,Oracle、SQL Server、DB二、 SyBase、 MySQL、 PostgreSQL、 SQLite3 均可以完美的支持。因爲需求要使用本地數據庫並儘量的小巧靈活,選擇SQLite3做爲數據庫,經過FireFox 插件SQLite Manager進行管理,圖4爲SQLite Manager 管理界面。Qt使用QsqlDatabase類來管理數據,該類中包括全部數據庫的管理行爲,如addDatabase爲添加數據庫驅動,下面爲鏈接 SQLite3示例代碼。

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    if (!QSqlDatabase::drivers().contains("QSQLITE"))
        QMessageBox::critical(0, QObject::tr("Unable to load database"), QObject::tr("This demo needs the SQLITE driver"));
    db.setDatabaseName (dbName);
    if (!db.open()) {
        QMessageBox::critical (0,QObject::tr ("DataBase Error"),db.lastError ().text ());
        return false;
    }

數據庫鏈接代碼

對於已經鏈接上的數據庫可使用兩種方法來進行操做:

  • 1.使用QSqlQuerry,該方法能夠直接執行SQL語句,使用與對數據庫的批量處理。如:

「query.exec ("DROP VIEW IF EXISTS 'data_x300';");」

  • 2.使用QSqlTable,將數據庫中的錶轉換爲Qt中的Table,而後進行數據庫增添刪改等事務性操做,簡單並且安全,推薦使用這種方法操做代碼。下面爲使用QSqlTable代碼
if((model->insertRow (row))&&
                (model->setData(model->index(row,0),id))&&
                (model->setData(model->index(row,1),name))&&
                (model->setData(model->index(row,2),newPasswd))&&
            (model->setData(model->index(row,3),hint))&&
                (model->submitAll()))
            QMessageBox::warning (this, "Correct","用戶添加成功!");
        else
            QMessageBox::warning (this, "Error","密碼添加失敗!");

Qt使用Qt Designer Form,該方法直觀且功能強大。首先使用Qt Designer創建並繪製以xxx.ui爲後綴的文件,而後在編譯時會將其轉換爲ui_xxx.h頭文件,再進行統一的編譯。圖6爲Qt Designer界面。在Qt5加入了對基於JS的QML進行界面的支持,QML覺Qt Designer Form有更強的控制能力和美化能力,並且使用目前流行的JS語言,相信必將成爲將來發展趨勢。

該系統中還要求用溫度計顯示計算結果,所以單單是界面繪製工具並不能知足要求。須要先找到溫度計的樣本圖,使用繪圖工具進行修改,最後使用Style Sheet腳本對控件進行美化處理。下圖爲StyleSheet處理腳本和效果。

該系統須要對結果截屏,Qt中截屏又兩種方式,一種方式是在整個屏幕中,根據相對位置進行截屏(pixmap.grabWindow());另一種是在Qt中的一個窗口中(pixmap.grabWidget()),根據相對位置進行截屏。下面爲截屏代碼:

int grapX= year_lineEdit->geometry ().x ();
int grapY = year_lineEdit->geometry ().y ();
pix = pixmap.grabWidget (this, grapX-2 ,grapY -2, this->width ()-grapX, this->height ()-grapY -140);

3.5 對Excel進行操做

該系統將需用Excel將計算數據導入到數據庫中,並將計算結果導出到Excel中。但在Qt中並無對Office進行處理的組件,所以須要第三 方組件進行支援。咱們使用開源的Qt模塊QtXlsx該模塊能夠對Excel進行操做,功能十分強大。(Qt更多開源模塊能夠在 http://inqlude.org 上找到。)使用方法以下:

  • 1.首先在網站上下載QtXlsx模塊項目,安裝Perl5,使用Qt Creator打開並編譯;
  • 2.而後再命令行中使用「qmake; make; make install」來安裝庫
  • 3.在pro文件中加入xlsx模塊,在頭文件中加入"xlsxdocument.h"頭文件

便可以使用QtXlsx庫進行Excel操做了,下面爲QtXlsx操做代碼:

QString fileName = path + "/index.xlsx";
        QXlsx::Document *xlsx = new QXlsx::Document(fileName);
        int rowC = (model->rowCount ());
        int columnC = (model->columnCount ());
        for (int i = 0; i < columnC; ++i) {
            xlsx->write (1,i+1,model->headerData (i,Qt::Horizontal).toString ());
        }
        for (int i = 0; i < rowC; ++i) {
            for (int j = 0; j < columnC; ++j) {
                xlsx->write ((i+2),(j+1), model->record (i).value (j).toString ());
            }
        }
        if (!fileName.isEmpty()) {
            if(xlsx->save())
                QMessageBox::warning (this,"Correct","數據導出成功");
            else
                QMessageBox::warning (this,"Error","數據導出失敗");
        }

4. 系統的打包和測試

4.1 Mac系統上打包Qt

須要使用otool和macdeployqt兩個工具,otool用於定位適用的動態連接庫文件,macdeployqt用於對生成的Release版本的程序進行打包。

具體步驟以下:

  • 1.用Qt Creator編譯生成Release版本程序,並測試經過;

  • 2.進入build-q***-Qt_5_2_1_clang_64-Release文件夾;

  • 3.在命令行下使用「otool –L」命令查看適用的動態連接庫文件,如圖所示。如缺乏文件,添加到環境變量中;


otool輸出結果

  • 4.在命令行下使用macdeployqt進行打包。下圖爲打包後應用結構


打包應用結構

  • 5.生成的App文件再使用Disk Utility程序封裝,就能夠發佈了;

4.2 Windows系統上打包Qt。

使用windeployqt工具生成須要打包的文件夾時,會漏掉一些文件,所以須要手動添加一些動態連接庫。具體步驟以下:

-1.用VirtualBox 創建Windows 7虛擬機,安裝Qt開發完整的平臺;

  • 2.將QtXlsx源程序拷貝到虛擬機中,安裝Perl5,編譯安裝該模塊;

  • 3.將待打包應用程序源代碼拷貝到虛擬機中,編譯成Realse版本應用;

  • 4.將應用拷到一個獨立文件夾中用windeployqt,生成須要的動態連接庫文件;

  • 5.將其餘須要的動態連接庫文件從Qt安裝目錄中拷貝到該目錄中;


動態連接文件圖

  • 6.使用inno setup工具對該目錄進行封裝便可發佈了。


Inno Setup

4.3 發佈軟件測試

測試採用白盒測試,在Virtual Box分別創建全新的Mac OSX,Windows XP和Windows 7

操做系統虛擬機,將打包程序分別拷貝到相應的系統平臺中。分別安裝並測試系統功能是否符合要求。若是不符合,須要從新編程、編譯、打包和測試,直到滿意爲止。

5. Qt開發常見問題

5.1 ui文件轉換爲頭文件問題

有時Qt Creator編譯時會出現一些問題,提示缺乏ui_.h頭文件。這是Qt系統出現了問題,解決方法是手動將ui文件轉換爲相應的頭文件。如對.ui文件,使用:

$ uic ***.ui -o ui_***.h

將其手動的轉換爲相應的頭文件就能夠編譯了。

5.2 Mac打包時出現不包含「libmysqlclient.18.dylib」問題

在Mac系統中打包可能出現缺乏「libmysqlclient.18.dylib」文件問題,這是由於系統沒有安裝MySQL。解決方法是先安 裝,macport,而後使用macport安裝MySQL。因爲默認libmysqlclient.18.dylib文件位置不在搜索目錄中,還須要將 其拷貝到相應的目錄中。

5.3 添加應用圖標

對於Windows應用,須要創建一個rc文件說明ico圖標文件,在pro文件中添加rc文件。表 爲一個示例:

#Myapp.rc:
IDI_ICON1              ICON    DISCARDABLE    "myappico.ico"
Myapp.pro:
RC_FILE = myapp.rc

對於Mac應用,須要生成圖片轉成爲icns文件,而後在pro文件中添加icns文件:

ICON = myapp.icns

6.參考文獻

[1] Qt . [EB/OL].http://qt-project.org/

[2] Qt wiki. [EB/OL].http://zh.wikipedia.org/zh-cn/qt

[3] SQLite. [EB/OL].http://sqlite.org/

[4] SQLite Manager . [EB/OL].https://addons.mozilla.org/zh-CN/firefox/addon/sqlite-manager/

[5] GIMP. [EB/OL].http://www.gimp.org/

[6] Inno setup tools. [EB/OL]. http://www.jrsoftware.org/isinfo.php

[7] Virtual Box. [EB/OL]. https://www.virtualbox.org/

[8] OpenOffice. [EB/OL]. http://www.openoffice.org/zh-cn/

[9] yEd. [EB/OL]. http://www.yworks.com/en/products_yed_about.html

[10] QtXlsx. [EB/OL]. http://qtxlsx.debao.me/

[11] Java. [EB/OL]. http://www.java.com/zh_CN/

[12] Xamarin. [EB/OL]. http://xamarin.com/

[13] Mono. [EB/OL]. http://www.mono-project.com/Main_Page

[14] Java. [EB/OL]. http://openjdk.java.net/

[15]Qt 幫助. [EB/OL]. http://qt-project.org/doc/

本文原創,轉載請注 獅子座流星

相關文章
相關標籤/搜索