Qt与JS

Posted 邶风

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt与JS相关的知识,希望对你有一定的参考价值。

 

Qt不错的学习网址:

http://www.cnblogs.com/findumars/p/5529526.html

 

----------------------------------------------------

IE内核,qt调用js;qt写com组件,html就可以调用qt

可以百度 QAxBindable  会搜索到比较有用的文章

http://blog.csdn.net/csxiaoshui/article/details/47333989

http://blog.csdn.net/csxiaoshui/article/details/48000885

http://blog.csdn.net/csxiaoshui/article/details/50735018

http://blog.csdn.net/jxd9955/article/details/30260725

ui->axWidget->setControl("Shell.Explorer");

ui->axWidget->setObjectName(QString::fromUtf8("WebBrowser"));
ui->axWidget->setFocusPolicy(Qt::StrongFocus);
//去边框
ui->axWidget->setWindowFlags(Qt::FramelessWindowHint);
ui->axWidget->setStyleSheet("QGraphicsView{border:0px;}");


ui->axWidget->dynamicCall("Navigate(constQString&)",QString("file:///D:/proj/m5/m5/baidu_map_new.html"));

IWebBrowser2*webBrowser=0;

ui->axWidget->queryInterface(IID_IWebBrowser2,(void**)&webBrowser);

if(webBrowser)
{
VARIANT_BOOLresult;
HRESULTbusy=webBrowser->get_Busy(&result);

if(VARIANT_TRUE==result)
{

}
}

ui->axWidget->close();

 

ui->axWidget->show();

+++++++++++++++++++++++++++++++++++++++++++
调用js函数
voidMainWindow::SetLocation(std::wstringx,std::wstringy,std::wstringstr)
{
if(QString::fromStdWString(x).trimmed().isEmpty()||
QString::fromStdWString(y).trimmed().isEmpty())
{
QMessageBox::information(this,QString("NOTICE"),
#ifdefENGLISH_
QString("Targetaddressisempty!"));
#else
QString("目标地址为空!"));
#endif//ENGLISH_

return;
}

QAxObject*document=ui->axWidget->querySubObject("Document");
IHTMLDocument2*doc2;
if(document!=NULL)
{
document->queryInterface(QUuid(IID_IHTMLDocument2),(void**)&doc2);
}

if(doc2)
{
IHTMLWindow2*win2=NULL;
if(doc2->get_parentWindow(&win2)==S_OK)
{
WCHARlocationInfo[MAX_PATH]={0};
wsprintf(locationInfo,L"setLocation(%s,%s,%s)",x.c_str(),y.c_str(),str.c_str());

BSTRs1=SysAllocString(locationInfo);
BSTRs2=SysAllocString(L"javascript");
VARIANTret;
if(win2!=NULL)
{
win2->execScript(s1,s2,&ret);
}

SysFreeString(s2);
SysFreeString(s1);
}
}
}

 

------------------------------------------------------------------------------

QT5 与JS交互不错的文章:

http://blog.csdn.net/d7185540/article/details/52896531

http://blog.csdn.net/sharetm/article/details/55260207

---------------------------------------------------------------------------

Qt之QtScript(一)

http://blog.csdn.net/liuhongwei123888/article/details/6162159

http://blog.csdn.net/styyzxjq2009/article/details/8364545

-----------------------------------------------------------------------------------

WebView与JS

这种用法很少见:

http://www.cnblogs.com/ziqiuqiandao/archive/2012/12/29/2838652.html

可以获取到html元素的值:

  1.     QWebFrame *frame = ui->webView->page()->mainFrame();  
  2.     QWebElement userNameEle = frame->findFirstElement("#userName");  
  3.     QWebElement passwordEle = frame->findFirstElement("#password");  
  4.     QString userName = userNameEle.evaluateJavaScript("this.value").toString();  
  5.     QString password = passwordEle.evaluateJavaScript("this.value").toString();

http://blog.csdn.net/liuhongwei123888/article/details/6137094

 

 

 

 

 

QT分析之WebKit http://www.cnblogs.com/lfsblack/p/5278777.html 对WebKit进行了详细的讲解,

 http://www.cnblogs.com/findumars/p/5529526.html可以将QT的属性值暴露给html文件。

大众用法:

QString strFunc(tr("locateCity(\'南京\', 11);"));

