一、效果图(基本框架)
二、代码
#include "webviewwindow.h"
#include "ui_webviewwindow.h"
WebViewWindow::WebViewWindow(QWidget *parent) :
QWidget(parent),
ui(new Ui::WebViewWindow)
{
ui->setupUi(this);
showMaximized();
ui->lineEdit->setPlaceholderText(QString::fromLocal8Bit("请输入Url"));
ui->lineEdit_2->setPlaceholderText(QString::fromLocal8Bit("请输入搜索内容"));
bar = new TabBar(ui->widget);
ui->horizontalLayout_2->addWidget(bar);
ui->horizontalLayout_2->addStretch();
connect(ui->lineEdit,&QLineEdit::returnPressed,this,[=](){
openUrl(ui->lineEdit->text());
});
connect(ui->lineEdit_2,&QLineEdit::returnPressed,this,[=](){
openUrl(QString("https://www.baidu.com/s?wd=%1&tn=87048150_dg&ie=utf8").arg(ui->lineEdit_2->text()));
});
connect(bar,&TabBar::tabBarClicked,this,[=](int index){
ui->stackedWidget->setCurrentIndex(index);
});
connect(bar,&TabBar::doubleClick,this,[=](QPoint pos){
int index = bar->tabAt(pos);
bar->removeTab(index);
ui->stackedWidget->removeWidget(ui->stackedWidget->widget(index));
});
bar->setStyleSheet("QTabBar::tab:!selected{width:140px;height:20px;background:rgb(240,240,240);font:12px;text-align:left;}"
"QTabBar::tab:selected{width:140px;height:20px;background:rgb(240,240,240);color:blue;font:12px;border:2px solid blue; text-align:left;}");
}
WebViewWindow::~WebViewWindow()
{
delete ui;
}
void WebViewWindow::openUrl(QString url)
{
WEBengineView *pwebview = new WEBengineView;
connect(pwebview,&WEBengineView::create_view,this,&WebViewWindow::on_create_view);
connect(pwebview,&WEBengineView::titleChanged,this,&WebViewWindow::on_titleChanged);
ui->stackedWidget->addWidget(pwebview);
bar->addTab("");
bar->setCurrentIndex(bar->count()-1);
ui->stackedWidget->setCurrentIndex(bar->count()-1);
pwebview->load(QUrl(url));
pwebview->show();
}
void WebViewWindow::on_create_view(WEBengineView *pview)
{
connect(pview,&WEBengineView::create_view,this,&WebViewWindow::on_create_view);
connect(pview,&WEBengineView::titleChanged,this,&WebViewWindow::on_titleChanged);
bar->addTab(pview->title());
ui->stackedWidget->addWidget(pview);
ui->stackedWidget->setCurrentIndex(ui->stackedWidget->count()-1);
bar->setCurrentIndex(bar->count()-1);
}
void WebViewWindow::on_titleChanged(QString title)
{
WEBengineView * pwebview = static_cast<WEBengineView *>(sender());
int index = ui->stackedWidget->indexOf(pwebview);
bar->setTabText(index,title);
}
void WebViewWindow::on_pushButton_3_clicked()
{
openUrl("https://www.baidu.com");
}
void WebViewWindow::on_pushButton_clicked()
{
int index = bar->currentIndex();
WEBengineView * pwebview = static_cast<WEBengineView *>(ui->stackedWidget->widget(index));
pwebview->back();
}
void WebViewWindow::on_pushButton_2_clicked()
{
int index = bar->currentIndex();
WEBengineView * pwebview = static_cast<WEBengineView *>(ui->stackedWidget->widget(index));
pwebview->reload();
}
三、总结
1、[virtual protected] QWebEngineView*QWebEngineView::createWindow(QWebEnginePage::WebWindowType type)
重写该方法,实现界面自定义打开方式
2、QStackedWidget 配合QTabBar管理每个新开的网页
3、子类化QTabBar,完成对双击事件的操作比如关闭对应的网页
四、展望
1.如何利用QWebEngineView 下载网络资源