Evgenii Legotckoi
Evgenii Legotckoi18 декабря 2015 г. 11:30

Qt/C++ - Урок 036. QWebView - пишем простейший браузер на Qt

Внимание: Урок является устаревшим. С версии Qt5.6 необходимо использовать WebEngine

Ну кто из нас не хочет написать свой браузер? Да ладно, не отпирайтесь мысли про браузер, точно были. Так вот, Qt имеет класс QWebView, который позволяет работать с браузерным движком webkit, на котором написан chromium, а соответственно и chrome и многие другие браузеры. Поэтому практически использовав десяток строк кода можно сделать приложение, которое сможет отобразить страницу веб-сайта.

Итак, приложение будет следующим. Имеется адресная строка QLineEdit и виджет QWebView. При вводе адреса сайта в адресную строку и нажатии клавиши Enter будет запускаться получение страницы сайта и отображение её в QWebView. При клике по ссылке на странице адрес ссылки будет отображаться в адресной строке и будет загружаться новая странице в виджете.

Структура проекта для работы с QWebView

  • QWebViewExample.pro - профайл проекта;
  • main.cpp - основной файл исходных кодов проекта;
  • mainwindow.h - заголовочный файл главного окна приложения;
  • mainwindow.cpp - файл исходных кодов главного окна приложения;
  • mainwindow.ui - форма главного окна приложения.

QWebViewExample.pro

Для работы с QWebView необходимо подключить два модуля: webkit и webkitwidgets.

#-------------------------------------------------
#
# Project created by QtCreator 2015-12-18T20:10:57
#
#-------------------------------------------------

QT       += core gui webkit webkitwidgets

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = QWebViewExample
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h

FORMS    += mainwindow.ui

mainwindow.h

В заголовочном файле необходимо объявить два слота:

slotEnter() - для обработки нажатия клавиши Enter в адресной строки браузера;
slotLinkClicked(QUrl url) - для обработки клика по ссылке на странице браузера.

Также необходимо подключить библиотеки QWebView и QUrl.

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtWebKitWidgets/QWebView>
#include <QUrl>
#include <QDebug>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

private slots:
    void slotEnter();       // Слот для обработки нажатия клавиши Enter
    void slotLinkClicked(QUrl url); // Слот для клика по ссылке на странице
};

#endif // MAINWINDOW_H

mainwindow.cpp

Для правильной обработки клика по ссылке необходимо установить ручную обработку данного события методом setLinkDelegationPolicy и подключить соответствующий слот к сигналу linkClicked().

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // Устанавливаем ручную обработку клика по ссылке
    ui->webView->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);

    // Подключаем сигнал нажатия "Enter" в поле lineEdit
    connect(ui->lineEdit, &QLineEdit::returnPressed, this, &MainWindow::slotEnter);
    // Подключиаем сигнала клика по ссылке к обработчику
    connect(ui->webView, &QWebView::linkClicked, this, &MainWindow::slotLinkClicked);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::slotEnter()
{
    // Загружаем страницу по заданном URL в поле lineEdit
    ui->webView->load(QUrl(ui->lineEdit->text()));
}

void MainWindow::slotLinkClicked(QUrl url)
{
    // При клике по ссылке помещаем адрес в поле lineEdit
    ui->lineEdit->setText(url.toString());
    ui->webView->load(url);     // Загружаем страницу по этой ссылке
}

Исправление ошибок с SSL

Скорее всего у Вас возникнут ошибки следующего вида при сборке проекта:

qt.network.ssl: QSslSocket: cannot call unresolved function SSLv23_client_method
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_CTX_new
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_library_init
qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error

Решение этой проблемы кроется в том, чтобы подбросить нужные библиотеки в папку, где располагаются библиотеки Qt5Network.dll и Qt5Networkd.dll. Этими библиотеками являются libeay32.dll и ssleay32.dll.

Для этого:

  1. Идём на следующий сайт
  2. Ищем там light сборку OpenSSL
  3. И качаем нужную версию 32 или 64 бита (в случае с mingw качаем 32-х разрядную сборку).
  4. Далее устанавливаем OpenSSL в производную папку отметив пункт "The OpenSSL binaries (\bin) directory"
  5. После чего ищем библиотеки libeay32.dll и ssleay32.dll и перебрасываем их в папку с Qt к библиотекам Qt5Network.dll и Qt5Networkd.dll.

После этого выше перечисленные ошибки пропадут.

Итог

В результате проделанной работы Вы сможете открыть страницу сайта в своём собственном приложении, как показано на ниже следующем рисунке. Также демонстрацию работы приложения из урока Вы можете увидеть в Видеоуроке.

Ссылка на скачивание проекта в zip-архиве: qwebviewexample.zip

Видеоурок

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

D
  • 16 февраля 2017 г. 16:01

qt.network.ssl: QSslSocket: cannot call unresolved function SSLv23_client_method
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_CTX_new
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_library_init
qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error

А если этот метод не помог,как быть?

