qt QWebEngineView 使用和截屏显示绘制输出

  • 首先继承QWebEngineView

        因为直接使用是不能鼠标点击跳转链接的。而且我们通常情况下还要获取网页的小图标显示

  1. 鼠标点击跳转链接

         关于这点肯定是要重新实现createWindow接口。网上也有很多例子。但是qt不同版本可能实现的不一样。

          我查看的有两种方式(不同qt版本下):直接在接口里面return this或者是重新new一个QWebEngineView然后返回对象管理。

           我这边使用的是第一种方式。

     2.获取网页小图标。

        网页每次跳转的时候会触发iconUrlChanged信号。我们只需要链接这个信号,在槽函数中get图标数据显示就行了。

         使用QNetworkAccessManager访问回去图标。

     3.大多情况下需要我们记录访问的所有链接,方便回退前进等。

         我们只需要在继承类里面记录下所有链接即可。并且提供对外访问的接口。得到链接列表,相信回退逻辑不用多说。

    下面直接上代码。仅供参考。

myWebEngineView::myWebEngineView(QWidget *parent):
	QWebEngineView(parent)
{
	mUrls.clear();
	mpNetworkAccessManager = new QNetworkAccessManager();
	connect(this, SIGNAL(iconUrlChanged(QUrl)), this, SLOT(slt_iconUrlChanged(QUrl)));
	//connect(this, SIGNAL(urlChanged(const QUrl&)), this, SLOT(slt_urlChanged(const QUrl&)));
}

QList myWebEngineView::getUrlList()
{
	return mUrls;
}

void myWebEngineView::addUrl(const QString url)
{
	if(!mUrls.contains(url))
		mUrls.append(url);
}

QWebEngineView * myWebEngineView::createWindow(QWebEnginePage::WebWindowType type)
{
	Q_UNUSED(type);
	if(!mUrls.contains(this->url().toString()))
		mUrls.append(this->url().toString());
	return this;
}

void myWebEngineView::slt_iconUrlChanged(QUrl url)
{
	QNetworkRequest iconRequest(url);
	mIconReply = mpNetworkAccessManager->get(iconRequest);
	connect(mIconReply, SIGNAL(finished()), this, SLOT(slt_iconloaded()));
}

void myWebEngineView::slt_iconloaded()
{
	if (mIconReply) {
		QByteArray data = mIconReply->readAll();
		QPixmap pixmap;
		pixmap.loadFromData(data);
		pixmap = pixmap.scaled(20, 20, Qt::KeepAspectRatio, Qt::SmoothTransformation);
		emit iconChanged(pixmap);

		mIconReply->deleteLater();
		mIconReply = 0;
	}
}

 

  •    截屏显示

         好多行业可能需要浏览网页,然后投屏或者推屏显示(非投影机)。我找到的方法是使用截屏的方式。效率还行。大家遇到好的方法一定要通知我哦。

         很简单,使用grap

        

if (ui->widgetWebView->page())
	{
		QWidget *widget = ui->widgetWebView->page()->view();
		if (widget)
		{
			mPixmap = widget->grab(QRect(0, 0, widget->width(), widget->height()));
		}
	}

   注意的是:

1.如果你仅仅是简单的在打开的时候显示。直接在编辑页面添加计时器或者什么方式,去不停截屏显示就行。

2.如果想再次打开停留在之前页面,并且页面停留在你之前看的位置,即滚动条保持原来的话。需要保存下QWebEnginePage.对象

   下次打开的时候调用QWebEngineView::setPage().设置对象显示。

3.我理解的QWebEngineView和QWebEnginePage关系就是view/model关系。

有时候我们需要在关闭view的时候也截屏显示网页。这个时候我们不仅需要保存QWebEnginePage对象,还要在后台逻辑上创建一个QWebEngineView供显示截图。那么问题来了。不是说关闭view显示嘛,怎么又要创建view。因为QWebEngineView不显示,就截不到想要的网页图。这个时候我们要让view显示,又不想让用户看到。就需要想办法了。

mView->show();
mView->move(-3841, -2161);

没错。显示,然后移到屏幕外。不就看不到了嘛。那么还有一个问题。任务栏可以看到窗口哦。解决方法设置

mView->setWindowFlags(Qt::Tool | Qt::WindowStaysOnTopHint | Qt::X11BypassWindowManagerHint);这样任务栏就看不到了。

4.有人会想,我关闭窗口了,使用线程去处理截屏多好。不能够!因为窗口还在,窗口要在主线程中。只能是启用QTimer去截取了。

大家有好的办法,好的想法记得留言告诉我。奥力给!!

你可能感兴趣的:(修炼笔记,qt,web)