m_pWebView->page()->mainFrame()->evaluateJavaScript(strFunc);

 

几个注意点:

QWebView为何有些网页显示不了:

1、网页是https协议的,使用SSL加密连接了。你的Qt库集成了openssl模块吗?如果没有,要-openssl开关重编QtNetwork库。如果有,连接webView->page()->networkAccessManager()的sslErrors信号,调用QNetworkReply的ignoreSslErrors函数,然后把libeay32.dll和ssleay32.dll两个文件和程序放到一起。

2、把 qt-create中的 ssleay32.dll 和 libeay32.dll 复制到 qt sdk的 bin目录下面

在学习Qt,做了个浏览器demo,没搞懂对https是怎么支持的?我开发的时候用的机器所有https网站都正常显示,后来拿到另一台机器上,全是空白页。网上有说是ssl握手产生错误的问题,我把代码搞到后一台机子上写了发现还是不行,根本没收到sslerror的signal。用其它浏览器都是正常打开,不明白为什么?

是不是libeay32.dll和ssleay32.dll缺了?

是因为这2个dll,但是电脑里是有的,其他程序都能找到这个路径就是我自己搞的不行,后来把openssl一起打包了。

QWebView直接load可以打开https网页,网页内的大多数的按钮点击却无反应
NetworkAccessManager::createRequest(Operation op, const QNetworkRequest & req, QIODevice * outgoingData)里可以看到有请求返回,
但WebPage::acceptNavigationRequest(QWebFrame *frame, const QNetworkRequest &request, NavigationType type)却收不到请求。

1、

有没有试过调用QWebPager的setLinkDelegationPolicy函数,我之前有碰到过点击链接不处理的问题,是因为没有调用这个函数。
ui->webView->page()->setLinkDelegationPolicy(QWebPage::DelegateExternalLinks);

3、实在不行,参考方案:最终还是QT整合MFC的CHtmlView来做

 

    /* 开启JavaScript支持 */  好像不是必须的!!

    QWebSettings *pWebSettings = m_pWebView->page()->settings();

 

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

 

 

    /* 建立信号与槽, 每次载入html时发送段信号 */  必须要!!!

    connect(m_pWebView->page()->mainFrame(),SIGNAL(javaScriptWindowObjectCleared()),

            this,SLOT(addObjectToJs()));

 

Qt代码里先尝试在javaScriptWindowObjectCleared信号对应的槽里调用,结果失败了:

connect(ui.webView->page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()),
            this, SLOT(populateJavaScriptWindowObject()));
...
void FormExtractor::populateJavaScriptWindowObject()
{
    ui.webView->page()->mainFrame()->evaluateJavaScript("tryalert();");
}

 

 

是因为这个信号发出得太早了,页面还没有完全载入。需要在后面调用。最好是响应loadFinished(bool)信号:
connect(ui.webView->page()->mainFrame(), SIGNAL(loadFinished(bool)),
            this, SLOT(callFunction()));
...
void FormExtractor::callFunction()
{
    ui.webView->page()->mainFrame()->evaluateJavaScript("tryalert();");
}

QWebview控件

该控件是用于在Qt中显示网页的控件,一般而言会将contextMenuPolicy属性设置为NoContextMenu隐藏系统为其提供的默认右键菜单

<1>. 加载网页:

1
2
3
ui->webViewCut->load(QUrl("http://www.baidu.com"));
//如果是本地网页,必须使用file:///的前缀作为网页地址
ui->webViewCut->load(QUrl("file:///c:/test.html "));

<2>. Qt代码中调用QWebview加载的网页中的js函数:

1
2
3
4
5
6
7
8
9
10
//先作如下设置
ui->webViewCut->page()->setForwardUnsupportedContent(true);
ui->webViewCut->page()->settings()->setAttribute(QWebSettings::JavascriptEnabled, true);
ui->webViewCut->page()->settings()->setAttribute(QWebSettings::PluginsEnabled, true);
ui->webViewCut->page()->settings()->setAttribute(QWebSettings::JavaEnabled, true);
ui->webViewCut->page()->settings()->setAttribute(QWebSettings::AutoLoadImages, true);
 
//然后在QWebview的loadFinished槽函数中调用js,该槽函数表示网页已经加载完毕

(c)2006-2024 SYSTEM All Rights Reserved IT常识