вторник, 25 августа 2015 г.

QWebView + JavaScript + Event.

Иногда при работе с QWebView, требуется встроить возможность обрабатывать сообщения(Event’ы) непосредственно от JavaScipt’ов. При этом в качестве отправителя сообщения могут выступать кнопки, либо другие элементы.
Так как же реагировать на события от JavaScript?


Следующий пример, покажет как обработать event в QWebView от кнопки.
Нам потребуется непосредственно сам класс обработчик:
#ifndef JAVASCIPT_H
#define JAVASCIPT_H
#include <QObject>
class CJavaScipt : public QObject
{
  Q_OBJECT
public:
  explicit CJavaScipt(QObject *parent = 0);
  ~CJavaScipt();
static CJavaScipt * GetInstance();
signals:
public slots:
/* Метод который будет получать управление, когда мы будем нажимать на кнопку в QWebView */
  void OnButtonFileSaveClick(QString szSrcStr);
};
#endif // JAVASCIPT_H


Реализация..
CJavaScipt * CJavaScipt::GetInstance()
{
  static CJavaScipt JavaScipt;
  return &JavaScipt;
}

void CJavaScipt::OnButtonFileSaveClick(QString szSrcStr)
{
   qDebug() << "Called! Event!" << szSrcStr.toStdString().c_str();
}


Теперь нам надо вызвать метод QWebView, чтобы зарегистрировать нашь обработчик:



Я Переопределил класс QWebView, и написал метод
void CWebView::AttachJavaSctipt()
{
page()->mainFrame()->addToJavaScriptWindowObject(QString("api"),    CJavaScipt::GetInstance());
}


Как можно видеть при вызове метода класса, нам необходимо передать в качестве аргументов, название объекта JavaSctipt и сам объект который будет обрабатывать непосредственно event'ы. Более подробнее об addToJavaScriptWindowObject методе можно почитать в оф.документации. см.сылки.


Теперь непосредственно код который следует встроить в веб страницу.
QString szMessage = "<button type=\"button\" onclick="api.OnButtonFileSaveClick('Передаем строку от кнопки')\"> </button>”;
Все! Теперь мы можем обрабатывать сообщения непосредственно через JavaScript - функционал.

Скриншот использования.
:
ссылки : http://doc.qt.io/qt-4.8/qwebframe.html#addToJavaScriptWindowObject

Комментариев нет:

Отправить комментарий