ã¯ããã«
HTML5ã®åºçŸã«ãããéçºã®çŠç¹ãåŸã ã«Webã«ç§»è¡ãå§ããããšã¯ç§å¯ã§ã¯ãããŸããã ãããã¯ãå®å šã«HTML5ã䜿çšããŠèšè¿°ãããåçŽãªWebãµã€ããšåçã¢ããªã±ãŒã·ã§ã³ãããã«ã¯ã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã§ãã ãã©ãããã©ãŒã ãšå®è¡ç°å¢ã«äŸåãããæšæºãžã®çãäœå°ã®ãªãã³ã³ãã©ã€ã¢ã³ã¹ã®ã¿ãå¿ èŠãšããŸãã ããããããã«ãããããããæ°ããHTMLæšæºã«ãã£ãŠå°å ¥ããããã¯ãããžã®ã¹ã¿ãã¯å šäœãã©ãã»ã©åªããŠããŠãããã€ãã£ãéçºããŒã«ã®äœ¿çšãå¿ èŠãšããã¿ã¹ã¯ããŸã ããã€ããããŸãã
ãã®ãããªåé¡ã¯ãããšãã°ãã·ã¹ãã æ å ±ãžã®ã¢ã¯ã»ã¹ã®ååŸãã·ã¹ãã å ã®äœãã®ç®¡çãšå€æŽã§ãã HTML5ããã¢ãã€ã«ããã€ã¹ã®é£çµ¡å ãã«ã¬ã³ããŒããªãŒã¬ãã€ã¶ãŒãªã©ãžã®ã¢ã¯ã»ã¹ã ç¹°ãè¿ãã«ãªããŸãããã¢ããªã±ãŒã·ã§ã³ãæ¬æ Œçãªèšç®ãå®è¡ããå Žåãé ãJSããéãC ++ã«è»¢éã§ããŸãã ãã®èšäºã§ã¯ãäŸãšããŠQtWebKitã¢ãžã¥ãŒã«ã䜿çšããWebã¢ããªã±ãŒã·ã§ã³ãšãã€ãã£ãã³ãŒãã®çžäºäœçšã®ããã€ãã®ææ³ãæ€èšããŸãã
ç®æ¬¡
- JavaScriptããC ++ã¡ãœãããåŒã³åºã
- C ++ã¡ãœããããJavaScriptã³ãŒããåŒã³åºã
- QWidgetãWebããŒãžã«çµ±åãã
JavaScriptããC ++ã¡ãœãããåŒã³åºã
ãã®å Žåãçè«çã«ã¯ãã¯ã©ã¹ã®1ã€ã«ã¢ã¯ã»ã¹ã§ããHTMLããŒãžã«æ°ããJSãªããžã§ã¯ããè¿œå ããå¿ èŠããããŸãã QtWebKitã¯ãã®ãããªãªããžã§ã¯ããWebããŒãžã«åã蟌ãæ©èœãæäŸããŸããã1ã€ã®æ¡ä»¶ããããŸãããã©ãŠã¶ã³ã³ããŒãã³ãã§ããŒãžããªããŒããããã³ã«æ°ãããªããžã§ã¯ããè¿œå ããå¿ èŠããããŸãã ã€ãŸããDOMããªãŒãšJSãªããžã§ã¯ãã®ããªãŒã®äž¡æ¹ãã¯ãªã¢ãããã³ã«ã
å®éã«ã¯ãQt Creatorã§æ°ãããQtã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ããäœæããå¿ èŠããããŸããããã¯Qtã·ãã¥ã¬ãŒã¿ãããã¡ã€ã«ã§ããæ®ãã¯å¥œã¿ã«åãããŠäœæããŸãã 次ã«ãQWebViewã³ã³ããŒãã³ãããã©ãŒã ã«ãããããã.proãã¡ã€ã«ã«è¡ãè¿œå ããŸã
QT += webkit
ããããŒmainwindow.hã§ã1ã€ã®ãã©ã€ããŒãã¹ããããš1ã€ã®ãããªãã¯ã¹ãããã宣èšããŸãã
private slots: void addJSObject(); public slots: void webViewQuitClicked ();
ãŸããmainwindow.cppå®è£ ãã¡ã€ã«ã«QWebFrameããããŒãå«ããã³ã³ã¹ãã©ã¯ã¿ãŒãå°ãå€æŽããŠãmainwindow.hã«è¿œå ãããã¹ãããã®å®è£ ãèšè¿°ããŸãã
... #include <QWebFrame> #include <QMessageBox> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); connect(ui->webView->page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(addJSObject())); } void MainWindow::addJSObject() { ui->webView->page()->mainFrame()->addToJavaScriptWindowObject(QString("mainWindow"), this); } void MainWindow::webViewQuitClicked () { qApp->quit(); } ...
ããã§ã¯ããã®ã³ãŒããèŠãŠã¿ãŸãããã
- ãã©ã€ããŒãã¹ãããaddJSObjectïŒïŒ-çŸåšã®ãã©ãŒã ãæãJSãªããžã§ã¯ããåæ°èŠããŒãžã«è¿œå ãã圹å²ãæãããŸãã åæã«ãWebããŒãžããªããŒãããããã³ã«åŒã³åºãããŸãã javaScriptWindowObjectClearedïŒïŒã·ã°ãã«ããããæ åœããŸãã ã³ãŒããããããããã«ãWebããŒãžã§ã¯ããªããžã§ã¯ãã®ååã¯ãmainWindowãã«ãªããŸãã
- webViewQuitClickedïŒïŒãããªãã¯ã¹ãããã¯ãWebããŒãžã«ããJavaScriptã³ãŒããã䜿çšã§ããã¹ãããã§ãã åœç¶ãé¡æšã«ãããJSããåŒã³åºãããä»ã®ã¡ãœãããè¿œå ã§ããŸãã
ããã«é²ã¿ãŸãã 次ã«ããã®ã³ãŒããWebããŒãžããåŒã³åºãå¿ èŠããããŸãã ãããè¡ãã«ã¯ã次ã®å 容ã®HTMLãã¡ã€ã«ãäœæããŸãã
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Application Example</title> <script> function quitApplication() { mainWindow.webViewQuitClicked (); } </script> </head> <body> <a href="#" onclick='quitApplication();'>Quit Application</a> </body> </html>
ãããŠãã¢ããªã±ãŒã·ã§ã³ã³ã³ã¹ãã©ã¯ã¿ãŒãå°ãç·šéããŸããã€ãŸãã1è¡è¿œå ããŸãã
ui->webView->load("file:///"+QApplication::applicationDirPath() + "/../../html5caller/example.htm");
ãã¡ãããã€ã³ã¿ãŒãããäžã®ã©ãããã§ãããŒãžãããŠã³ããŒãã§ããŸãã
ãããæªããªãã ããããC ++é¢æ°ã«ãã©ã¡ãŒã¿ãŒãæž¡ãããå Žåã¯ã©ãã§ããããïŒ ãã以äžç°¡åãªããšã¯ãããŸããïŒ C ++ã³ãŒãã§ãç®çã®ãã©ã¡ãŒã¿ãŒãæã€æ°ãããããªãã¯ã¹ããããç°¡åã«èšè¿°ããŸãã äŸ-ãŠãŒã¶ãŒãžã®ã¡ãã»ãŒãžã®è¡šç€ºïŒ
mainwindow.hïŒ
public slots: void webViewQuitClicked (); void webViewShowMessageClicked (QString message, int number);
mainwindow.cppïŒ
... void MainWindow::webViewShowMessageClicked (QString message, int number) { QMessageBox::information(this, "From Web", message+QString::number(number)); } ...
example.htmãå€æŽããŸãã
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Application Example</title> <script> function quitApplication() { mainWindow.webViewQuitClicked (); } function calculate(val1, val2) { result = eval(parseFloat(document.calc.val1.value)+parseFloat(document.calc.val2.value)) mainWindow.webViewShowMessageClicked ("Result: ", result); } </script> </head> <body> <a href="#" onclick='quitApplication();'>Quit Application</a> <FORM name="calc"> <input name="val1" type="text" value="3" size="4">+ <input name="val2" type="text" value="4" size="4"> <input type="button" value=" + " onclick="calculate(val1, val2)"> </FORM> </body> </html>
ããã§ãã¢ããªã±ãŒã·ã§ã³ãéããã ãã§ãªããéåžžã®ããŒã¿åã®å¶åŸ¡ã§ä»»æã®ãã©ã¡ãŒã¿ãŒãã¢ããªã±ãŒã·ã§ã³ã«æž¡ãããšãã§ããŸãã ãããŠãããã§äœãèµ·ãã£ãã®ã§ãïŒ
![](http://habrastorage.org/storage1/f201c4d3/2efdf834/2aaf502e/06c441c9.png)
ããŠãæåŸã ãã®ãããã¯ã«è¿œå ã§ãããã®ã èšã£ãŠã¿ããã ããã€ãã®ããŒã¿ãC ++ã«éä¿¡ããããã§ããŒã¿ãåŠçããããããåãæ»ããããšèããŠããŸãã ãããè¡ãã«ã¯ãããšãã°æ¬¡ã®ããã«ãã¹ãããã®æ»ãããŒã¿åãèšè¿°ããã ãã§ãã
... QString readResult(int val1, int val2) { ... return QString(); } ...
JSã³ãŒããããä»ã®ã¡ãœãããšåæ§ã«ãã®ã¡ãœãããåŒã³åºããŸãããå¯äžã®éãã¯ãæ»ãå€ãè¿œå ããå Žæã«å€æ°ãèšå®ããããšã§ãã
var lolo = mainWindow.readResult();
ããã ãã§ã...å ã«é²ã¿ãŸã...
C ++ã¡ãœããããJavaScriptã³ãŒããåŒã³åºã
ç§ãã¡ã¯é·ãéããã«ã€ããŠèªããŸããã JSã³ãŒããåŒã³åºãã«ã¯ãQWebFrameã¯ã©ã¹ã®ã¡ãœããã䜿çšããå¿ èŠããããŸãã 次ã«äŸã瀺ããŸããããŒãžäžã®ãã¹ãŠã®åçã®URLãååŸããå¿ èŠããããŸãã
QVariant listOfImages = webView.page()->mainFrame()->evaluateJavaScript("document.getElementsByTagName(\"img\").length;"); double numberOfImages = listOfImages.toDouble(); for (double i = 0; i < numberOfImages; ++i) { srcOfImages = webView.page()->mainFrame()->evaluateJavaScript(QString("document.getElementsByTagName(\"img\")[%1].src;").arg(i)); imageUrl = srcOfImages.toString(); }
æåã«imgåã®ã¿ã°ã®æ°ãååŸãã次ã«ãã®ãªã¹ãã調ã¹ãŠãå¿ èŠãªURLãåŒãåºããŸãã äŸãããããããã«ãããŒãžäžã®ãªããžã§ã¯ãã«ç°¡åã«ã¢ã¯ã»ã¹ããããã«å¿ããŠã¡ãœãããå®è¡ã§ããŸãã
QWidgetãWebããŒãžã«çµ±åãã
ããã¯ãç§ã話ããã2çªç®ã®å€§ããªãããã¯ã§ãã ããã¯ãéåžžã«æšæºçãªæé ã§ã¯ãªããšããåé¡ã«ãªããŸã...ç§ãã¡ã®ã¢ããªã±ãŒã·ã§ã³ã®ãŠã£ãžã§ãããWebããŒãžã«å®éã«å«ããŸãã
ããã¯ãQWebPluginFactoryã¯ã©ã¹ã䜿çšããŠå®è¡ã§ããŸãã å§ããŸãããã ãŸããQt Creatorã®å·ŠåŽã®ãããžã§ã¯ãããªãŒã§ããããžã§ã¯ããå³ã¯ãªãã¯ããŸãã é£çµ¡å ã¡ãã¥ãŒãã[æ°èŠè¿œå ]-> [C ++ã¯ã©ã¹]ãéžæããŸãã ã¯ã©ã¹åMyWidgetFactoryãåºæ¬ã¯ã©ã¹QWebPluginFactoryãã¿ã€ãQObjectãå®äºã ãã©ã°ã€ã³ãå®å šã«æ©èœããããã«ããã«ã¯ãåºæ¬ã¯ã©ã¹ã®2ã€ã®ã¡ãœãããåå®çŸ©ããå¿ èŠããããŸãã
QObject *create(const QString &mimeType, const QUrl &url, const QStringList &argumentNames, const QStringList &argumentValues) const; QList<QWebPluginFactory::Plugin> plugins() const;
1ã€ã¯ããªã³ããã³ãWebããŒãžã§ãŠã£ãžã§ãããäœæããããšã§ãã 2çªç®ã¯ããã©ã°ã€ã³ãå¿çããå¿ èŠããããæ°ãããŠã£ãžã§ãããäœæããå¿ èŠãããMimeã¿ã€ãã説æããŠããŸãã äžè¬ã«ãæåã¯ãæ°å¹Žåã«Vkontakte.ruã®ã¡ãã»ã³ãžã£ãŒãæžãããšãã«ãåæ§ã®ã¢ãããŒãã䜿çšããŸããã 次ã«ããŠãŒã¶ãŒãé³æ¥œãå ±æããããããããã«ãããŒãžã«é³æ¥œãã¬ãŒã€ãŒãŠã£ãžã§ãããåã蟌ãå¿ èŠããããŸããã code.google.com/p/vimka/source/browse/#svn%2Ftrunk%2Fchatsãã¡ã€ã«vkmediafactory.hããã³vkmediafactory.cppã§å®å šãªå®è£ ã確èªã§ããŸãã
ãããããã£ãšç°¡åãªããšãããŸãã ãããã£ãŠãçµæã®ã¯ã©ã¹ãã³ãã¬ãŒããå€æŽããããšããå§ããŸãããã
mywidgetfactory.hïŒ
#ifndef MYWIDGETFACTORY_H #define MYWIDGETFACTORY_H #include <QWebPluginFactory> class MyWidgetFactory : public QWebPluginFactory { Q_OBJECT public: explicit MyWidgetFactory(QObject *parent = 0); QObject *create(const QString &mimeType, const QUrl &url, const QStringList &argumentNames, const QStringList &argumentValues) const; QList<QWebPluginFactory::Plugin> plugins() const; signals: public slots: }; #endif // MYWIDGETFACTORY_H
mywidgetfactory.cppïŒ
#include "mywidgetfactory.h" #include <QTabWidget> #include <QPushButton> #include <QProgressBar> #include <QDebug> #include <QApplication> #include <QUrl> MyWidgetFactory::MyWidgetFactory(QObject *parent) : QWebPluginFactory(parent) { } QList<QWebPluginFactory::Plugin> MyWidgetFactory::plugins() const { QWebPluginFactory::MimeType mimeType; mimeType.name = "text/qtexample"; mimeType.description = "Comma-separated values"; mimeType.fileExtensions = QStringList() << "txt"; QWebPluginFactory::Plugin plugin; plugin.name = "PluginFactory Example"; plugin.description = "PluginFactory Example"; plugin.mimeTypes = QList<MimeType>() << mimeType; return QList<QWebPluginFactory::Plugin>() << plugin; } QObject *MyWidgetFactory::create(const QString &mimeType, const QUrl &url, const QStringList &argumentNames, const QStringList &argumentValues) const { qDebug() << mimeType << url << argumentNames << argumentValues; if (mimeType != "text/qtexample") return 0; QTabWidget *tab = new QTabWidget(); int max = argumentValues.last().split(",").first().toInt(); int val = argumentValues.last().split(",").last().toInt(); QProgressBar *progressBar = new QProgressBar(); tab->addTab(progressBar, "Progress"); progressBar->setMaximum(max); progressBar->setValue(val); QPushButton *pb = new QPushButton("Click me!"); tab->addTab(pb, "Button"); connect(pb, SIGNAL(clicked()),QApplication::instance(), SLOT(quit())); return tab; }
ç§ãã¡ã¯äœãããŸãããïŒ pluginsïŒïŒé¢æ°ã§ãå¿çãããMimeã¿ã€ããèšè¿°ããŸããã ãããŠããã©ã°ã€ã³èªäœã«ã€ããŠèª¬æããŸããããã®ãã©ã°ã€ã³ã¯ãããŒãããããã¹ãŠã®ããŒãžã§ãã®Mimeã¿ã€ãã®ååšãç£èŠããæ€åºããããcreateïŒïŒã¡ãœãããåŒã³åºããŠãçµæã®ãŠã£ãžã§ãããããŒãžèªäœã«åã蟌ã¿ãŸãã
ããã«ãcreateïŒïŒã¡ãœããã§ã¯ãããŒã¿ãåãå ¥ããŠã³ã³ãœãŒã«ã«åºåããMIMEã¿ã€ããé©åãã©ããã確èªãïŒtext / qtexampleïŒãMIMEã¿ã€ããäžèŽããå Žåã¯ç©ºã§ãªããŠã£ãžã§ãããè¿ããŸãã ããå°ãããããããããããã«ããã®é¢æ°ãåä¿¡ããããŒã¿ã®ã³ã³ãœãŒã«åºåã次ã«ç€ºããŸãã
"text/qtexample" QUrl( "file:///D:/devel/html5caller/100,28" ) ("type", "data", "width", "height", "src") ("text/qtexample", "100,28", "300", "300", "100,28")
ããã¯å·¥å Žçšã§ã...
次ã®ã¹ãããã§ã¯ãç¬èªã®ãã©ã°ã€ã³ãã¡ã¯ããªã®å¯çšæ§ã«ã€ããŠã¢ããªã±ãŒã·ã§ã³ã«éç¥ããŸãã ãããè¡ãã«ã¯ãæåã«mainwondow.cppãã¡ã€ã«ã«2ã€ã®æ°ããããããŒãè¿œå ããŸãã
#include <QWebSettings> #include "mywidgetfactory.h"
ãããŠããã®ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãŒãå€æŽããŸãã
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { QWebSettings::globalSettings()->setAttribute( QWebSettings::PluginsEnabled, true); ui->setupUi(this); connect(ui->webView->page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(addJSObject())); MyWidgetFactory *factory = new MyWidgetFactory(ui->webView); ui->webView->page()->setPluginFactory(factory); ui->webView->load("file:///"+QApplication::applicationDirPath() + "/../../html5caller/example.htm"); }
ããã§ã¯ããŸãã°ããŒãã«ãªQtWebKitèšå®ã§ãã©ã°ã€ã³ãµããŒããæå¹ã«ããŸããã 次ã«ãFactoryã¯ã©ã¹ã®ãªããžã§ã¯ããäœæããwebViewã«é¢é£ããQWebPageãªããžã§ã¯ãã®ãã©ã°ã€ã³ãã¡ã¯ããªãšããŠèšå®ããŸãã
æåŸã®æåŸã®ä»äžããæ®ã£ãŠããŸã-web-cnhfybxreã«ãã©ã°ã€ã³ãäœããã®åœ¢ã§åã蟌ãå¿ èŠããããŸã/ãããè¡ãã«ã¯ãexample.htmãéãããã©ãŒã ã®èª¬æã®åŸã«æ¬¡ã®ãããªè¡ãè¿œå ããŸãã
<object type="text/qtexample" data="100,28" width="300" height="300"></object>
ãæ³åã®ãšãããããã§ã¯ãäœæããããã©ã°ã€ã³ãå¿çããããã«MIMEã¿ã€ããæå®ããå°æ¥ã®ãŠã£ãžã§ããã®ãµã€ãºãèšå®ããåæåã®ããã«ããŒã¿ãæž¡ããŸãã
äœæ¥ã®çµæã¯æ¬¡ã®ãŠã£ã³ããŠã«ãªããŸãã
![](https://habrastorage.org/storage1/8ec9b41d/ea03e342/a531c0c8/54811706.png)
ãŠã£ãžã§ããã移åããããã¿ããåãæ¿ãããã2çªç®ã®ã¿ãã®ãã¿ã³ãã¯ãªãã¯ãããšãã¢ããªã±ãŒã·ã§ã³ãã¯ãªãã¯ãåŠçããŠéããŸãã
ä»åã¯åºæ¬çã«ããã ãã§ãã ã¢ããªã±ãŒã·ã§ã³ã®ãœãŒã¹ã³ãŒãã¯ããããååŸã§ããäŸãšããŠäœ¿çšã§ããŸãïŒ code.google.com/p/html5cppmixer/downloads/list
誰ããç§ã®çµéšã圹ç«ãŠãŠãããããšãé¡ã£ãŠããŸãã