伊人久久大香线蕉综合影视_日韩精品少妇无码受不了_71pao成人国产永久免费视频_国产伦片中文免费观看_国产高清无码麻豆精品_九色综合伊人久久富二代_日韩黄色精品_日韩A∨精品日韩精品无码

基于QT的webkit與ExtJs開發(fā)CB/S結構的企業(yè)應用管理系統(tǒng)

2015-5-2    藍藍設計的小編

一:源起

    1.何為CB/S的應用程序

    C/S結構的應用程序,是客戶端/服務端形式的應用程序,這種應用程序要在客戶電腦上安裝一個程序,客戶使用這個程序與服務端通信,完成一定的操作。

    B/S結構的應用程序,是瀏覽器/服務端形式的應用程序,這種應用程序不用在客戶端部署任何東西,客戶只需要通過瀏覽器與服務端通信,來完成一定的操作。

    兩種類型的程序優(yōu)缺點對比:

點擊查看原圖



由上可知,兩種形式的應用程序各有利弊。架構師在做技術選型的時候,往往會根據(jù)項目需要,對比這兩種技術形式的優(yōu)缺點,做出正確的選擇。

    然而,國內大多數(shù)企業(yè)應用程序,需要頻繁、及時的更新升級、需要更高的客戶端控制權限、需要更高的數(shù)據(jù)實時性和更高的通信效率,但卻不在意部署上的問題。

    這時,架構師就考慮把C/S結構的應用程序和B/S結構的應用程序結合起來,讓客戶端嵌套一個瀏覽器以與服務器通信,完成一定的操作。這樣的程序就是CB/S結構的應用程序。

    這樣做的好處是一般的業(yè)務邏輯只要在服務端更新升級,即可體現(xiàn)在客戶端。對于客戶端系統(tǒng)權限、基于Socket的通信等瀏覽器核心無法完成的操作,可以由客戶端來完成??蛻舳丝梢灾苯优c服務端通信,也可以通過瀏覽器核心與服務端通信。

    下圖為CB/S結構應用程序的基本示意圖:



 點擊查看原圖



目前還有一種介于C/S和B/S結構的應用程序之間的應用程序:RIA富互聯(lián)網應用程序,這種結構的應用程序一般都是基于瀏覽器插件來運行的,它有較高的客戶端控制權限(比B/S程序高,但比C/S程序低),通信方式也有較多的選擇(不只是基于HTTP協(xié)議),目前較常見的RIA技術有:Adobe的flex技術、微軟的Silverlight技術、Oracle的WebStart技術。架構師在做技術選型的時候,也可以綜合權衡采用這些技術。



