Внимание: Урок является устаревшим. С версии 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.
Для этого:
- Идём на следующий сайт
- Ищем там light сборку OpenSSL
- И качаем нужную версию 32 или 64 бита (в случае с mingw качаем 32-х разрядную сборку).
- Далее устанавливаем OpenSSL в производную папку отметив пункт "The OpenSSL binaries (\bin) directory"
- После чего ищем библиотеки libeay32.dll и ssleay32.dll и перебрасываем их в папку с Qt к библиотекам Qt5Network.dll и Qt5Networkd.dll.
После этого выше перечисленные ошибки пропадут.
Итог
В результате проделанной работы Вы сможете открыть страницу сайта в своём собственном приложении, как показано на ниже следующем рисунке. Также демонстрацию работы приложения из урока Вы можете увидеть в Видеоуроке.
Ссылка на скачивание проекта в zip-архиве: qwebviewexample.zip
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
А если этот метод не помог,как быть?
Возможно, библиотеки не подошли. Либо попытаться подключить непосредственно в проект. Там на сайте должна быть dev версия вместе с заголовочными файлами. Вот эту версию в проект и подключать тогда.
Записал в .pro файле
не находит это и выдает ошибку:Unknown module(s) in QT: webkit webkitwidgets
скажите пожалуйста, почему так
Статья устарела, используйте QWebEngine
Сделал так
Выдает туже ошибку: Unknown module(s) in QT: webenginewidgets
Компилятор MinGW 64 5.12
Переходить на MSVC, ибо MinGW не поддерживается.
Компилятор MSVC 2015 64bit тоже выдает ту-же ошибку
А вот это уже странно. Перезапуск qmake делали? webengine установлен? Он идёт отдельным пунктом в Maintanence Tool
Проверил, Qt WebeEgine установлен. Запускал qmake.
На этом компе глюки с QML, может в этом дело?
Не думаю. Мне надо будет самому тогда проверить, как получится, отпишусь.
тоже проблемма Unknown module(s) in QT: webenginewidgets
Как быть ?
у меня Desktop Qt %{Qt:Version} clang 64bit -> на этом не покатит ? !
Была ли у вас возможность проверить WebeEgine?
Нет, у меня проблема с жёстким диском случилась, занимался восстановлением ПК, ещё пару вечеров придётся этим заниматься, увы.
Не повезло вам.
Проверьте пожалуйста QT += webenginewidgets и # include < QtWebEngineWidgets>
+
Такая же проблема Unknown module(s) in QT: webenginewidgets на Qt5.12.3 + VS2015
Оказалось, что 2015-й не поддерживает webenginewidgets, а с MSVC 2017 - работает!
Вроде вск записала правильно, все подключила . Проблем со сборко нет.
НО вместо сайта выводится белый экран просто. В чем проблема может быть?
По задумке, при нажатии на кнопку должен выводится сайт в qwebengineview
Если взяли все из примера, то не должно собраться, т.к. webkit webkitwidgets уже не работают.
Какой класс Вы используете для браузера?
я с учетом обновлений использовала webenginewidgets
я с учетом обновлений использовала webenginewidgets
И использовали QWebEngineView как виджет?
Попробуйте setUrl(const QUrl &url)