Russian Qt Forum

Qt => Работа с сетью => Тема начата: DarkPhoenix от Март 15, 2010, 14:49



Название: QT 4.6.2 - QWebView: Определение необходимости открытия ссылки в новом окне
Отправлено: DarkPhoenix от Март 15, 2010, 14:49
Имеется QWebView, загружаем страницу, на которой имеются ссылки.
Ряд ссылок должен открываться в этом же окне, ряд в новом (target="_blank")
Как определить, что ссылка должна открыться в новом окне?

посылать в demo browser не стоит, хочется что-то более легко понимаемое с меньшим объемом кода.

Заранее спасибо :)


Название: Re: QT 4.6.2 - QWebView: Определение необходимости открытия ссылки в новом окне
Отправлено: zenden от Март 15, 2010, 15:40
наверно нужно копать в сторону QWebView * createWindow ( QWebPage::WebWindowType type )


Название: Re: QT 4.6.2 - QWebView: Определение необходимости открытия ссылки в новом окне
Отправлено: DarkPhoenix от Март 15, 2010, 15:42
спс, как и думал что придется так.
в сети нашел пример, сработало:
Код:
#include <QWebPage>
#include <QWebFrame>
#include <QPointer>
#include <QMessageBox>

class TestPage : public QWebPage
{
public:
    TestPage(QObject* parent = 0) : QWebPage(parent) {}

    struct Navigation {
        QPointer<QWebFrame> frame;
        QNetworkRequest request;
        NavigationType type;
    };

    QList<Navigation> navigations;
    QList<QWebPage*> createdWindows;

    virtual bool acceptNavigationRequest(QWebFrame* frame, const QNetworkRequest &request, NavigationType type) {
        Navigation n;
        n.frame = frame;
        n.request = request;
        n.type = type;
        navigations.append(n);
        return true;
    }

    virtual QWebPage* createWindow(WebWindowType) {
        QWebPage* page = new TestPage(this);
        createdWindows.append(page);

            QMessageBox::critical(0, QObject::tr("Can't open DB"),
                                            "", QMessageBox::Cancel);

        return page;
    }
};

теперь надо будет разобраться как получить ссылку, по которой кликнули, думаю событие linkClicked поможет


Название: Re: QT 4.6.2 - QWebView: Определение необходимости открытия ссылки в новом окне
Отправлено: DarkPhoenix от Март 15, 2010, 16:37
Пока что получаю информацию по url так:
Код:
Navigation n = navigations.at(navigations.size()-1);
QString str = n.request.url().toString();

скорее всего уберу таблицу переходов. пока не знаю понадобится или нет.


Название: Re: QT 4.6.2 - QWebView: Определение необходимости открытия ссылки в новом окне
Отправлено: sendevent от Март 15, 2010, 17:15
для получения "клитнутых" ссылок можно глянуть QWebHitTestResult и/или WebPage::acceptNavigationRequest


Название: Re: QT 4.6.2 - QWebView: Определение необходимости открытия ссылки в новом окне
Отправлено: Vitto74 от Апрель 13, 2010, 11:41
спс, как и думал что придется так.
в сети нашел пример, сработало:
Код:
#include <QWebPage>
#include <QWebFrame>
#include <QPointer>
#include <QMessageBox>
//забыли упомянуть
#include <QNetworkRequest>

class TestPage : public QWebPage
{
//Много кода.
};

теперь надо будет разобраться как получить ссылку, по которой кликнули, думаю событие linkClicked поможет
Теперь все это прикручивается к QWebView так
Код:
ui->webView->page()->~QWebPage();
ui->webView->setPage(new TestPage());
Я так понял, что при нажатии на ссылку target="_blank" будет вызываться перекрытый метод
Код:
virtual QWebPage* createWindow(WebWindowType)
Тогда куда девается возвращаемая этим методом страница? Если ничего с ней не делать, то это не приведет к утечкам памяти?


Название: Re: QT 4.6.2 - QWebView: Определение необходимости открытия ссылки в новом окне
Отправлено: BRE от Апрель 13, 2010, 11:47
Для чего вызываешь деструктор напрямую? Почему не вызываешь для этого delete?
Код:
ui->webView->page()->~QWebPage();
ui->webView->setPage(new TestPage());


Название: Re: QT 4.6.2 - QWebView: Определение необходимости открытия ссылки в новом окне
Отправлено: Vitto74 от Апрель 13, 2010, 11:58
Для чего вызываешь деструктор напрямую? Почему не вызываешь для этого delete?
Код:
ui->webView->page()->~QWebPage();
ui->webView->setPage(new TestPage());
Можно и delete.
Код:
delete(ui->webView->page());


Название: Re: QT 4.6.2 - QWebView: Определение необходимости открытия ссылки в новом окне
Отправлено: BRE от Апрель 13, 2010, 12:00
Можно и delete.
Нужно!  :)

Иначе память занимаемая объектом освобождаться не будет.


Название: Re: QT 4.6.2 - QWebView: Определение необходимости открытия ссылки в новом окне
Отправлено: Vitto74 от Апрель 13, 2010, 12:06
Иначе память занимаемая объектом освобождаться не будет.
Буду знать.
Так что происходит с возвращаемой методом
Код:
virtual QWebPage* createWindow(WebWindowType)
страницей?