关于Qt 加载网页(一) QWebengineView 您所在的位置:网站首页 如何打开网页链接里边是文字的 关于Qt 加载网页(一) QWebengineView

关于Qt 加载网页(一) QWebengineView

2023-11-05 09:32| 来源: 网络整理| 查看: 265

一、对于Qt加载网页的思考 1.1 功能分析

Qt加载网页,我的第一映像就是做一个浏览器,那么首先要有个窗口(QMainwindow),窗口里面需要有个地址栏(textEdit),地址栏旁边有一个按钮(pushbutton),用来发送信号(click)给Qt的网页class(QWebengine相关对象)。查阅了帮助文档,基本锁定了QWebengineView和QWebenginePage两个类综合使用,就可以实现网页加载的基本功能。

1.2 整理需要用到的class

经过分析,我们所需要的用到的class大概就包含以下几个:

QMainwindow:新建ui项目时候,自然产生;QPushbutton:新建ui项目后,直接在qt界面里面拖拽;textEdit:同上;QWebengineView:在QMainwindow里面引入;QWebenginePage:  同上。

其中,QWebengine相关的类,需要在pro文件里面添加一句:

QT += webenginewidgets

这一句添加后,必须使用MSVC编译器,如果坚持使用MingGW编译器,就会提示找不到模块:

:-1: error: Unknown module(s) in QT: webenginewidgets

二、主要代码 2.1 pro文件 QT += core gui QT += webenginewidgets # 添加webengine模块 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = MyWeb TEMPLATE = app DEFINES += QT_DEPRECATED_WARNINGS CONFIG += c++11 SOURCES += \ main.cpp \ mainwindow.cpp HEADERS += \ mainwindow.h FORMS += \ mainwindow.ui qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target

从pro文件可以看出,整个项目包含了main.cpp、mainwindow.cpp、mainwindow.h、mainwindow.ui这几个文件。

2.2 main.cpp

main.cpp文件就是自动生成,不用做修改,

#include "mainwindow.h" #include int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); } 2.3 mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include #include namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = nullptr); ~MainWindow(); private slots: void on_loadBtn_clicked();# 加载链接按钮的槽函数,利用ui编辑器自动生成 void on_reloadBtn_clicked(); # 刷新链接按钮的槽函数,利用ui编辑器自动生成 private: Ui::MainWindow *ui; QWebEngineView *m_webView; # 页面显示对象指针 }; #endif // MAINWINDOW_H 2.4 mainwindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); m_webView = new QWebEngineView(this); QStackedLayout *layout =new QStackedLayout(ui->frame);#1、引入布局,用于存放QWebengineView; 2、指定的父项ui->frame是在ui界面引入了一个QFrame,用于加载QWebengineView。 ui->frame->setLayout(layout);设置frame的布局为layout。 layout->addWidget(m_webView); QString fst = "https://www.baidu.com/";设置初始链接。 ui->adressEdit->setText(fst); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_loadBtn_clicked() {# 加载按钮槽函数,加载地址栏里面显示的链接。 QString url = ui->adressEdit->text(); if (!url.isEmpty()) { m_webView->load(url); } } void MainWindow::on_reloadBtn_clicked() {# 刷新按钮槽函数,刷新地址栏里显示的链接 m_webView->reload(); } 2.5 mainwindow.ui

这个玩意儿就靠悟性了,所有细节都在图里了,记得结合上下午确定图中各个组件的名字。

三、演示

本来想传视频,结果技术水平不够,只有图片来凑了。。。。

 只要是地址栏上显示的有效链接,都可以打开。 

如果链接无效,就是这个页面,或者根本没反应。 

四、总结

这个方法基本实现了一般网页的加载,只要是地址栏里面的有效链接,一般都能打开,前提是你没断网。所以,可以算是实现了基本需求了。

目前来说,这个项目有个明显的bug,就是在百度主页面,你想要点击百度新闻这类链接,本项目是毫无反应的,也就是说,点击链接实现跳转的功能还不完善。这里面就需要用到QWebenginePage里面的函数createWindwos,常见的办法就是直接重载,由于这个办法单独拿出来,是不完美的,所以我决定另起一篇博文来安(pian)利(liu)它(liang)。

当然,目前网上也有很多讲述QWebenginePage::createWindows用法的博文,大家可以先参考,不过大部分博文只讲述了如何应用该函数实现跳转/打开新链接的问题,却并没有解决createWindows内存管理问题。

这里推荐一篇讲述createWindows的文章,也是我当时探究createWindows时阅读过的两篇文章。

QWebEngineView的使用示例

QT:QWebEngineView里面的页面链接点击无反应的解决方法

2022年6月28日更新:

关于Qt 加载网页(二)



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有