Главная » Статьи » Мои статьи |
WebKit в QtE
Добавляем новые виджеты в QtE Срочно встала задача научится визуализировать сложный HTML код или открыть сайт. Для этого будем использовать WebKit входящий в Qt. На этом примере и посмотрим, как добавить новые виджеты в QtE. Первое, что нужно, это посмотреть описание самого виджета в Qt Assistant и посмотреть, есть ли в нем виртуальные методы. От этого зависит, делать или нет новый класс с перекрытыми методами в QtE.DLL или можно просто обойтись генерацией класса самой Qt. Вижу класс QWebView - визуализировать HTML код. Пока ни чего виртуального нужного мне в нем не вижу. Отлично! Добавим его в QtE.DLL. Для этого в qte.cpp дописываю код: ------------------------------------------------------------------------------- extern "C" void *QT_QWebView(QWidget * parent) { return new QWebView(parent); }
-------------------------------------------------------------------------------
------------------------------------------------------------------------------- #include <QWebView> ------------------------------------------------------------------------------- Всё собралось без ошибок. Теперь изменим qte.d Найдем и запомним адрес функции, которая вернет нам указатель на QWebView ------------------------------------------------------------------------------- // ========== QWebView ========================================= pFunQt[88] = GetPrAddres(bQtE, hQtE, "QT_QWebView"); if (!pFunQt[88]) MessageErrorLoad(showError, "QT_QWebView"w, 2); // ============================================================= // ============ QWebView ======================================= class QWebView: gWidget { this(gWidget parent) { super(); // Это заглушка, что бы наследовать D класс не создавая экземпляра в Qt C++ if (parent) { p_QObject = (cast(t_vp__vp)pFunQt[88])(parent.p_QObject);} else { p_QObject = (cast(t_vp__vp)pFunQt[88])(null); } } /// Конструктор, где parent - ссылка на родительский виджет } Проверим что получилось QWebView wv = new QWebView(null); wv.show(); - на экране окно. Наверное, то что нам надо. Смотрим, как нам в него что то положить... Так рекомендуют использовать Load(), но у него параметр типа QUrl. Добавим и QUrl сразу в qte.dll. // ============ QUrl ======================================= extern "C" void *QT_QUrl() { return new QUrl(); } // ========================================================= соответственно добавим и в qte.d // ========================================================= pFunQt[89] = GetPrAddres(bQtE, hQtE, "QT_QUrl"); if (!pFunQt[89]) MessageErrorLoad(showError, "QT_QUrl"w, 2); Каков базовый объект, от которого он наследуется в Qt не ясно, ну и ладно, мы его наследуем от нашего QObject // ============ QUrl ======================================= class QUrl: QObject { this() { super(); p_QObject = (cast(t_vp__v)pFunQt[89])(); } } проверим в D: // ========================================================= QUrl url = new QUrl(); // ========================================================= ошибок вроде нет, хорошо. Так, теперь смотрим, как вписать сам URL, ага void QUrl::setUrl ( const QString & url ) это то что надо. Есть два способа. Можно вставить в qte.cpp этот метод, но мы поищем его в таблице (tp-Qt.mdb). Это просто распечатка экспортируемых функций. Нашли: QtCore -- _ZN4QUrl6setUrlERK7QString -- QUrl::setUrl(QString const&) вставляем его в qte.d // ========================================================= pFunQt[90] = GetPrAddres(bCore, hQtCore, "_ZN4QUrl6setUrlERK7QString"); if (!pFunQt[90]) MessageErrorLoad(showError, "QUrl::setUrl(QString)"w, 2); // ========================================================= обратите внимание, что он берется из QtCore.dll и имеет прототип: void QUrl::setUrl( const QString & url ) соответственно, добавим методы в нгаши классы в qte.d Теперь это всё выглядит вот так: // ========================================================= alias void** GetObjQt_t; // Дай тип Qt. Происходит неявное преобразование. cast(GetObjQt_t)Z == *Z на любой тип. class QWebView: gWidget { this(gWidget parent) { super(); // Это заглушка, что бы наследовать D класс не создавая экземпляра в Qt C++ if (parent) { p_QObject = (cast(t_vp__vp)pFunQt[88])(parent.p_QObject); } else { p_QObject = (cast(t_vp__vp)pFunQt[88])(null); } } /// Конструктор, где parent - сылка на родительский виджет void load(QUrl url) { (cast(t_v__vp_vp)pFunQt[91])(p_QObject, cast(void*)url.QtObj); } /// Добавить сепаратор } class QUrl: QObject { this() { super(); p_QObject = (cast(t_vp__v)pFunQt[89])(); } void setUrl(QString str) { (cast(t_v__vp_vp)pFunQt[90])(p_QObject, cast(GetObjQt_t)str.QtObj); } /// Добавить сепаратор } Вот теперь осталось воспользоваться тем что получилось. Вот кусочек из программы на D : ....... QUrl url = new QUrl(); QString mUrl = new QString("http://www.yandex.ru"w); url.setUrl(mUrl); QWebView wv = new QWebView(null); wv.load(url); wv.show(); ....... на выходе наблюдаем окошко с начальной страницей www.yandex.ru | |
Просмотров: 851
| Теги: |
Всего комментариев: 0 | |