雄安做网站优化的公司,vm虚拟机搭建wordpress,公司注册核名,哪个网站卖自己做的手工艺品Qt WebEngine_hitzsf的博客-CSDN博客
一、QWebEngineView
QWebEngineView 类是一个实现Web浏览器的便捷类#xff0c;提供了back() 、forward()、reload()、stop() 等方法#xff0c;可轻松实现页面的前进、后退、重载等导航功能#xff0c;要实现一个简单的只有网页加载网…Qt WebEngine_hitzsf的博客-CSDN博客
一、QWebEngineView
QWebEngineView 类是一个实现Web浏览器的便捷类提供了back() 、forward()、reload()、stop() 等方法可轻松实现页面的前进、后退、重载等导航功能要实现一个简单的只有网页加载网页预览、没有导航功能的web浏览器只需要定义一个 QWebEngineView 类对象使用load方法加载即可。下面是一个简单浏览器的实现
1、Widget类定义(widget.h)
#ifndef WIDGET_H
#define WIDGET_H
#include QWidget
#include QUrl
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent nullptr, QUrl url QUrl(http://www.baidu.com));
signals:
};
#endif // WIDGET_H
2、Widget类实现(widget.cpp)
#include widget.h
#include QtWebEngineWidgets
#include mywebengineview.hWidget::Widget(QWidget *parent, QUrl url): QWidget(parent)
{MyWebEngineView *view new MyWebEngineView;QVBoxLayout *mainLayout new QVBoxLayout(this);mainLayout-addWidget(view);mainLayout-setContentsMargins(0,0,0,0);mainLayout-setMargin(0);this-setContentsMargins(0,0,0,0);this-setWindowFlags(Qt::FramelessWindowHint); // 去掉标题栏view-load(url);
}
3、MyWebEngineView类定义mywebengineview.h
#ifndef MYWEBENGINEVIEW_H
#define MYWEBENGINEVIEW_H
#include QtWebEngineWidgetsclass MyWebEngineView : public QWebEngineView
{Q_OBJECT
public:explicit MyWebEngineView(QWidget *parent nullptr);QWebEngineView * createWindow(QWebEnginePage::WebWindowType type) override;void linkHovered(QString url);void lessheadPagePrintfToPdf(bool ok);private:QUrl newUrl;QWebEnginePage lessHeadPage;
};#endif // MYWEBENGINEVIEW_H
4、MyWebEngineView类实现mywebengineview.cpp
#include mywebengineview.h
#include QDebugMyWebEngineView::MyWebEngineView(QWidget *parent) : QWebEngineView(parent)
{connect(this-page(),QWebEnginePage::linkHovered,this,MyWebEngineView::linkHovered);connect(lessHeadPage,QWebEnginePage::loadFinished,this,MyWebEngineView::lessheadPagePrintfToPdf);
}//这个函数应该是由底层的QWebEnginePage发起调用的如果不想新建QWebEngineView在这儿覆写。
QWebEngineView *MyWebEngineView::createWindow(QWebEnginePage::WebWindowType type)
{Q_UNUSED(type)//识别要无头浏览输出pdfif (newUrl.toString() https://www.baidu.com/s?wd小米汽车safyb_n_homepagersv_dlfyb_n_homepagefromsupercl3tnbaidutop10frtop1000rsv_idx2hisfilter1 ||newUrl.toString() https://www.baidu.com/s?wd国风浩荡文脉赓续safyb_n_homepagersv_dlfyb_n_homepagefromsupercl3tnbaidutop10frtop1000rsv_idx2hisfilter1){lessHeadPage.load(newUrl);}else{this-load(newUrl);}qDebug() createWindow url is : this-url();return 0;
}void MyWebEngineView::linkHovered(QString url)
{qDebug() linkHovered url is : url;newUrl QUrl(url);
}//实现无头浏览输出pdf
void MyWebEngineView::lessheadPagePrintfToPdf(bool ok)
{Q_UNUSED(ok)lessHeadPage.printToPdf(QString(test.pdf));
}
5、主函数main.cpp
#include QApplication
#include QWebEngineProfile
#include QWebEngineSettings
#include QWebEnginePage
#include QWebEngineView
#include QtWebEngineWidgets
#include mywebengineview.h
#include widget.hQUrl commandLineUrlArgument()
{const QStringList args QCoreApplication::arguments();for (const QString arg : args.mid(1)) {if (!arg.startsWith(QLatin1Char(-)))return QUrl::fromUserInput(arg);}//return QUrl(QStringLiteral(http://www.wanweitech.cn));return QUrl(QStringLiteral(http://192.168.9.26:3006/#/Alautomdix));//return QUrl(QStringLiteral(http://www.baidu.com));
}int main(int argc, char *argv[])
{QCoreApplication::setOrganizationName(qtweb_widget);QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);QApplication app(argc, argv);QWebEngineSettings::defaultSettings()-setAttribute(QWebEngineSettings::PluginsEnabled, true); //启用加载插件QWebEngineSettings::defaultSettings()-setAttribute(QWebEngineSettings::PdfViewerEnabled, true); //启用PDF查看
#if QT_VERSION QT_VERSION_CHECK(5, 13, 0)QWebEngineSettings::defaultSettings()-setAttribute(QWebEngineSettings::DnsPrefetchEnabled, true);QWebEngineProfile::defaultProfile()-setUseForGlobalCertificateVerification();
#endifQUrl url commandLineUrlArgument();Widget view(nullptr, url);view.showFullScreen(); //全屏显示return app.exec();
}
二、无头浏览器
无头浏览器Headless Browser是一种没有图形用户界面GUI的浏览器。它通过在内存中渲染页面然后将结果发送回请求它的用户或程序来实现对网页的访问而不会在屏幕上显示网页。这种方式使得无头浏览器不仅适用于网络爬虫和测试等自动化任务而且还能够更安全地进行网页浏览因为它不会在屏幕上显示您的活动。
常见的无头浏览器包括Chrome Headless、PhantomJS、Puppeteer等常见的这些无头浏览器都属于互联网前后端开发相关的东西与Qt技术栈相关的比较少
1、基于QWebEnginePage实现无头浏览器
QWebEngine有两种实现方式一个QWidget框架下的QWebEngineView另一种是QML框架下的WebEngineView其中QWebEngineView包含QWebEnginePage的功能QWebEnginePage提供页面加载相关的功能QWebEngineView用于page的显示基于QWebEnginePage就可实现无头浏览器。
auto page new QWebEnginePage(this);
page-setUrl(QUrl(https://www.qt.io/));
connect(page, QWebEnginePage::loadFinished, this, [](bool ok){qDebug() __FUNCTION__ song load is ok ok;
});
使用QWebEnginePage加载页面页面加载成功后就可以做一些操作如网络截图、爬虫、数据采集等。
QWebEnginePage支持QWebEngine内嵌浏览器相关的功能具体可查看相关接口
1、获取网页相关信息 2、注入javascript 3、打印pdf QML的WebEngineView没有像QWebEngineView把page的功能分开所以WebEngineView不能实现无头浏览器的效果。
最后需要注意的是如果是在控制台程序中运行QWebEnginePagemain函数的应用程序类型必须是QApplication使用QCoreApplication无法启动QWebEnginePage。
2、示例程序
mywebengineview.c
#include mywebengineview.h
#include QDebugMyWebEngineView::MyWebEngineView(QWidget *parent) : QWebEngineView(parent)
{connect(this-page(),QWebEnginePage::linkHovered,this,MyWebEngineView::linkHovered);connect(lessHeadPage,QWebEnginePage::loadFinished,this,MyWebEngineView::lessheadPagePrintfToPdf);
}//这个函数应该是由底层的QWebEnginePage发起调用的如果不想新建QWebEngineView在这儿覆写。
QWebEngineView *MyWebEngineView::createWindow(QWebEnginePage::WebWindowType type)
{Q_UNUSED(type)//识别要无头浏览输出pdfif (newUrl.toString() https://www.baidu.com/s?wd小米汽车safyb_n_homepagersv_dlfyb_n_homepagefromsupercl3tnbaidutop10frtop1000rsv_idx2hisfilter1 ||newUrl.toString() https://www.baidu.com/s?wd国风浩荡文脉赓续safyb_n_homepagersv_dlfyb_n_homepagefromsupercl3tnbaidutop10frtop1000rsv_idx2hisfilter1){lessHeadPage.load(newUrl);}else{this-load(newUrl);}qDebug() createWindow url is : this-url();return 0;
}void MyWebEngineView::linkHovered(QString url)
{qDebug() linkHovered url is : url;newUrl QUrl(url);
}//实现无头浏览输出pdf
void MyWebEngineView::lessheadPagePrintfToPdf(bool ok)
{Q_UNUSED(ok)lessHeadPage.printToPdf(QString(test.pdf));
}
mywebengineview.h
#ifndef MYWEBENGINEVIEW_H
#define MYWEBENGINEVIEW_H
#include QtWebEngineWidgetsclass MyWebEngineView : public QWebEngineView
{Q_OBJECT
public:explicit MyWebEngineView(QWidget *parent nullptr);QWebEngineView * createWindow(QWebEnginePage::WebWindowType type) override;void linkHovered(QString url);void lessheadPagePrintfToPdf(bool ok);private:QUrl newUrl;QWebEnginePage lessHeadPage;
};#endif // MYWEBENGINEVIEW_H