Evgenii Legotckoi
Evgenii LegotckoiЖел. 18, 2015, 11:30 Т.Ж.

Qt / C ++ - Сабақ 036. QWebView - Qt бойынша ең қарапайым браузерді жазу

Ескертпе: бұл оқулық ескірген. Qt5.6 нұсқасынан WebEngine пайдалану керек

Кім өз браузерімізді жазғысы келмейді? Браузер туралы ойларды жоққа шығармаңыз, олар, әрине, болды. Сонымен, Qt QWebView класы бар, ол хром жазылған webkit браузер қозғалтқышымен, сәйкесінше, 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 әдісі арқылы осы оқиғаны қолмен өңдеуді орнату керек және сәйкес сигналға ұяшықты қосу керек. /87/) 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. Біз жеңіл құрастыруды OpenSSL іздейміз
  3. Және 32 немесе 64 биттің қажетті нұсқасын жүктеп алыңыз (mingw жағдайында 32 биттік жинақты жүктеп алыңыз).
  4. Содан кейін "OpenSSL екілік (\bin) каталогы" тармағын тексеру арқылы алынған қалтаға OpenSSL орнатыңыз.
  5. Содан кейін libeay32.dll және ssleay32.dll кітапханаларын іздеп, оларды Qt бар қалтаға Qt5Network.dll және Qt5Networkd.dll. кітапханаларына тасымалдаймыз.

Осыдан кейін жоғарыдағы қателер жойылады.

Барлығы

Жасалған жұмыстың нәтижесінде сіз келесі суретте көрсетілгендей сайт бетін өз қосымшаңызда аша аласыз. Сондай-ақ, сабақтан қосымшаның демонстрациясын бейне оқулықтан көруге болады.

Жобаны zip мұрағатында жүктеп алу сілтемесі: qwebviewexample.zip

Бейне оқулық

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

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

D
  • Ақп. 16, 2017, 4: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, 11: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, 3: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, 3 Т.Қ.

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

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

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

}
Михаиллл
  • Маусым 3, 2020, 3:25 Т.Қ.

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

s
  • Маусым 3, 2020, 3:32 Т.Қ.

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

s
  • Маусым 3, 2020, 3:33 Т.Қ.

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

Михаиллл
  • Маусым 3, 2020, 3:50 Т.Қ.

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

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
OI
  • Ora Iro
  • Жел. 24, 2024, 6:38 Т.Ж.

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

  • Нәтиже:40ұпай,
  • Бағалау ұпайлары-8
AD

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

  • Нәтиже:50ұпай,
  • Бағалау ұпайлары-4
m
  • molni99
  • Қаз. 26, 2024, 1:37 Т.Ж.

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

  • Нәтиже:80ұпай,
  • Бағалау ұпайлары4
Соңғы пікірлер
ИМ
Игорь МаксимовҚар. 22, 2024, 11:51 Т.Ж.
Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii LegotckoiҚаз. 31, 2024, 2:37 Т.Қ.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZEҚаз. 19, 2024, 8:19 Т.Ж.
Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь МаксимовҚаз. 5, 2024, 7:51 Т.Ж.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas5Шілде 5, 2024, 11:02 Т.Ж.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Енді форумда талқылаңыз
Evgenii Legotckoi
Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey1Қар. 15, 2024, 6:04 Т.Ж.
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProjectМаусым 4, 2022, 3:49 Т.Ж.
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9AnonimҚаз. 25, 2024, 9:10 Т.Ж.
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

Бізді әлеуметтік желілерде бақылаңыз