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 версия вместе с заголовочными файлами. Вот эту версию в проект и подключать тогда.

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

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

QT       += core gui webkit webkitwidgets

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

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

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

QT += webenginewidgets

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

Сделал так

QT       += core gui webenginewidgets

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Как быть ?

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

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

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

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

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

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

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

М
  • 27 березня 2019 р. 07: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
  • 03 червня 2020 р. 15:00

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

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

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

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

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

s
  • 03 червня 2020 р. 15:32

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

s
  • 03 червня 2020 р. 15:33

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

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

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

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
Дмитрий

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

  • Результат:60бали,
  • Рейтинг балів-1
Дмитрий

C++ - Тест 003. Условия и циклы

  • Результат:92бали,
  • Рейтинг балів8
d
  • dsfs
  • 26 квітня 2024 р. 04:56

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

  • Результат:80бали,
  • Рейтинг балів4
Останні коментарі
k
kmssr08 лютого 2024 р. 18:43
Qt Linux - Урок 001. Автозапуск програми Qt під Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий Кононенко05 лютого 2024 р. 01:50
Qt WinAPI - Урок 007. Робота з ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25 грудня 2023 р. 10:30
Boost - статичне зв&#39;язування в проекті CMake під Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
J
JonnyJo25 грудня 2023 р. 08:38
Boost - статичне зв&#39;язування в проекті CMake під Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
G
Gvozdik18 грудня 2023 р. 21:01
Qt/C++ - Урок 056. Підключення бібліотеки Boost в Qt для компіляторів MinGW і MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
Тепер обговоріть на форумі
G
George1307 травня 2024 р. 00:27
добавить qlineseries в функции в функции: "GPlotter::addSeries(QString title, QVector &arr)" я вызываю метод setChart(...), я в конструктор передал адрес на QChartView элемент
BlinCT
BlinCT05 травня 2024 р. 05:46
Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
PS
Peter Son03 травня 2024 р. 17:57
Best Indian Food Restaurant In Cincinnati OH Ready to embark on a gastronomic journey like no other? Join us at App india restaurant and discover why we're renowned as the Best Indian Food Restaurant In Cincinnati OH . Whether y…
Evgenii Legotckoi
Evgenii Legotckoi02 травня 2024 р. 14:07
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.
IscanderChe
IscanderChe30 квітня 2024 р. 04:22
Во Flask рендер шаблона не передаётся в браузер Доброе утро! Имеется вот такой шаблон: <!doctype html><html> <head> <title>{{ title }}</title> <link rel="stylesheet" href="{{ url_…

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