Evgenii Legotckoi
  • 16 февраля 2017 г. 23:13

Возможно, библиотеки не подошли. Либо попытаться подключить непосредственно в проект. Там на сайте должна быть dev версия вместе с заголовочными файлами. Вот эту версию в проект и подключать тогда.

Михаиллл
  • 7 февраля 2019 г. 4:53

Записал в .pro файле

QT       += core gui webkit webkitwidgets

не находит это и выдает ошибку:Unknown module(s) in QT: webkit webkitwidgets
скажите пожалуйста, почему так

Evgenii Legotckoi
  • 7 февраля 2019 г. 4:58

Статья устарела, используйте QWebEngine

QT += webenginewidgets

Михаиллл
  • 7 февраля 2019 г. 5:55
  • (ред.)

Сделал так

QT       += core gui webenginewidgets

Выдает туже ошибку: Unknown module(s) in QT: webenginewidgets

Михаиллл
  • 7 февраля 2019 г. 5:55

Компилятор MinGW 64 5.12

Evgenii Legotckoi
  • 7 февраля 2019 г. 6:09

Переходить на MSVC, ибо MinGW не поддерживается.

Михаиллл
  • 7 февраля 2019 г. 6:32

Компилятор MSVC 2015 64bit тоже выдает ту-же ошибку

Evgenii Legotckoi
  • 7 февраля 2019 г. 6:36

А вот это уже странно. Перезапуск qmake делали? webengine установлен? Он идёт отдельным пунктом в Maintanence Tool

Михаиллл
  • 7 февраля 2019 г. 8:11

Проверил, Qt WebeEgine установлен. Запускал qmake.

Михаиллл
  • 7 февраля 2019 г. 8:12

На этом компе глюки с QML, может в этом дело?

Evgenii Legotckoi
  • 8 февраля 2019 г. 1:09

Не думаю. Мне надо будет самому тогда проверить, как получится, отпишусь.

RL
  • 9 февраля 2019 г. 15:55
  • (ред.)

тоже проблемма Unknown module(s) in QT: webenginewidgets

Как быть ?

у меня Desktop Qt %{Qt:Version} clang 64bit -> на этом не покатит ? !

Михаиллл
  • 11 февраля 2019 г. 5:49

Была ли у вас возможность проверить WebeEgine?

Evgenii Legotckoi
  • 11 февраля 2019 г. 5:51

Нет, у меня проблема с жёстким диском случилась, занимался восстановлением ПК, ещё пару вечеров придётся этим заниматься, увы.

Михаиллл
  • 11 февраля 2019 г. 9:39

Не повезло вам.

М
  • 27 марта 2019 г. 7:17

Проверьте пожалуйста QT += webenginewidgets и # include < QtWebEngineWidgets>

o
  • 11 июля 2019 г. 11:27
  • (ред.)

+

v
  • 13 января 2020 г. 12:39

Такая же проблема Unknown module(s) in QT: webenginewidgets на Qt5.12.3 + VS2015
Оказалось, что 2015-й не поддерживает webenginewidgets, а с MSVC 2017 - работает!

s
  • 3 июня 2020 г. 15:00

Вроде вск записала правильно, все подключила . Проблем со сборко нет.
НО вместо сайта выводится белый экран просто. В чем проблема может быть?

По задумке, при нажатии на кнопку должен выводится сайт в qwebengineview

void Compilyator::on_pushButton_2_clicked()
{
    ui->preview->load(QUrl("https://ideone.com/"));
    ui->preview->show();

}
Михаиллл
  • 3 июня 2020 г. 15:25

Если взяли все из примера, то не должно собраться, т.к. webkit webkitwidgets уже не работают.
Какой класс Вы используете для браузера?

s
  • 3 июня 2020 г. 15:32

я с учетом обновлений использовала webenginewidgets

s
  • 3 июня 2020 г. 15:33

я с учетом обновлений использовала webenginewidgets

Михаиллл
  • 3 июня 2020 г. 15:50

И использовали QWebEngineView как виджет?
Попробуйте setUrl(const QUrl &url)

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50баллов,
  • Очки рейтинга-4
m
  • molni99
  • 26 октября 2024 г. 8:37

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80баллов,
  • Очки рейтинга4
m
  • molni99
  • 26 октября 2024 г. 8:29

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20баллов,
  • Очки рейтинга-10
Последние комментарии
ИМ
Игорь Максимов22 ноября 2024 г. 19:51
Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii Legotckoi31 октября 2024 г. 21:37
Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZE19 октября 2024 г. 15:19
Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов5 октября 2024 г. 14:51
Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55 июля 2024 г. 18:02
QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Сейчас обсуждают на форуме
Evgenii Legotckoi
Evgenii Legotckoi24 июня 2024 г. 22:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey115 ноября 2024 г. 14:04
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProject4 июня 2022 г. 10:49
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9Anonim25 октября 2024 г. 16:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

Следите за нами в социальных сетях