基于QT的webkit与ExtJs开发CB/S结构的企业应用管理系统
对比内容
|
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版本。
|
- 搭建一个CB/S结构的企业应用程序
- 尽量保证系统的执行效率
- 尽量保证系统升级更新的便利性
- 尽量保证系统的可扩展性
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);
|
如你所见,我们用QNetworkAccessManager新建了一个请求(createRequest的返回值为QNetworkReply类型),该请求中myrequest实参的类型为QNetworkRequest,其他两个实参从原始方法中获得。
<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>
|
当然,单单引入资源,还无法呈现ExtJs的绚丽界面,此时还需要引入一个服务器端的JS文件,此文件通过Extjs的类库加载机制,加载更多的业务JS,以达到实现特定业务逻辑的目的。我们在下一节中会详细介绍这些内容。
<script src="http://localhost:8080/UTMP/app.js"></script>
|
在QT中只需要通过本地路径加载这个静态页面即可,代码如下:
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;
}
});
|
基于QT的webkit与ExtJs开发CB/S结构的企业应用管理系统的更多相关文章
- 笨重的mfc还在基于系统控件,熟练的mfc工程师还比不过学习Qt一个月的学生开发效率高(比较精彩,韦易笑)
作者:韦易笑链接:https://www.zhihu.com/question/29636221/answer/45102191来源:知乎著作权归作者所有,转载请联系作者获得授权. 更新:擦,本来只有 ...
- 基于QT开发的第三方库
基于Qt开发的第三方库 分类: Qt2014-02-12 11:34 1738人阅读 评论(0) 收藏 举报 QT第三方库 目录(?)[+] 文章来源:http://blog.csdn.net ...
- 【Qt编程】基于Qt的词典开发系列--后序
从去年八月份到现在,总算完成了词典的编写以及相关技术文档的编辑工作.从整个过程来说,文档的编写比程序的实现耗费的时间更多.基于Qt的词典开发系列文章,大致包含了在编写词典软件过程中遇到的技术重点与难点 ...
- 【Qt编程】基于Qt的词典开发系列<六>--界面美化设计
本文讲一讲界面设计,作品要面向用户,界面设计的好坏直接影响到用户的体验.现在的窗口设计基本都是扁平化的,你可以从window XP与window 8的窗口可以明显感觉出来.当然除了窗口本身的效果,窗口 ...
- 【Qt编程】基于Qt的词典开发系列<三>--开始菜单的设计
这篇文章讲讲如何实现开始菜单(或者称为主菜单)的设计.什么是开始菜单呢?我们拿常用的软件来用图例说明,大多数软件的开始菜单在左下角,如下图: 1.window 7的开始菜单 2.有道词典的主菜单 3. ...
- 【Qt编程】基于Qt的词典开发系列<二>--本地词典的设计
我设计的词典不仅可以实现在线查单词,而且一个重大特色就是具有丰富的本地词典库:我默认加入了八个类型的词典,如下所示: 由于是本人是通信专业,因此加入了华为通信词典.电子工程词典,又由于我喜爱编程,也加 ...
- 【Qt编程】基于Qt的词典开发系列<一>--词典框架设计及成品展示
去年暑假的时候,作为学习Qt的实战,我写了一个名为<我爱查词典>的词典软件.后来由于导师项目及上课等原因,时间不足,所以该软件的部分功能欠缺,性能有待改善.这学期重新拿出来看时,又有很多东 ...
- 【Qt编程】基于Qt的词典开发系列<十>--国际音标的显示
在年前的一篇文章中,我提到要学习Qt.于是在这学期看了一个月的qt.现在大致对qt有了一些了解.但是现在导师又把我调到了android应用开发平台,所以说qt的学习要搁置了.本打算这学期做一个单词查询 ...
- 【Qt编程】基于Qt的词典开发系列<十二>调用讲述人
我们知道,win7系统自带有讲述人,即可以机器读出当前内容,具体可以将电脑锁定,然后点击左下角的按钮即可.之前在用Matlab写扫雷游戏的时候,也曾经调用过讲述人来进行游戏的语音提示.具体的Matla ...
随机推荐
- 解决关于ArcGIS10.2服务手动启动的问题
解决关于ArcGIS10.2服务手动启动的问题 C:\program files\arcgis\license10.2\bin> lmgrd -z -c service.txt新建一文本,将上面 ...
- eclipse javascript验证报错
项目右键->properties
- jquery 找不到live方法解决
http://stackoverflow.com/questions/15573645/typeerror-live-is-not-a-function
- Ubuntu-12.04-server 配置修改静态 IP地址
前几天在装Ubuntu 12.04 Server版系统的服务器时IP地址写错了,导致服务器不能上网,今天重新修改了一下IP地址,这里做一个总结. 1.配置静态IP地址 sudo vi /etc/net ...
- afterTextChanged() callback being called without the text being actually changed
afterTextChanged() callback being called without the text being actually changed up vote8down votefa ...
- [python] python 中的" "和' '都是完全转义
dict = {"a" : "apple", "b" : "banana", "g" : " ...
- Delphi 7学习开发控件
我们知道使用Delphi快速开发,很大的一方面就是其强大的VCL控件,另外丰富的第三方控件也使得Delphi程序员更加快速的开发出所需要的程序.在此不特别介绍一些概念,只记录自己学习开发控件的步骤.假 ...
- 【Android UI设计与开发】第05期:引导界面(五)实现应用程序只启动一次引导界面
[Android UI设计与开发]第05期:引导界面(五)实现应用程序只启动一次引导界面 jingqing 发表于 2013-7-11 14:42:02 浏览(229501) 这篇文章算是对整个引导界 ...
- sql ltrim rtrim
sql中用LTRIM ( ),RTRIM ( ).分别截断首尾空格,返回字符表达式. 例1: DECLARE @string_to_trim varchar(60)SET @string_to_tri ...
- stream_copy_to_stream的使用
stream_copy_to_stream - 在数据流之间进行复制操作 例子: <?php //读写方式 $stream = fopen('php://temp', 'w+'); //如果成功 ...