// mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QWebView>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
public slots:
void jsInvokeQt(const QString &dir);
void addObjectToJs();
void qtInvokeJs();
};
#endif // MAINWINDOW_H
//mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>
#include <QWebFrame>
#include <QDesktopServices>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QString testPath = qApp->applicationDirPath() + "/test.html";
ui->webView->load(QUrl::fromLocalFile(testPath));
//支持js
QWebSettings *pWebSettings = ui->webView->page()->settings();
pWebSettings->setAttribute(QWebSettings::JavascriptEnabled,true);
connect(ui->webView->page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()),
this,SLOT(addObjectToJs()));
connect(ui->btnToJs, SIGNAL(clicked()), this, SLOT(qtInvokeJs()));
}
MainWindow::~MainWindow()
{
QWebSettings::globalSettings()->clearMemoryCaches();
delete ui;
}
//将对象指针添加到JavaScript
void MainWindow::addObjectToJs()
{
ui->webView->page()->mainFrame()->addToJavaScriptWindowObject("MainWindow", this);
}
// Qt调用JavaScript里qtInvokeJs函数
void MainWindow::qtInvokeJs()
{
ui->webView->page()->mainFrame()->evaluateJavaScript("qtInvokeJs()");
}
//js调用Qt的函数必须为槽函数
void MainWindow::jsInvokeQt(const QString &dir)
{
QFileInfo fi = QFileInfo(dir);
QString filePath;
filePath = fi.absolutePath();
QDesktopServices::openUrl(QUrl(filePath, QUrl::TolerantMode));
}
//main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
// test.html
<html>
<head>
<script type="text/javascript">
function qtInvokeJs()
{
alert("Qt invoke Js!")
}
function jsInvokeQt()
{
var path = "d:/";
MainWindow.jsInvokeQt(path);
}
</script>
</head>
<body>
<input type="button" οnclick="jsInvokeQt()" value="js invoke qt" />
</body>
</html>