因为直接使用是不能鼠标点击跳转链接的。而且我们通常情况下还要获取网页的小图标显示
关于这点肯定是要重新实现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去截取了。
大家有好的办法,好的想法记得留言告诉我。奥力给!!