2.為何選擇QT的WebKit與Extjs開發(fā)企業(yè)應用

 

    ExtJs是一個用于創(chuàng)建Web用戶界面的JS框架,提供了豐富的界面部件及布局方式,對于web開發(fā)者來說,實現(xiàn)企業(yè)應用所需的各種畫面只要掌握JS語言即可。不必再引入flash或silverlight技術,而且能很容易的創(chuàng)建風格統(tǒng)一的企業(yè)應用程序。

    雖然ExtJs支持各種流行的瀏覽器,甚至包括IE6,但是它在IE系瀏覽器下運行、渲染的效率不高。在谷歌瀏覽器下表現(xiàn)最好,F(xiàn)ireFox瀏覽器次之(這得益于谷歌瀏覽器的JS腳本引擎)。

    然而谷歌瀏覽器和FireFox瀏覽器的核心都是WebKit(蘋果公司開源的瀏覽器核心,負責解析HTML文本,并呈現(xiàn)到界面上),所以,要想讓我們的CB/S+ExtJs結構的應用程序能有更好的表現(xiàn),我們必須采用WebKit核心的瀏覽器。

    雖然我們能很方便的獲得WebKit的源碼,然而編譯它卻十分耗時費力,不但要選對編譯工具,還要安裝一系列的SDK,編譯時間更是長的驚人(這幾乎是大型C++項目的通?。?。編譯出來的DLL使用起來也不是很方便(要翻閱大量的WebKit的API)。

    幸運的是QT界面庫為我們做了這些工作,QT庫中包含webkit的瀏覽器控件,并且這個C++庫是跨平臺的,也就是說基于這幾項技術開發(fā)的CB/S企業(yè)應用可以部署在Linux系統(tǒng)內。

    除了使用QT界面庫,還可以選擇gtk+和wxWidgets兩個界面庫,而且這兩個界面庫都對WebKit做過包裝,但是從開發(fā)方式,生產效率,運行速度等多方面考慮,還是QT最為合適。

    QT界面庫也分為兩個版本,一個是收費的digia提供的QT,另一個是免費的qt-project提供的QT(GPL V3 LGPL V2),這里我們選擇免費版的QT,本文第三節(jié)會介紹如何搭建開發(fā)環(huán)境。



 

架構師除了選擇QT的WebKit做瀏覽器核心之外,還可以選擇CEF(Chromium Embedded Framework,項目地址:https://code.google.com/p/chromiumembedded/)這個項目是對谷歌瀏覽器的重新編譯、封裝,分為兩個版本線,CEF1和CEF3,我曾對此項目做過一些研究,研究的相關資料參見:http://www.cnblogs.com/liulun/archive/2013/03/18/2874276.html;另外,還有一個node webkit的項目(地址:https://github.com/rogerwang/node-webkit)也是對谷歌瀏覽器的重新編譯和封裝,但它引入了NodeJs,使用簡單的HTML JS CSS就可以編寫出絢麗的客戶端界面。node webkit目前處于V0.7.X版本。 

二:思路

    1.目標

    搭建一個CB/S結構的企業(yè)應用程序

    盡量保證系統(tǒng)的執(zhí)行效率

    盡量保證系統(tǒng)升級更新的便利性

    盡量保證系統(tǒng)的可擴展性

    2.方案

 

    ExtJs框架是一個比較龐大的框架,一般B/S結構的程序使用ExtJS框架,都是把ExtJs的框架放在服務端,這樣用戶每次請求頁面的時候,都會去訪問ExtJS框架的JS文件,從而產生大量的磁盤IO和網絡消耗,這也是ExtJS框架看起來渲染很慢的一個因素。B/S結構的應用程序無法解決這個問題,主要是因為無法控制客戶端的瀏覽器,CB/S結構的程序就能輕松解決這個問題??梢园袳xtJs框架打包進客戶端程序中,隨客戶端程序分發(fā)給使用者,使用者請求頁面時,使用的是本地的ExtJS框架的JS文件,業(yè)務邏輯程序則仍舊使用服務端的。這樣做減少了磁盤IO和網絡消耗,保證了系統(tǒng)的執(zhí)行效率;服務端對業(yè)務邏輯程序依舊保持著很好的控制權,保證了系統(tǒng)升級更新的便利性

    關于系統(tǒng)的可擴展性,ExtJs就能很好的處理,在下一節(jié)中會有詳細描述。

 

    3.難點

 

    CB/S結構的應用程序其實就是一個高度定制的瀏覽器。為了讓這個瀏覽器完成指定的功能(比如:包含ExtJs框架的js文件,做成cookie,發(fā)起請求等)難免會有很多客戶端和瀏覽器核心的交互。這些交互涉及到C++,Js,HTML,CSS等的互操作,是系統(tǒng)在技術上的難點。

 

 

三:客戶端瀏覽器實現(xiàn)

 

    1.搭建開發(fā)環(huán)境

 

    我們下載基于MinGW 4.8, OpenGL創(chuàng)建的QT 5.1,地址為:http://qt-project.org/downloads。不選擇基于VS編譯器的QT是因為用VS編譯器編譯出的DLL依賴VS運行時,分發(fā)程序時較困難。下載并安裝后,你會看到這并不是一個簡單的界面庫,它還包含了一個IDE,Qt Creator。

    安裝完成后,就可以使用Qt Creator來創(chuàng)建你自己的基于Qt的桌面程序,你可以在Qt Creator的歡迎界面看到入門程序、示例程序和幫助文檔。Qt的開發(fā)方式并不是本文所講述的重點,建議讀者到官網學習。

    雖然我們可以成功在Qt Creator內編譯并成功執(zhí)行程序,但到windows目錄下通過雙擊執(zhí)行編譯出的exe程序,就不能正常運行,這是因為可執(zhí)行程序所需的動態(tài)鏈接庫并沒有與可執(zhí)行程序在同一個目錄內,至于可執(zhí)行程序依賴哪些動態(tài)鏈接庫,我們將在本文第四節(jié)詳細描述。

 

    2.邊框和標題欄

 

    目前大部分windows桌面程序都使用自定義的邊框和標題欄,比如QQ,360安全衛(wèi)士等,使用MFC或Windows API自定義窗口的標題欄和邊框并不是一件容易的事情,使用Qt來開發(fā)Windows桌面程序也有一樣的困難。

    由于我們開發(fā)的是企業(yè)應用系統(tǒng),這類系統(tǒng)一般情況下都出于最大化狀態(tài),所以我們在考慮自定義標題欄和邊框的時候就可以不用考慮還原按鈕、拖拽改變窗口大小和位置的功能。但是,我們需要為標題欄增加一個下拉菜單按鈕,以使用戶完成系統(tǒng)設置、打開調試器等相關功能。

    另外,為了使標題欄和業(yè)務界面中ExtJs的風格一致,我們索性去掉了主窗口的標題欄和邊框,直接使用ExtJs來生成。

    在Qt中去掉標題欄和邊框是很容易的事,創(chuàng)建窗口的時候設置一個WindowFlags即可,見如下代碼:    

w.setWindowFlags(Qt::FramelessWindowHint);

    但設置此WindowFlags之后隨之帶來的問題是,窗口將撐滿整個屏幕,把系統(tǒng)的任務欄也遮住了,這顯然不是我們想要的,解決此問題需要重寫Qt窗口類的changeEvent槽,見如下代碼:

if(event->WindowStateChange)

{

   switch(this->windowState())

   {

   case Qt::WindowMinimized:

this->hide();

event->ignore();

   break;

   case Qt::WindowMaximized:

   QDesktopWidget desktopWidget =QApplication::desktop();

   QRect deskRect =desktopWidget->availableGeometry();

   this->resize(deskRect.width(), deskRect.height());

   break;

   }

}

    這樣創(chuàng)建的Qt窗口將不具有標題欄和邊框,至于如何用ExtJs來渲染標題欄,以及如何實現(xiàn)標題欄的最小化及關閉等功能,將在后續(xù)小節(jié)講述。

 

  3.打開新窗口

 

    使用Qt的WebKit非常簡單,直接把QWebView控件拖放到界面中去即可,但是默認的QWebView在實現(xiàn)上有些缺憾,比如無法打開新窗口,無法下載文件,無法打印等。然而這些功能是一個瀏覽器所必備的功能,我們的CB/S企業(yè)應用系統(tǒng)也需要這些功能。要想讓瀏覽器支撐這些功能,只能通過重寫QWebView來完成。

    要想讓自制的瀏覽器打開新窗口,需要重寫QWebView的createWindow方法,見如下代碼:(UtmpWebView即為QWebView的子類)

    UtmpWebView
webView = new UtmpWebView;

    QWebPage newWeb = new QWebPage;

    if(type == QWebPage::WebModalDialog)

    {

        webView->setWindowModality(Qt::ApplicationModal);

    }

    webView->setAttribute(Qt::WA_DeleteOnClose,true);

    webView->setPage(newWeb);

    webView->show();

    return webView;

    然而,這只能應對a標簽的target屬性為_blank的新窗口鏈接,無法應對使用javascript通過window.open的方式打開新窗口的場景。要想滿足這一點,必須在QWebView的構造函數(shù)里,更改一下瀏覽器的配置參數(shù),代碼如下:

QWebSettings
default_settings = QWebSettings::globalSettings();

default_settings->setAttribute(QWebSettings::JavascriptEnabled,true);

default_settings->setAttribute(QWebSettings::JavascriptCanOpenWindows,true);

 

    4.打印

 

    我們經常在網頁中通過javascript使用window.print的方式來調用打印機打印HTML頁面,常見的瀏覽器都會支持這個功能,然而QWebView默認并不支持此功能,要想讓我們定制的瀏覽器支持此功能必須為其做一個事件鏈接,代碼如下:

connect(this->page(), SIGNAL(printRequested(QWebFrame)),this,SLOT(customPrintRequested(QWebFrame)));

    this->page()->setForwardUnsupportedContent(true);

customPrintRequested槽的實現(xiàn)如下:

    QPrinter* p = new QPrinter(QPrinter::HighResolution);

    QPrintDialog printDialog(p, this);

    printDialog.setWindowTitle("UTMP打印");

    if(printDialog.exec() != QDialog::Accepted)

    {

        return;

    }

    frame->print(p);

 

    5.下載

 

    同樣QWebView默認也不支持下載文件。所有的瀏覽器把請求的響應分為兩類,一類是瀏覽器可以解析的(Html文本),另一類是瀏覽器無法解析的(文件),常見的瀏覽器遇到無法解析的文件,往往會下載到本地給用戶使用,要想讓QWebView支持下載,就必須截獲瀏覽器的unsupportedContent信號,該信號所對應的槽的代碼實現(xiàn)如下

ShellExecuteA(NULL, "open", reply->url().toString().toStdString().c_str(), "", "", SW_SHOW);

    注意,要想讓上面的代碼正確執(zhí)行,必須在頭文件中引入windows.h(這也體現(xiàn)出QT框架與NativeAPI能沒有任何限制的輕松交互)。上面的代碼是調用了系統(tǒng)默認的瀏覽器來完成下載。當然讀者也可以考慮自己實現(xiàn)下載線程并提示下載進度、保存地址等。

 

    6.與頁面腳本交互

 

    我們既然選擇自己開發(fā)瀏覽器,那么瀏覽器一定能自如的讓頁面執(zhí)行一些特殊腳本,頁面也可以通過腳本讓瀏覽器完成一些腳本無法完成的操作。此功能一般的瀏覽器都無法支撐,只有我們自定義的QWebView可以輕松實現(xiàn)。

    我們知道javascript在頁面中執(zhí)行都會用到window對象,比如,我們調用alert()方法時,其實是調用window.alert()方法,使用document對象時,其實是使用window.document對象,要想讓瀏覽器能與頁面腳本交互,我們必須讓瀏覽器給頁面的window對象注冊一個子對象(window對象的屬性)。

    遇到的第一個問題并不是如何注冊此對象,而是在何時注冊。由于在頁面加載之初,window對象就已經初始化完成了,此時為其注冊子對象已為時已晚,必須在其初始化之前為其注冊,為此QWebView專門提供了javaScriptWindowObjectCleared信號,在刷新網頁、打開新網頁和加載嵌套的iframe頁面時(window對象初始化時),此信號都會被觸發(fā)。與此信號關聯(lián)的槽,代碼如下:

this->page()->mainFrame()->addToJavaScriptWindowObject("QtWinFrame", this);

如你所見,我們?yōu)閣indow對象注冊了一個名為QtWinFrame的對象。這就像瀏覽器為window對象注冊document子對象一樣,要想讓頁面腳本能調用瀏覽器核心的方法,必須為讓瀏覽器核心提供相應的方法才行,由于我們在第二小節(jié)已經把窗口默認的標題欄和邊框去掉了,所以必須通過頁面javascript來關閉瀏覽器和最小化瀏覽器,假設我們在瀏覽器核心中實現(xiàn)的方法代碼如下:

void UtmpWebView::SetFrameWindow(int flag)

{

    switch(flag)

    {

        case 0:

            this->close();

            break;

        case 1:

            this->showMinimized();

            break;

}

}

在瀏覽器頁面內,只要通過如下javascript代碼,即可讓瀏覽器核心執(zhí)行相應的操作:

QtWinFrame.SetFrameWindow(1);QtWinFrame.SetFrameWindow(0);

相對于“腳本讓瀏覽器執(zhí)行工作”來說,“瀏覽器讓腳本執(zhí)行工作”就簡單很多,只需要在瀏覽器中調用evaluateJavaScript方法即可,見如下代碼:

this->page()->mainFrame()->evaluateJavaScript("testFun();");

注意:這有些類似于javascirpt中的eval()方法,如果前端框架中引入了ExtJs,最好不要直接使用此方法來調用ExtJs提供的函數(shù),執(zhí)行效率非常慢??梢韵仍陧撁嫔嫌闷胀ǖ膉s函數(shù)包裝一下ExtJs提供的函數(shù),再來調用。

 

    7.打開腳本調試器

 

    調試javascript代碼一直以來都是開發(fā)人員面臨的老大難的問題,自從有了FireBug和谷歌瀏覽器自帶的javascript調試器之后,這個問題得到了很大程度的解決,所以有個好的javascript調試器十分關鍵。QWebView也提供了相應的調試工具(我認為就是谷歌瀏覽器的javascript調試器,但未經驗證。)。使瀏覽器核心打開調試器的代碼如下:

QDialog d = new QDialog(this,(Qt::WindowMinimizeButtonHint|Qt::WindowMaximizeButtonHint|Qt::WindowCloseButtonHint));

d->setAttribute(Qt::WA_DeleteOnClose, true);

QWebInspector
wi = new QWebInspector(d);

wi->setPage(this->page());

d->setLayout(new QVBoxLayout());

d->layout()->setMargin(0);

d->layout()->addWidget(wi);

d->show();

d->resize(600,350);

    由于我們在系統(tǒng)啟動的時候,使用Qt::FramelessWindowHint屬性禁用掉了窗口的標題欄和邊框,所以在打開調試器子窗口的時候,要恢復該子窗口的標題欄和邊框,為此我們多做了一些工作,讀者也可以自己實現(xiàn)QDialog類型的父類,以應對更多子窗口業(yè)務。

 

8.截獲瀏覽器請求

 

    既然我們對瀏覽器有最大的控制權,那么我們就希望當瀏覽器完成指定工作時通知我們,好讓我們做一些前期或后期的處理。最常見的工作莫過于瀏覽器發(fā)起請求了。我們知道瀏覽器解析一個網頁的過程中,可能會發(fā)起多次請求,比如圖片標簽的src路徑,iframe標簽的src路徑,js/css資源的路徑等等。要想知道這些請求何時發(fā)起,何時終結需要重寫QNetworkAccessManager,然后通過如下方式,讓瀏覽器加載自定義的QNetworkAccessManager

QNetworkAccessManager oldManager = webview->page->networkAccessManager();

MyNetworkAccessManager
newManager = new MyNetworkAccessManager(oldManager, this);

webview->page->setNetworkAccessManager(newManager);

然后,我們可以在自定義的MyNetworkAccessManager類中重寫createRequest(QNetworkAccessManager::Operation operation,const QNetworkRequest &request, QIODevice *device)方法,其中request參數(shù),包含了原始請求的URL信息,此方法需要返回一個QNetworkReply對象,假設我們想改變原始請求的路徑,可以按如下操作方式來完成

return QNetworkAccessManager::createRequest(operation, myrequest, device);

如你所見,我們用QNetworkAccessManager新建了一個請求(createRequest的返回值為QNetworkReply類型),該請求中myrequest實參的類型為QNetworkRequest,其他兩個實參從原始方法中獲得。

 

    9.本地化ExtJs庫

 

    一般我們使用ExtJs(官方地址:http://www.sencha.com/products/extjs/),都是把它部署在服務端,瀏覽器請求頁面時,也會相應的加載ExtJs的資源以渲染界面,但由于ExtJs包含眾多js文件和其他資源,通過網絡來加載的話,一方面增加了服務器IO消耗,另一方面增加了網絡延時,很多用戶反應基于ExtJs的網絡應用呈現(xiàn)速度慢,都是這兩個原因導致的。

    現(xiàn)在我們開發(fā)自己的瀏覽器,就可以把Extjs庫(不包含業(yè)務JS代碼,因為業(yè)務JS代碼易于變化,不適合當作資源放在客戶端)當作資源放在客戶端,對于一個客戶端來說,體積越小越好,然而以ext4.2.1 gpl版為例,官方提供的壓縮包里,有很多內容不適合打包到客戶端中。比如:教程、文檔、源碼、示例等,讀者可以自行將這些內容刪掉,然后把精簡后的ExtJs類庫放到瀏覽器應用程序編譯文件夾內([appDirectory]\build-UTMP-Desktop_Qt_5_1_1_MinGW_32bit-Debug\debug),這樣Extjs類庫就與我們的瀏覽器可執(zhí)行程序在同一個目錄下了,如果讓瀏覽器使用Extjs類庫的資源,還應該在此目錄下創(chuàng)建一個靜態(tài)文件,以引入同目錄下的靜態(tài)資源,代碼如下:

    <link href="ext-4.2.1.883/resources/Css/ext-all.css" rel="stylesheet" type="text/css" />

    <script src="ext-4.2.1.883/ext-all-debug.js"></script>

    當然,單單引入資源,還無法呈現(xiàn)ExtJs的絢麗界面,此時還需要引入一個服務器端的JS文件,此文件通過Extjs的類庫加載機制,加載更多的業(yè)務JS,以達到實現(xiàn)特定業(yè)務邏輯的目的。我們在下一節(jié)中會詳細介紹這些內容。

    <script src="http://localhost:8080/UTMP/app.js"&gt;&lt;/script&gt;

    在QT中只需要通過本地路徑加載這個靜態(tài)頁面即可,代碼如下:

UtmpWebView w;    

QDir dir(QDir::currentPath());

QUrl url = url.fromLocalFile(dir.path()+"/debug/index.html");

w.load(url);

    由此可見,保存在客戶端的資源基本都是業(yè)務無關的、比較穩(wěn)定的、不易變更的資源。保存在服務端的內容,都是與業(yè)務有關的,比較容易變更的內容,這種機制主要意圖是保證了業(yè)務的可升級性。    

 

 

四:服務端業(yè)務腳本

 

1.OPOA模式

 

    使用Extjs的企業(yè)應用系統(tǒng)大多都是OPOA模式(One Page One Application),OPOA模式的WEB系統(tǒng)只有一個頁面,在這個頁面中會引入extjs的資源并通過js來渲染一個框架頁面,然后根據(jù)用戶的操作載入更多的js代碼,來完成不同的業(yè)務。對于我們的系統(tǒng)來說這個頁面就是放在客戶端本地debug目錄下的靜態(tài)頁面。這個頁面引入了一個服務器端的js文件(http://localhost:8080/UTMP/app.js),通過此文件以及由此文件加載的其他js文件,我們渲染出了一個框架頁面,見如下代碼

Ext.application({

    name:'UTMP',

    appFolder:'
    controllers:["sys.index"],

    views:["sys.menuTree","sys.titleBar","sys.contentTabPanel"],

    launch:function(){    

        Ext.create('Ext.Viewport',{

           layout:'border',

           items:[

               {xtype: 'menuTree'},

               {xtype: 'titleBar'},

               {xtype: 'contentTabPanel'}

           ]

        });

    }

});

如你所見,這是一個Extjs系統(tǒng)的開始(Ext.application),而且我們使用了Extjs的MVC模式(關于ExtJs的MVC模式的相關資料請參閱:
http://docs.sencha.com/extjs/4.2.1/#!/guide/application_architecture),系統(tǒng)界面中包含三個視圖:menuTree、titleBar和contentTabPanel。由于我們設計的瀏覽器沒有標題欄,所以視圖titleBar就是系統(tǒng)的標題欄,它包含了關閉、最小化按鈕。

 

2.定制模塊加載基址

 

    Extjs有一套獨特的模塊加載機制,它可以通過js類的名稱空間來加載相應的js代碼文件,比如視圖文件的名稱空間是UTMP.sys.menuTree,ExtJs框架會從appFolder指定的路徑下找sys目錄下的menuTree.js文件。在普通的ExtJs項目中,appFolder屬性并不用設定為絕對路徑,只需要使用相對路徑即可,但由于我們的項目的主頁(靜態(tài)頁面)是放在客戶端本地的,如果使用相對路徑的話,ExtJs框架就會在客戶端本地尋找相應的資源,然而我們的業(yè)務JS文件都是放在服務端的,所以勢必會無法加載這些資源。

 

3.定制AJAX請求基址

 

    模塊加載機制可以通過設置appFolder基路徑來解決,但是對于業(yè)務JS代碼隨處可見的AJAX請求該如何處理呢?確實,AJAX請求也會面臨這種問題,而且更為突出。因為在ExtJs中對AJAX請求做了很多封裝:proxy、store、request、load等,隨處可見ajax的身影。幸而ExtJs是一個對象化程度較高的js類庫,使得這個問題能很容易的解決。

    在ExtJs中所有Ajax請求都離不開Ext.data.Connection類的支撐,我們可以使用ExtJs提供的觀察者模式來注冊Ext.data.Connection類的beforerequest事件(這是一種侵入性較強的做法),這樣所有的AJAX請求,不管是proxy發(fā)起的,還是request發(fā)起的,都逃不出我們的手心,具體實現(xiàn)代碼如下:

Ext.util.Observable.observe(Ext.data.Connection,{

    beforerequest: function(conn, options, eOpts){

        options.url = ";

    }

});

 

五:分發(fā)

 

1.依賴的動態(tài)鏈接庫

 

    在使用QTCreator開發(fā)基于QT的應用程序時,不管是debug編譯還是release編譯,都無法到編譯目錄下,通過雙擊exe程序來執(zhí)行應用(會提示“無法啟動此程序,因為計算機中丟失xxxx.dll....”的錯誤信息),之所以在IDE內能順利執(zhí)行,是因為IDE已經為程序執(zhí)行創(chuàng)建好了環(huán)境,但倘若不解決此問題,就無法把應用程序分發(fā)給直接用戶。

     要解決此問題只要把Qt類庫提供的dll文件放在可執(zhí)行程序的目錄下或其所在目錄的子目錄下即可,在C:\Qt\Qt5.1.1\5.1.1\mingw48_32\bin目錄下有Qt類庫提供的大多數(shù)dll,這些dll名稱以字母d結尾的是debug編譯的應用程序所依賴的類庫,不以字母d結尾的則是release編譯的應用程序所需要的類庫,除了此目錄內的dll外,在C:\Qt\Qt5.1.1\5.1.1\mingw48_32\plugins目錄下還有一些應用程序需要的dll類庫。

    如此數(shù)量眾多的dll,都需要打包到我們最終的安裝程序中去嗎?當然不用這么做。通過IDE執(zhí)行我們的應用程序時,我們只需要通過processExplorer工具來查看應用程序進程所依賴的dll,即可判定哪些dll是需要打包到安裝包中去的(大多數(shù)情況下可以這么做,如果是開發(fā)人員通過代碼動態(tài)加載的類庫,那么我相信你也會自行甄別的)。

 

2.打包

    

    可能有的讀者會問:“我可不可以把類庫靜態(tài)編譯到exe中去呢?”當然可以,但是非常麻煩,你需要自己靜態(tài)編譯整個QT工程,還需要對IDE做出相應的調整(要編譯QT的Webkit還需要做更多的工作),這是一項耗時、耗力還不一定能成功的工作,我不建議這么做。

    當我們找到應用程序依賴的所有dll后,我們就可以使用打包工具來制作應用程序的安裝包,當然也可以自己開發(fā)安裝包工具(可以參見我的博客:
http://www.cnblogs.com/liulun/archive/2011/12/12/2284360.html)。

    國內外有很多不錯的打包工具,我推薦使用inno setup(http://www.jrsoftware.org/),它支持編寫腳本來控制安裝過程,使用LZMA壓縮算法來打包程序(壓縮效率非常高,是7-zip使用的壓縮算法),但它并不支持中文安裝界面,目前社區(qū)有開發(fā)者提供了針對inno setup的中文語言包,使用起來也非常方便。

日歷

鏈接

個人資料

藍藍設計的小編 http://www.cqzjtgb.com

存檔

99精品欧美一区二区三区四区| 欧美一级毛片孕妇| 97在线人人人人妻| 一边摸一边抽搐一进一出视频| 亚洲精品国产色婷婷电影| 别揉我奶头~嗯~啊~动态视频| 国内毛片毛片毛片毛片毛片| 日韩欧美三级三区| 韩国精品一区二区三区| 九色亚洲精品在线播放| 久久影院123| 男人操女人黄网站| 亚洲中文av在线| 乱人伦中国视频| av免费在线观看网站| 国产免费视频播放在线视频| 国产激情久久老熟女| 男人操女人黄网站| 亚洲黑人精品在线| 一区二区日韩欧美中文字幕| 女人高潮潮喷娇喘18禁视频| 一二三四在线观看免费中文在| 午夜精品久久久久久毛片777| 又大又爽又粗| 国产精品免费一区二区三区在线 | 深夜精品福利| 在线亚洲精品国产二区图片欧美| 精品第一国产精品| 人成视频在线观看免费观看| 午夜福利视频在线观看免费| 制服人妻中文乱码| 在线观看一区二区三区激情| 男男h啪啪无遮挡| 一级片'在线观看视频| 1024视频免费在线观看| 视频区欧美日本亚洲| 蜜桃国产av成人99| 免费在线观看视频国产中文字幕亚洲| 天堂8中文在线网| 欧美乱妇无乱码| 亚洲av日韩在线播放| 俄罗斯特黄特色一大片| 国产一区二区激情短视频| 国产91精品成人一区二区三区 | 国产91精品成人一区二区三区 | 精品国产乱码久久久久久男人| 亚洲欧美色中文字幕在线| 成人亚洲精品一区在线观看| 国产老妇伦熟女老妇高清| 夫妻午夜视频| 菩萨蛮人人尽说江南好唐韦庄| 国产男女超爽视频在线观看| 国产在线观看jvid| 亚洲伊人色综图| 久久ye,这里只有精品| 国产精品av久久久久免费| 欧美激情 高清一区二区三区| 国产淫语在线视频| 精品少妇一区二区三区视频日本电影| 亚洲avbb在线观看| 久久天躁狠狠躁夜夜2o2o| 久久久国产一区二区| 日韩大片免费观看网站| 亚洲精品一二三| 在线观看66精品国产| 99国产精品一区二区三区| 欧美精品亚洲一区二区| 一本综合久久免费| av一本久久久久| 午夜久久久在线观看| 老司机影院毛片| 精品国产亚洲在线| 黄色视频在线播放观看不卡| 免费在线观看日本一区| 午夜福利,免费看| 亚洲三区欧美一区| 可以免费在线观看a视频的电影网站| a在线观看视频网站| 岛国在线观看网站| 亚洲精品国产一区二区精华液| cao死你这个sao货| 久久人妻熟女aⅴ| 国产精品熟女久久久久浪| 久久天躁狠狠躁夜夜2o2o| 精品国产乱码久久久久久男人| 免费黄频网站在线观看国产| 久久久国产欧美日韩av| 国产日韩欧美视频二区| 色婷婷久久久亚洲欧美| 18禁观看日本| 精品一区二区三区视频在线观看免费 | 免费观看av网站的网址| 美女视频免费永久观看网站| 夜夜骑夜夜射夜夜干| 一级毛片精品| 99久久国产精品久久久| 成年人免费黄色播放视频| 97在线人人人人妻| 午夜免费成人在线视频| 熟女少妇亚洲综合色aaa.| 狂野欧美激情性xxxx| 黄片播放在线免费| 夜夜骑夜夜射夜夜干| 久久久精品94久久精品| 亚洲人成电影免费在线| 麻豆国产av国片精品| 亚洲全国av大片| 国产日韩欧美视频二区| 99久久99久久久精品蜜桃| 久久人人爽av亚洲精品天堂| 成人国语在线视频| 99精品久久久久人妻精品| 菩萨蛮人人尽说江南好唐韦庄| 天天添夜夜摸| 成在线人永久免费视频| 99国产综合亚洲精品| 成人免费观看视频高清| 交换朋友夫妻互换小说| 大型av网站在线播放| 欧美黄色片欧美黄色片| 午夜视频精品福利| 五月天丁香电影| 国产精品免费视频内射| 午夜视频精品福利| 又黄又粗又硬又大视频| 天天躁日日躁夜夜躁夜夜| 啦啦啦视频在线资源免费观看| 黑人猛操日本美女一级片| 欧美成人免费av一区二区三区 | 蜜桃国产av成人99| 老司机在亚洲福利影院| 亚洲专区国产一区二区| 成人永久免费在线观看视频 | 91字幕亚洲| 免费日韩欧美在线观看| 窝窝影院91人妻| 成人18禁高潮啪啪吃奶动态图| 一级毛片电影观看| 免费不卡黄色视频| a级毛片在线看网站| 高清视频免费观看一区二区| 日韩欧美一区二区三区在线观看 | 国产色视频综合| 久久狼人影院| 老熟女久久久| 亚洲国产成人一精品久久久| 老司机在亚洲福利影院| 国产精品国产高清国产av | 久久人妻av系列| av天堂久久9| 9色porny在线观看| 久久影院123| 色视频在线一区二区三区| 99精品在免费线老司机午夜| 日日摸夜夜添夜夜添小说| 亚洲精品国产色婷婷电影| 国产在线精品亚洲第一网站| 久久午夜综合久久蜜桃| 久久香蕉激情| 国产成人av教育| 狂野欧美激情性xxxx| 一边摸一边抽搐一进一小说 | 亚洲成av片中文字幕在线观看| 久久亚洲精品不卡| 日韩欧美一区视频在线观看| av在线播放免费不卡| 精品国产一区二区三区四区第35| 男女无遮挡免费网站观看| 午夜福利乱码中文字幕| 一个人免费看片子| 国产精品二区激情视频| 两个人免费观看高清视频| www.999成人在线观看| 精品一品国产午夜福利视频| 国产精品久久久人人做人人爽| 久久午夜综合久久蜜桃| 黄色视频,在线免费观看| 国产精品一区二区在线观看99| 亚洲精品粉嫩美女一区| 国产男女超爽视频在线观看| 欧美日韩av久久| 国产精品熟女久久久久浪| 国产精品一区二区在线观看99| 国产成人精品在线电影| 日韩欧美免费精品| 国产免费福利视频在线观看| 桃红色精品国产亚洲av| 视频区图区小说| 十分钟在线观看高清视频www| 狠狠狠狠99中文字幕| 欧美精品一区二区大全| 亚洲色图 男人天堂 中文字幕| 视频区图区小说| 亚洲精品乱久久久久久| 国产亚洲欧美精品永久| 伦理电影免费视频| 男女高潮啪啪啪动态图| 国产激情久久老熟女| 精品第一国产精品| 真人做人爱边吃奶动态| 亚洲成国产人片在线观看| 久久精品熟女亚洲av麻豆精品| 男女边摸边吃奶| 国产av精品麻豆| 黄频高清免费视频| 亚洲国产看品久久| 久久精品aⅴ一区二区三区四区| 1024香蕉在线观看| 亚洲精品美女久久久久99蜜臀| 黑丝袜美女国产一区| 高清黄色对白视频在线免费看| 视频在线观看一区二区三区| 久久精品成人免费网站| 亚洲欧美一区二区三区黑人| 人成视频在线观看免费观看| 国产成人影院久久av| 亚洲av国产av综合av卡| 亚洲精品自拍成人| tocl精华| 亚洲成a人片在线一区二区| 欧美中文综合在线视频| 色视频在线一区二区三区| 一级毛片女人18水好多| 女人爽到高潮嗷嗷叫在线视频| 咕卡用的链子| 免费观看a级毛片全部| 一边摸一边抽搐一进一小说 | 久久久国产成人免费| 亚洲天堂av无毛| 亚洲精品国产一区二区精华液| 人人澡人人妻人| 精品一区二区三区av网在线观看 | 国产在视频线精品| av不卡在线播放| 侵犯人妻中文字幕一二三四区| 久久婷婷成人综合色麻豆| 亚洲成人免费av在线播放| 精品国产一区二区三区四区第35| 国产精品免费一区二区三区在线 | 欧美性长视频在线观看| 色视频在线一区二区三区| 国产亚洲精品一区二区www | 在线观看免费午夜福利视频| 无人区码免费观看不卡 | 高清在线国产一区| 天堂8中文在线网| 窝窝影院91人妻| 亚洲自偷自拍图片 自拍| 下体分泌物呈黄色| 亚洲一区中文字幕在线| 黄网站色视频无遮挡免费观看| 亚洲熟女毛片儿| 国产精品1区2区在线观看. | 午夜福利,免费看| 国产欧美日韩精品亚洲av| 欧美黑人欧美精品刺激| 欧美日本中文国产一区发布| 免费女性裸体啪啪无遮挡网站| 午夜福利在线观看吧| 久久久久国内视频| 日韩一卡2卡3卡4卡2021年| 18禁裸乳无遮挡动漫免费视频| 正在播放国产对白刺激| 中文字幕高清在线视频| 欧美日韩av久久| 亚洲全国av大片| 成年动漫av网址| 欧美午夜高清在线| 啦啦啦 在线观看视频| 18禁美女被吸乳视频| 中文欧美无线码| 欧美一级毛片孕妇| 一级毛片电影观看| 91九色精品人成在线观看| 曰老女人黄片| 成人国产一区最新在线观看| tube8黄色片| 欧美黄色片欧美黄色片| 亚洲,欧美精品.| 日韩熟女老妇一区二区性免费视频| 亚洲精品美女久久av网站| 亚洲av日韩在线播放| 久久中文字幕一级| 国产有黄有色有爽视频| 蜜桃在线观看..| 黄频高清免费视频| 最黄视频免费看| 如日韩欧美国产精品一区二区三区| 日本精品一区二区三区蜜桃| 少妇裸体淫交视频免费看高清 | 99香蕉大伊视频| 人人妻人人澡人人看| 国产成人欧美在线观看 | 天堂俺去俺来也www色官网| 国产一区有黄有色的免费视频| 十八禁网站免费在线| 国产伦理片在线播放av一区| 人成视频在线观看免费观看| 久久这里只有精品19| 免费av中文字幕在线| 十分钟在线观看高清视频www| 久久ye,这里只有精品| 亚洲av成人一区二区三| 亚洲成人免费电影在线观看| 国产精品久久久久久精品古装| 午夜福利乱码中文字幕| 国产成人精品在线电影| 欧美成狂野欧美在线观看| 桃花免费在线播放| 成人影院久久| 欧美日韩国产mv在线观看视频| 国产无遮挡羞羞视频在线观看| 成年动漫av网址| 国产精品av久久久久免费| 欧美乱妇无乱码| 狠狠婷婷综合久久久久久88av| 女人久久www免费人成看片| 99久久99久久久精品蜜桃| 五月天丁香电影| 极品少妇高潮喷水抽搐| 啦啦啦 在线观看视频| 亚洲人成电影观看| 欧美成人免费av一区二区三区 | 精品人妻熟女毛片av久久网站| 欧美日韩中文字幕国产精品一区二区三区 | 欧美变态另类bdsm刘玥| 国产伦人伦偷精品视频| 无人区码免费观看不卡 | 欧美精品啪啪一区二区三区| 丝袜喷水一区| 大型av网站在线播放| 制服人妻中文乱码| 中文字幕制服av| 免费女性裸体啪啪无遮挡网站| 亚洲成a人片在线一区二区| 精品一区二区三区av网在线观看 | 成人国产一区最新在线观看| 日韩视频在线欧美| 人人妻人人爽人人添夜夜欢视频| 欧美激情 高清一区二区三区| 久久久久国内视频| 在线观看www视频免费| 免费一级毛片在线播放高清视频 | 日本wwww免费看| 一本色道久久久久久精品综合| 中文字幕色久视频| 在线观看免费高清a一片| 色婷婷久久久亚洲欧美| 欧美av亚洲av综合av国产av| 汤姆久久久久久久影院中文字幕| 久久ye,这里只有精品| 极品少妇高潮喷水抽搐| 欧美精品一区二区大全| 人人妻人人添人人爽欧美一区卜| 自线自在国产av| 中文字幕另类日韩欧美亚洲嫩草| 美女扒开内裤让男人捅视频| 国产一区二区三区视频了| 久久中文字幕人妻熟女| av天堂久久9| 成人av一区二区三区在线看| 久久av网站| 国产成人一区二区三区免费视频网站| 久久国产亚洲av麻豆专区| 伊人久久大香线蕉亚洲五| 高清黄色对白视频在线免费看| 国产精品一区二区在线不卡| 国产精品久久久久久精品古装| 国产三级黄色录像| 首页视频小说图片口味搜索| 9热在线视频观看99| 亚洲,欧美精品.| 精品免费久久久久久久清纯 | 黄色视频不卡| 日韩大码丰满熟妇| 国产高清videossex| 我要看黄色一级片免费的| 手机成人av网站| 无遮挡黄片免费观看| 国产成人精品在线电影| 亚洲天堂av无毛| 我的亚洲天堂| 妹子高潮喷水视频| 中文字幕人妻熟女乱码| 精品一品国产午夜福利视频| 男人操女人黄网站| 国产精品久久久久成人av| 欧美午夜高清在线| 免费人妻精品一区二区三区视频| 国产成人精品无人区| 高潮久久久久久久久久久不卡| 色在线成人网| 成人手机av| 老司机亚洲免费影院| 国产精品免费一区二区三区在线 | 男人操女人黄网站| 欧美成人免费av一区二区三区 | 国产区一区二久久| 久久国产精品影院| 视频区欧美日本亚洲| 在线播放国产精品三级| 女人高潮潮喷娇喘18禁视频| 欧美精品一区二区免费开放| 一本大道久久a久久精品| 精品少妇黑人巨大在线播放| 可以免费在线观看a视频的电影网站| 国产一区二区三区视频了| 亚洲精品国产精品久久久不卡| 久久久久久亚洲精品国产蜜桃av| 精品久久久精品久久久| 天天影视国产精品| 精品福利永久在线观看| 婷婷丁香在线五月| 超碰成人久久| 国产又爽黄色视频| 天天影视国产精品| 国产精品免费一区二区三区在线 | 久久av网站| 嫁个100分男人电影在线观看| 人人澡人人妻人| 水蜜桃什么品种好| 国产野战对白在线观看| 久久久国产精品麻豆| 亚洲五月婷婷丁香| 两人在一起打扑克的视频| 精品国产国语对白av| 亚洲av美国av| 久久久国产成人免费| 美女扒开内裤让男人捅视频| 搡老熟女国产l中国老女人| 大型黄色视频在线免费观看| 90打野战视频偷拍视频| 18在线观看网站| 高潮久久久久久久久久久不卡| 精品国产超薄肉色丝袜足j| av视频免费观看在线观看| 久久久久精品人妻al黑| 日本av免费视频播放| 伦理电影免费视频| 欧美精品啪啪一区二区三区| 欧美av亚洲av综合av国产av| 国产成人精品在线电影| 99精品欧美一区二区三区四区| 夜夜爽天天搞| 夫妻午夜视频| 欧美日韩亚洲国产一区二区在线观看 | 丁香欧美五月| 成人av一区二区三区在线看| 国产av一区二区精品久久| 天天添夜夜摸| 桃花免费在线播放| 国产在视频线精品| 久久国产精品男人的天堂亚洲| 欧美精品一区二区大全| 久久ye,这里只有精品| 国产一区二区三区视频了| 最近最新中文字幕大全电影3 | 色婷婷久久久亚洲欧美| 亚洲国产看品久久| 丝袜人妻中文字幕| 人人妻人人添人人爽欧美一区卜| 午夜精品国产一区二区电影| 五月开心婷婷网| 国产欧美日韩一区二区精品| 啦啦啦视频在线资源免费观看| 韩国精品一区二区三区| 色94色欧美一区二区| 国产精品成人在线| 国产99久久九九免费精品| 日韩制服丝袜自拍偷拍| videosex国产| 国产成人欧美在线观看 | 中文字幕人妻丝袜制服| 色综合欧美亚洲国产小说| 国产精品亚洲一级av第二区| 好男人电影高清在线观看| 精品久久久久久久毛片微露脸| 亚洲成a人片在线一区二区| 国产一区二区 视频在线| 国产精品亚洲一级av第二区| 亚洲男人天堂网一区| 菩萨蛮人人尽说江南好唐韦庄| 久久久精品国产亚洲av高清涩受| 精品高清国产在线一区| 国产深夜福利视频在线观看| 叶爱在线成人免费视频播放| 18禁裸乳无遮挡动漫免费视频| 亚洲欧美日韩另类电影网站| 亚洲男人天堂网一区| 成人黄色视频免费在线看| 熟女少妇亚洲综合色aaa.| 国产精品1区2区在线观看. | 丁香六月欧美| 美女国产高潮福利片在线看| 少妇精品久久久久久久| 亚洲熟妇熟女久久| www.精华液| 欧美在线黄色| 99久久精品国产亚洲精品| 国产亚洲一区二区精品| 国产精品久久久久久人妻精品电影 | 国产精品久久久久成人av| videosex国产| 50天的宝宝边吃奶边哭怎么回事| 在线观看免费视频网站a站| 性少妇av在线| 美女视频免费永久观看网站| 大型av网站在线播放| 女人爽到高潮嗷嗷叫在线视频| 男女床上黄色一级片免费看| 性少妇av在线| 纯流量卡能插随身wifi吗| 国产av又大| 一边摸一边做爽爽视频免费| 日韩人妻精品一区2区三区| 免费日韩欧美在线观看| 国产一区二区激情短视频| 国产人伦9x9x在线观看| 在线观看免费视频网站a站| 久久久久视频综合| 伊人久久大香线蕉亚洲五| 午夜精品久久久久久毛片777| av免费在线观看网站| 51午夜福利影视在线观看| 91精品国产国语对白视频| 亚洲成人免费av在线播放| 久久香蕉激情| 日韩中文字幕欧美一区二区| 久久久久久久精品吃奶| 亚洲一区中文字幕在线| 国产精品九九99| 在线观看免费高清a一片| 欧美午夜高清在线| 欧美精品av麻豆av| 91成人精品电影| 国产一区二区在线观看av| 日韩制服丝袜自拍偷拍| 99久久国产精品久久久| 老熟妇仑乱视频hdxx| 免费观看a级毛片全部| 欧美亚洲日本最大视频资源| 国产精品成人在线| 国产在视频线精品| 久久中文字幕人妻熟女| 欧美乱码精品一区二区三区| 黄色视频不卡| 黑人欧美特级aaaaaa片| 日本精品一区二区三区蜜桃| 国产精品一区二区免费欧美| 久热这里只有精品99| 亚洲第一欧美日韩一区二区三区 | 亚洲av电影在线进入| 热re99久久国产66热| 亚洲av电影在线进入| 法律面前人人平等表现在哪些方面| 日韩中文字幕欧美一区二区| 最近最新中文字幕大全免费视频| 久久影院123| 日韩 欧美 亚洲 中文字幕| 日本撒尿小便嘘嘘汇集6| 悠悠久久av| 国产极品粉嫩免费观看在线| 欧美日韩亚洲高清精品| 免费观看a级毛片全部| 伊人久久大香线蕉亚洲五| 日本wwww免费看| 男女午夜视频在线观看| 桃花免费在线播放| 日本欧美视频一区| 久久久国产一区二区| 一区二区日韩欧美中文字幕| 久久人妻av系列| 深夜精品福利| 国精品久久久久久国模美| videosex国产| 精品少妇内射三级| 精品国产乱码久久久久久男人| a级毛片黄视频| 满18在线观看网站| 国产精品99久久99久久久不卡| 麻豆av在线久日| 精品少妇一区二区三区视频日本电影| 国产av又大| 在线亚洲精品国产二区图片欧美| 国产成人一区二区三区免费视频网站| 国产精品影院久久| 久久久久视频综合| 精品视频人人做人人爽| 正在播放国产对白刺激| 国产在线视频一区二区| 9191精品国产免费久久| 满18在线观看网站| 日韩一区二区三区影片| av超薄肉色丝袜交足视频| 中文亚洲av片在线观看爽 | 亚洲av国产av综合av卡| 国产无遮挡羞羞视频在线观看| 男人操女人黄网站| 天天躁夜夜躁狠狠躁躁| 亚洲七黄色美女视频| 欧美激情久久久久久爽电影 | 一本色道久久久久久精品综合| 日韩精品免费视频一区二区三区| 黄色丝袜av网址大全| 国产欧美日韩精品亚洲av| 王馨瑶露胸无遮挡在线观看| 亚洲九九香蕉| 黄色视频在线播放观看不卡| 又大又爽又粗| 亚洲国产成人一精品久久久| av又黄又爽大尺度在线免费看| 亚洲av美国av| 国产aⅴ精品一区二区三区波| 在线观看人妻少妇| 久久久国产一区二区|