Приветствую Вас, Гость
Главная » Статьи » Мои статьи

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);

}

-------------------------------------------------------------------------------

Проще говоря: сделай и отдай мне QWebView. Компилируем и видим ошибки, нет описания QWebView. Понятно, добавим в qte.h
-------------------------------------------------------------------------------

#include <QWebView>

-------------------------------------------------------------------------------

Всё собралось без ошибок.


Теперь изменим qte.d

Найдем и запомним адрес функции, которая вернет нам указатель на QWebView
-------------------------------------------------------------------------------
// ========== QWebView =========================================
pFunQt[88] = GetPrAddres(bQtE, hQtE, "QT_QWebView"); if (!pFunQt[88]) MessageErrorLoad(showError, "QT_QWebView"w, 2);

// =============================================================


Добавим класс QWebView наследуемый у нас от gWidget (аналог QWidget но с перекрытыми вирт функциями)

// ============ 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
Категория: Мои статьи | Добавил: mgw (17.10.2013) | Автор: Мохов Геннадий Владимирович E
Просмотров: 556 | Теги: qt, dlang, webkit | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *: