QT和JS的互相調用例子


轉自:

http://blog.163.com/qimo601@126/blog/static/15822093201682185819623/

Qt 4.8.4

感謝原作者,我只轉載。
看看作者如何實現:
1、Qt源碼調用html中js的函數disp_messagebox();
2、js源碼中如何調用qt中的函數  
MainWindow.jsInvokeQt();
MainWindow.setInfor("Qt change string"); 
alert(MainWindow.getInfor());
 
頁面載入完成的信號:
connect(ui.webView->page()->mainFrame(), SIGNAL(loadFinished(bool)),
            this, SLOT(callFunction()));
 
由於篇幅限制,我就不發頭文件了,詳細源碼可以下載附件 QtInvokeJS.zip
#include "mainwindow.h"
#include "ui_mainwindow.h"
 
         
 
         
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
         
    /* 載入html網頁 */
    m_pWebView = new QWebView();
 
         
    m_pWebView->load(QUrl("file:///D:/jsTest.html"));
 
         
    m_pWebView->show();
 
         
    /* 開啟JavaScript支持 */
    QWebSettings *pWebSettings = m_pWebView->page()->settings();
 
         
    pWebSettings->setAttribute(QWebSettings::JavascriptEnabled,true);
 
         
    /* 窗體布局, 添加按鈕 */
    QPushButton *pEventBtn = new QPushButton(tr("QT Invoke JavaScript web page Object"));
    QPushButton *pcloseBtn = new QPushButton(tr("close"));
 
         
    /* 布局:網頁與按鈕為上下布局,兩按鈕為水平居中布局 */
    QHBoxLayout *pBtnLayout = new QHBoxLayout;
 
         
    pBtnLayout->addWidget(pEventBtn);
 
         
    pBtnLayout->addWidget(pcloseBtn);
 
         
    pBtnLayout->setAlignment(Qt::AlignCenter);
 
         
    QVBoxLayout *pMainLayout = new QVBoxLayout;
 
         
    pMainLayout->addWidget(m_pWebView);
 
         
    pMainLayout->addLayout(pBtnLayout);
 
         
    QWidget *widget = new QWidget;
 
         
    widget->setLayout(pMainLayout);
 
         
    setCentralWidget(widget);
 
         
    /* 建立信號與槽, 每次載入html時發送段信號 */
    connect(m_pWebView->page()->mainFrame(),SIGNAL(javaScriptWindowObjectCleared()),
            this,SLOT(addObjectToJs()));
 
         
    connect(pEventBtn,SIGNAL(clicked()),this,SLOT(testJs()));
 
         
    connect(pcloseBtn,SIGNAL(clicked()),this,SLOT(close()));
 
         
    testStr.clear();
}
 
         
MainWindow::~MainWindow()
{
    if(m_pWebView != NULL)
    {
        delete m_pWebView;
        m_pWebView = NULL;
    }
 
         
    /* 必須的,否則,在debug編譯模式下就會出現leak錯誤 */
    QWebSettings::globalSettings()->clearMemoryCaches();
 
         
    delete ui;
}
 
         
/* 這個public slot槽函數是為了響應JavaScript的的invoke的 */
void MainWindow::jsInvokeQt()
{
    qDebug()<<"MainWindow::jsInvokeQt(),\t JavaScript invoke Qt program!";
}
 
         
/* 將MainWindows這個類的名稱&&對象指針發送給JavaScript */
void MainWindow::addObjectToJs()
{
    m_pWebView->page()->mainFrame()->addToJavaScriptWindowObject("MainWindow",this);
}
 
         
/* Qt來 invoke JavaScript里面的disp_messagebox()函數 */
void MainWindow::testJs()
{
    qDebug()<<"MainWindow::testJs(),\t Qt invoke JavaScript's function";
    m_pWebView->page()->mainFrame()->evaluateJavaScript("disp_messagebox()");
}
 
         
/* JavaScript invoke Qt里面的public slot 槽函數 */
void MainWindow::setInfor(const QString str)
{
    qDebug()<<"MainWindow::setInfor(const QString str),\t Response of js Invoke!"<<"var is:"<<str;
    if(str.isEmpty())
    {
        qDebug()<<"str is empty!";
        return;
    }
    else
    {
        testStr = str;
    }
}
 
         
/* JavaScript invoke Qt里面的public slot 槽函數 */
QString MainWindow::getInfor()
{
    qDebug()<<"MainWindow::GetInfor(),\t "<<testStr;
    return testStr;
}
-----------------------------------------------------------------------------
<html>
 
<head>
 
<script type= "text/javascript" >
 
function disp_messagebox()
{
     alert( "This is javaScript MessageBox come from alert!" )
 
function disp_qtmessage()
{
   alert( "disp_messagebox function, who is in JavaScript!" )
   
   MainWindow.jsInvokeQt();
 
   MainWindow.setInfor( "Qt change string" ); 
  
   alert(MainWindow.getInfor());
 
</script>
 
</head>
 
<body> 
 
<input type= "button"  onclick= "disp_qtmessage()"  value= "JavaScript Invoke Qt Object"  /> 
 
</body>
 
</html>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM