對比內容
|
C/S結構的應用程序
|
B/S結構的應用程序
|
部署
|
較困難
|
方便
|
升級
|
較困難
|
方便
|
對客戶端的控制權限
|
高
|
低
|
數據實時性
|
高
|
較高
|
通訊效率
|
高
|
較高
|
跨平臺性
|
弱
|
強
|
目前還有一種介於C/S和B/S結構的應用程序之間的應用程序:RIA富互聯網應用程序,這種結構的應用程序通常都是基於瀏覽器插件來運行的,它有較高的客戶端控制權限(比B/S程序高,但比C/S程序低),通訊方式也有較多的選擇(不僅是基於HTTP協議),目前較常見的RIA技術有:Adobe的flex技術、微軟的Silverlight技術、Oracle的WebStart技術。架構師在作技術選型的時候,也能夠綜合權衡採用這些技術。
|
架構師除了選擇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版本。
|
w.setWindowFlags(Qt::FramelessWindowHint);
|
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;
}
}
|
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;
|
QWebSettings* default_settings = QWebSettings::globalSettings();
default_settings->setAttribute(QWebSettings::JavascriptEnabled,true);
default_settings->setAttribute(QWebSettings::JavascriptCanOpenWindows,true);
|
connect(this->page(), SIGNAL(printRequested(QWebFrame*)),this,SLOT(customPrintRequested(QWebFrame*)));
this->page()->setForwardUnsupportedContent(true);
|
QPrinter* p = new QPrinter(QPrinter::HighResolution);
QPrintDialog printDialog(p, this);
printDialog.setWindowTitle("UTMP打印");
if(printDialog.exec() != QDialog::Accepted)
{
return;
}
frame->print(p);
|
ShellExecuteA(NULL, "open", reply->url().toString().toStdString().c_str(), "", "", SW_SHOW);
|
this->page()->mainFrame()->addToJavaScriptWindowObject("QtWinFrame", this);
|
void UtmpWebView::SetFrameWindow(int flag)
{
switch(flag)
{
case 0:
this->close();
break;
case 1:
this->showMinimized();
break;
}
}
|
QtWinFrame.SetFrameWindow(1);
QtWinFrame.SetFrameWindow(0);
|
this->page()->mainFrame()->evaluateJavaScript("testFun();");
|
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);
|
QNetworkAccessManager *oldManager = webview->page->networkAccessManager();
MyNetworkAccessManager *newManager = new MyNetworkAccessManager(oldManager, this);
webview->page->setNetworkAccessManager(newManager);
|
return QNetworkAccessManager::createRequest(operation, myrequest, device);
|
<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>
|
<script src="http://localhost:8080/UTMP/app.js"></script>
|
UtmpWebView w;
QDir dir(QDir::currentPath());
QUrl url = url.fromLocalFile(dir.path()+"/debug/index.html");
w.load(url);
|
Ext.application({
name:'UTMP',
appFolder:'http://10.0.7.109:8080/UTMP/app',
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'}
]
});
}
});
|
Ext.util.Observable.observe(Ext.data.Connection,{
beforerequest: function(conn, options, eOpts){
options.url = "http://10.0.7.109:8080/UTMP/"+options.url;
}
});
|