QWebView实现浏览器的框架
2018-03-20 10:26
435 查看
基于QWebView实现简单的浏览器编程框架示例
Qt5
这个示例,还解决了网页中二级链接点击无效的问题。
下面配上完整的工程源码,包括.pro文件
mainwindow.ui
dialog.ui
mainwindow.h#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QtWebKit/QtWebKit>
#include <QWebView>
#include <QUrl>
#include <QProgressBar> //使用进度条
#include <QFile>
#include <QMessageBox>
#include <QDebug>
#include <QWebFrame>
#include <QAction>
#include <QList>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void setUrlSlot(QUrl); //网页更改修改url输入框
void settitleSlot(QString); //网页更改修改标题
void browserWebSlot(); //LineEdit回车刷新网页
void deleteprogressbarSlot(bool); //进度条结束后状态栏显示Load Finish 5秒
void sourceCodeSlot(); //网页显示源代码
void setMainpageSlot(); //设置主页
void saveUrl(QString); //保存浏览过的网页地址
void testSlot(const QUrl &);
private:
Ui::MainWindow *ui;
QProgressBar *progressbar;
QAction *viewsourcecodeAction;
QAction *setmainpageAction;
QList<QUrl> url;
void initMainPage(); //浏览器初始化
};
#endif // MAINWINDOW_H
mainwindow.cpp#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialog.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
viewsourcecodeAction = new QAction ("source", this);
setmainpageAction = new QAction ("main", this);
ui->menuBar->addAction (viewsourcecodeAction);
ui->menuBar->addAction (setmainpageAction);
//
this->progressbar = new QProgressBar;
ui->statusBar->addWidget(progressbar);
this->initMainPage();
// 激活二级连接
ui->webView->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);
connect(ui->webView, SIGNAL(urlChanged(QUrl)), this, SLOT(setUrlSlot(QUrl)));
connect(ui->webView, SIGNAL(titleChanged(QString)), this, SLOT(settitleSlot(QString)));
connect(ui->lineEdit, SIGNAL(returnPressed()), this, SLOT(browserWebSlot()));
connect(ui->webView, SIGNAL(loadProgress(int)), this->progressbar, SLOT(setValue(int)));
connect(ui->webView, SIGNAL(loadFinished(bool)), this, SLOT(deleteprogressbarSlot(bool)));
connect(viewsourcecodeAction, SIGNAL(triggered()), this, SLOT(sourceCodeSlot()));
connect(setmainpageAction, SIGNAL(triggered()), this, SLOT(setMainpageSlot()));
connect(ui->lineEdit, SIGNAL(textChanged(QString)), this, SLOT(saveUrl(QString)));
// 连接二级链接和槽 用于打开二级连接
connect(ui->webView, SIGNAL(linkClicked(const QUrl &)), this, SLOT(testSlot(const QUrl &)));
}
MainWindow::~MainWindow()
{
delete ui;
}
//网页更改修改url输入框
void MainWindow::setUrlSlot(QUrl url)
{
ui->lineEdit->setText(url.toString());
}
//网页更改修改标题
void MainWindow::settitleSlot(QString title)
{
this->setWindowTitle(title);
}
//LineEdit回车刷新网页
void MainWindow::browserWebSlot()
{
ui->webView->load(QUrl(ui->lineEdit->text()));
}
//进度条结束后状态栏显示Load Finish 5秒
void MainWindow::deleteprogressbarSlot(bool ok)
{
if(ok)
{
delete this->progressbar;
this->progressbar = NULL;
ui->statusBar->showMessage("Load Finish", 5*1000);
}
}
//网页显示源代码
void MainWindow::sourceCodeSlot()
{
QString context = ui->webView->page()->currentFrame()->toHtml();
// this->hide();
Dialog *dialog = new Dialog;
dialog->setWebSource(context);
dialog->show();
}
//设置主页
void MainWindow::setMainpageSlot()
{
QString filename = "mainpage.ini";
QFile *file = new QFile;
file->setFileName(filename);
bool ok = file->open(QIODevice::WriteOnly);
if(ok)
{
QTextStream out(file);
out<<"mainpage="+ui->lineEdit->text();
file->close();
delete file;
file = NULL;
QMessageBox::information(this, "information", "set main page success");
}
else
{
qDebug()<<"set fail";
}
}
void MainWindow::saveUrl(QString netAddr)
{
url.append(QUrl(netAddr));
}
void MainWindow::testSlot(const QUrl & url)
{
ui->webView->load(url);
}
//浏览器初始化
void MainWindow::initMainPage()
{
QString filename = "mainpage.ini";
QFile *file = new QFile;
file->setFileName(filename);
bool ok = file->open(QIODevice::ReadOnly);
if(ok)
{
QTextStream in(file);
ui->webView->load(QUrl(in.readLine().split("=").at(1)));
file->close();
delete file;
file = NULL;
}
else
{
QMessageBox::information(this, "Error Message", "init main page error:"+file->errorString());
return;
}
}
dialog.h#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QAbstractButton>
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
void setWebSource(QString); //设置文本内容
private slots:
void on_buttonBox_clicked(QAbstractButton *button);
private:
Ui::Dialog *ui;
};
#endif // DIALOG_H
dialog.cpp#include "dialog.h"
#include "ui_dialog.h"
#include <QDebug>
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::setWebSource(QString context)
{
ui->textEdit->setPlainText(context);
}
void Dialog::on_buttonBox_clicked(QAbstractButton *button)
{
delete ui;
}
main.cpp#include <QApplication>
#include "mainwindow.h"
#include <QTextCodec>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());
MainWindow w;
w.show();
return a.exec();
}demo.pro#-------------------------------------------------
#
# Project created by QtCreator 2018-03-19T08:31:18
#
#-------------------------------------------------
QT += core gui webkit webkitwidgets
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = demo
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp \
dialog.cpp
HEADERS += mainwindow.h \
dialog.h
FORMS += mainwindow.ui \
dialog.ui
Qt5
这个示例,还解决了网页中二级链接点击无效的问题。
下面配上完整的工程源码,包括.pro文件
mainwindow.ui
dialog.ui
mainwindow.h#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QtWebKit/QtWebKit>
#include <QWebView>
#include <QUrl>
#include <QProgressBar> //使用进度条
#include <QFile>
#include <QMessageBox>
#include <QDebug>
#include <QWebFrame>
#include <QAction>
#include <QList>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void setUrlSlot(QUrl); //网页更改修改url输入框
void settitleSlot(QString); //网页更改修改标题
void browserWebSlot(); //LineEdit回车刷新网页
void deleteprogressbarSlot(bool); //进度条结束后状态栏显示Load Finish 5秒
void sourceCodeSlot(); //网页显示源代码
void setMainpageSlot(); //设置主页
void saveUrl(QString); //保存浏览过的网页地址
void testSlot(const QUrl &);
private:
Ui::MainWindow *ui;
QProgressBar *progressbar;
QAction *viewsourcecodeAction;
QAction *setmainpageAction;
QList<QUrl> url;
void initMainPage(); //浏览器初始化
};
#endif // MAINWINDOW_H
mainwindow.cpp#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialog.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
viewsourcecodeAction = new QAction ("source", this);
setmainpageAction = new QAction ("main", this);
ui->menuBar->addAction (viewsourcecodeAction);
ui->menuBar->addAction (setmainpageAction);
//
this->progressbar = new QProgressBar;
ui->statusBar->addWidget(progressbar);
this->initMainPage();
// 激活二级连接
ui->webView->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);
connect(ui->webView, SIGNAL(urlChanged(QUrl)), this, SLOT(setUrlSlot(QUrl)));
connect(ui->webView, SIGNAL(titleChanged(QString)), this, SLOT(settitleSlot(QString)));
connect(ui->lineEdit, SIGNAL(returnPressed()), this, SLOT(browserWebSlot()));
connect(ui->webView, SIGNAL(loadProgress(int)), this->progressbar, SLOT(setValue(int)));
connect(ui->webView, SIGNAL(loadFinished(bool)), this, SLOT(deleteprogressbarSlot(bool)));
connect(viewsourcecodeAction, SIGNAL(triggered()), this, SLOT(sourceCodeSlot()));
connect(setmainpageAction, SIGNAL(triggered()), this, SLOT(setMainpageSlot()));
connect(ui->lineEdit, SIGNAL(textChanged(QString)), this, SLOT(saveUrl(QString)));
// 连接二级链接和槽 用于打开二级连接
connect(ui->webView, SIGNAL(linkClicked(const QUrl &)), this, SLOT(testSlot(const QUrl &)));
}
MainWindow::~MainWindow()
{
delete ui;
}
//网页更改修改url输入框
void MainWindow::setUrlSlot(QUrl url)
{
ui->lineEdit->setText(url.toString());
}
//网页更改修改标题
void MainWindow::settitleSlot(QString title)
{
this->setWindowTitle(title);
}
//LineEdit回车刷新网页
void MainWindow::browserWebSlot()
{
ui->webView->load(QUrl(ui->lineEdit->text()));
}
//进度条结束后状态栏显示Load Finish 5秒
void MainWindow::deleteprogressbarSlot(bool ok)
{
if(ok)
{
delete this->progressbar;
this->progressbar = NULL;
ui->statusBar->showMessage("Load Finish", 5*1000);
}
}
//网页显示源代码
void MainWindow::sourceCodeSlot()
{
QString context = ui->webView->page()->currentFrame()->toHtml();
// this->hide();
Dialog *dialog = new Dialog;
dialog->setWebSource(context);
dialog->show();
}
//设置主页
void MainWindow::setMainpageSlot()
{
QString filename = "mainpage.ini";
QFile *file = new QFile;
file->setFileName(filename);
bool ok = file->open(QIODevice::WriteOnly);
if(ok)
{
QTextStream out(file);
out<<"mainpage="+ui->lineEdit->text();
file->close();
delete file;
file = NULL;
QMessageBox::information(this, "information", "set main page success");
}
else
{
qDebug()<<"set fail";
}
}
void MainWindow::saveUrl(QString netAddr)
{
url.append(QUrl(netAddr));
}
void MainWindow::testSlot(const QUrl & url)
{
ui->webView->load(url);
}
//浏览器初始化
void MainWindow::initMainPage()
{
QString filename = "mainpage.ini";
QFile *file = new QFile;
file->setFileName(filename);
bool ok = file->open(QIODevice::ReadOnly);
if(ok)
{
QTextStream in(file);
ui->webView->load(QUrl(in.readLine().split("=").at(1)));
file->close();
delete file;
file = NULL;
}
else
{
QMessageBox::information(this, "Error Message", "init main page error:"+file->errorString());
return;
}
}
dialog.h#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QAbstractButton>
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
void setWebSource(QString); //设置文本内容
private slots:
void on_buttonBox_clicked(QAbstractButton *button);
private:
Ui::Dialog *ui;
};
#endif // DIALOG_H
dialog.cpp#include "dialog.h"
#include "ui_dialog.h"
#include <QDebug>
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::setWebSource(QString context)
{
ui->textEdit->setPlainText(context);
}
void Dialog::on_buttonBox_clicked(QAbstractButton *button)
{
delete ui;
}
main.cpp#include <QApplication>
#include "mainwindow.h"
#include <QTextCodec>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());
MainWindow w;
w.show();
return a.exec();
}demo.pro#-------------------------------------------------
#
# Project created by QtCreator 2018-03-19T08:31:18
#
#-------------------------------------------------
QT += core gui webkit webkitwidgets
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = demo
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp \
dialog.cpp
HEADERS += mainwindow.h \
dialog.h
FORMS += mainwindow.ui \
dialog.ui
相关文章推荐
- js框架jquery实现幸运大转盘抽奖程序代码,兼容多种浏览器
- Selenium框架所有用例打开一次浏览器方法实现(Java)
- 通过javascript 框架 Jquery 实现跨浏览器 画直线 斜线等线段
- 基于asp.net + easyui框架,js实现上传图片之前判断图片格式,同时实现预览,兼容各种浏览器+下载
- 基于asp.net + easyui框架,js实现上传图片之前判断图片格式,同时实现预览,兼容各种浏览器+下载
- js实现多物体运动框架并兼容各浏览器
- Firemonkey实现Mac OS程序中内嵌浏览器的功能(自己动手翻译,调用苹果提供的webkit框架)
- js实现多物体运动框架并兼容各浏览器
- 关于实现自定义浏览器框架的相关细节问题
- 如何开发一个java开源框架-----Jvn框架之实现浏览器传参后台转成Bean(第四)
- Clipboard.js 框架实现移动端浏览器实现网页内容复制
- 基于asp.net + easyui框架,js实现上传图片之前判断图片格式,同时实现预览,兼容各种浏览器+下载
- Java+Selenium3框架设计准备篇2-TestNG通过变量实现启动不同浏览器测试
- QT学习之路十五(QWebView实现简易浏览器)
- 在thinkPHP3.2.3框架下实现手机和PC端浏览器的切换
- 基于asp.net + easyui框架,js实现上传图片之前判断图片格式,同时实现预览,兼容各种浏览器+下载
- Qt探索之旅(九)<QtWebKit/QWebView>简单实现浏览器
- 使用QWebView实现一个简单的浏览器(QtWebKit基本使用)
- 如何开发一个java开源框架-----Jvn框架之实现浏览器传参后台转成Bean(第四)
- 网页上实现导出excel表格时,怎样在后台生成excel后,让表格在浏览器中自动下载(larval框架)