Russian Qt Forum
Сентябрь 30, 2024, 00:40 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QT 4.6.2 - QWebView: Определение необходимости открытия ссылки в новом окне  (Прочитано 8887 раз)
DarkPhoenix
Гость
« : Март 15, 2010, 14:49 »

Имеется QWebView, загружаем страницу, на которой имеются ссылки.
Ряд ссылок должен открываться в этом же окне, ряд в новом (target="_blank")
Как определить, что ссылка должна открыться в новом окне?

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

Заранее спасибо Улыбающийся
Записан
zenden
Гость
« Ответ #1 : Март 15, 2010, 15:40 »

наверно нужно копать в сторону QWebView * createWindow ( QWebPage::WebWindowType type )
Записан
DarkPhoenix
Гость
« Ответ #2 : Март 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 поможет
Записан
DarkPhoenix
Гость
« Ответ #3 : Март 15, 2010, 16:37 »

Пока что получаю информацию по url так:
Код:
Navigation n = navigations.at(navigations.size()-1);
QString str = n.request.url().toString();

скорее всего уберу таблицу переходов. пока не знаю понадобится или нет.
Записан
sendevent
Гость
« Ответ #4 : Март 15, 2010, 17:15 »

для получения "клитнутых" ссылок можно глянуть QWebHitTestResult и/или WebPage::acceptNavigationRequest
Записан
Vitto74
Гость
« Ответ #5 : Апрель 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)
Тогда куда девается возвращаемая этим методом страница? Если ничего с ней не делать, то это не приведет к утечкам памяти?
Записан
BRE
Гость
« Ответ #6 : Апрель 13, 2010, 11:47 »

Для чего вызываешь деструктор напрямую? Почему не вызываешь для этого delete?
Код:
ui->webView->page()->~QWebPage();
ui->webView->setPage(new TestPage());
Записан
Vitto74
Гость
« Ответ #7 : Апрель 13, 2010, 11:58 »

Для чего вызываешь деструктор напрямую? Почему не вызываешь для этого delete?
Код:
ui->webView->page()->~QWebPage();
ui->webView->setPage(new TestPage());
Можно и delete.
Код:
delete(ui->webView->page());
Записан
BRE
Гость
« Ответ #8 : Апрель 13, 2010, 12:00 »

Можно и delete.
Нужно!  Улыбающийся

Иначе память занимаемая объектом освобождаться не будет.
Записан
Vitto74
Гость
« Ответ #9 : Апрель 13, 2010, 12:06 »

Иначе память занимаемая объектом освобождаться не будет.
Буду знать.
Так что происходит с возвращаемой методом
Код:
virtual QWebPage* createWindow(WebWindowType)
страницей?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.053 секунд. Запросов: 21.