Evgenii Legotckoi
Evgenii Legotckoi18 грудня 2015 р. 22: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
  • 17 лютого 2017 р. 03: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
  • 17 лютого 2017 р. 10:13

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

Михаиллл
  • 07 лютого 2019 р. 15:53

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

QT       += core gui webkit webkitwidgets

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

Evgenii Legotckoi
  • 07 лютого 2019 р. 15:58

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

QT += webenginewidgets

Михаиллл
  • 07 лютого 2019 р. 16:55
  • (відредаговано)

Сделал так

QT       += core gui webenginewidgets

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

Михаиллл
  • 07 лютого 2019 р. 16:55

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

Evgenii Legotckoi
  • 07 лютого 2019 р. 17:09

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

Михаиллл
  • 07 лютого 2019 р. 17:32

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

Evgenii Legotckoi
  • 07 лютого 2019 р. 17:36

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

Михаиллл
  • 07 лютого 2019 р. 19:11

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

Михаиллл
  • 07 лютого 2019 р. 19:12

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

Evgenii Legotckoi
  • 08 лютого 2019 р. 12:09

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

RL
  • 10 лютого 2019 р. 02:55
  • (відредаговано)

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

Как быть ?

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

Михаиллл
  • 11 лютого 2019 р. 16:49

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

Evgenii Legotckoi
  • 11 лютого 2019 р. 16:51

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

Михаиллл
  • 11 лютого 2019 р. 20:39

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

М
  • 27 березня 2019 р. 17:17

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

o
  • 11 липня 2019 р. 21:27
  • (відредаговано)

+

v
  • 13 січня 2020 р. 23:39

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

s
  • 04 червня 2020 р. 01:00

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

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

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

}
Михаиллл
  • 04 червня 2020 р. 01:25

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

s
  • 04 червня 2020 р. 01:32

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

s
  • 04 червня 2020 р. 01:33

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

Михаиллл
  • 04 червня 2020 р. 01:50

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

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
МВ

Qt - Тест 001. Сигналы и слоты

  • Результат:68бали,
  • Рейтинг балів-1
ЛС

C++ - Тест 001. Первая программа и типы данных

  • Результат:53бали,
  • Рейтинг балів-4
АА

C++ - Тест 001. Первая программа и типы данных

  • Результат:60бали,
  • Рейтинг балів-1
Останні коментарі
ИМ
Игорь Максимов05 жовтня 2024 р. 17:51
Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas505 липня 2024 р. 21:02
QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr09 лютого 2024 р. 05:43
Qt Linux - Урок 001. Автозапуск програми Qt під Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий Кононенко05 лютого 2024 р. 12:50
Qt WinAPI - Урок 007. Робота з ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25 грудня 2023 р. 21:30
Boost - статичне зв&#39;язування в проекті CMake під Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
Тепер обговоріть на форумі
K
Keithfap13 жовтня 2024 р. 19:24
добавить qlineseries в функции North Symbol by Bubnov Ltd https://seven-elephants.com/en/categories/penthouse/ Искеле – жемчужина острова! Все факторы говорят про большой инвестиционный потенциал данного района как для …
ИМ
Игорь Максимов03 жовтня 2024 р. 14:05
Реализация навигации по разделам Спасибо Евгений!
JW
Jhon Wick02 жовтня 2024 р. 01:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27 вересня 2024 р. 19:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22 липня 2024 р. 14:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Слідкуйте за нами в соціальних мережах