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)

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
Г

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

  • Нәтиже:66ұпай,
  • Бағалау ұпайлары-1
t

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

  • Нәтиже:33ұпай,
  • Бағалау ұпайлары-10
t

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

  • Нәтиже:52ұпай,
  • Бағалау ұпайлары-4
Соңғы пікірлер
G
GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
d
dblas5Шілде 5, 2024, 11:02 Т.Ж.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssrАқп. 8, 2024, 6:43 Т.Қ.
Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Енді форумда талқылаңыз
Evgenii Legotckoi
Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
F
FynjyШілде 22, 2024, 4:15 Т.Ж.
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
BlinCT
BlinCTМаусым 25, 2024, 1 Т.Ж.
Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
BlinCT
BlinCTМамыр 5, 2024, 5:46 Т.Ж.
Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
Evgenii Legotckoi
Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

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