QT学习之路十六(QWebView实现简易浏览器)
程序员文章站
2024-01-20 21:10:10
...
QtWebkit 模块介绍
QtWebkit 模块提供了一个在Qt中使用web browser的engine,这使得我们在QT的应用程序中使用万维网上的内容变得很容易,而且对其网页内容的控制也可以通过native controls 实现 。
QtWebkit具有渲染HTML,XHTML和SVG 文档, 使用CSS排版,运行JavaScript等功能。在JavaScript 运行环境和Qt object model 直接的桥接技术使得自定义的QObject 可以在JavaScript代码中使用 。和Qt network module 的整合使得网页可以通过从服务器,本地文件系统,甚至qt的资源系统中下载 。另外为了提供渲染特性,可以使用HTML元素的 contenteditable属性,使HTML文档可以被用户编辑 。QtWebkit是基于开源的WebKit engine的 。更多信息可以到http://www.webkit.org查看。为了使用Qtwebkit模块中的类,我们需要在相关头文件中加入
#include <QtWebKit/QtWebKit>
#include <QtWebKit/QWebView>
, 在工程的pro文件中添加 QT += webkit语句 。QWebView 主要用来查看网页,一个QWebView的实例中有一个QWebPage.
QWebPage可以访问这个页面的文档结构,它主要描述如Frames,he navigation history, 和编辑内容的the undo/redo stack
QWebHsitory 主要是用来存放QWebPage的访问历史记录,并且提供对于导航到相关页面的支持 。
QWebHistoryInterface 提供了一个实现访问历史连接的接口 。
界面布局
先用设计器放置一个QWebView空间、一个Label、一个LineEdit、三个Button,并将之布局好。
设置QWebView的初始url,将三个按钮和QWebView的槽连接,这里只需在设计器界面按下F4即可快速连接信号和槽。
其他的就是标题、url输入框以及进度条等细节的界面优化问题了。
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QtWebKit/QtWebKit>
#include <QtWebKit/QWebView>
#include <QUrl>
#include <QProgressBar> //使用进度条
#include <QFile>
#include <QMessageBox>
#include <QDebug>
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(); //设置主页
private:
Ui::MainWindow *ui;
QProgressBar *progressbar;
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);
//实例化进度条
this->progressbar = new QProgressBar;
ui->statusBar->addWidget(progressbar);
this->initMainPage();
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(ui->viewsourcecodeAction, SIGNAL(triggered()), this, SLOT(sourceCodeSlot()));
connect(ui->setmainpageAction, SIGNAL(triggered()), this, SLOT(setMainpageSlot()));
}
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::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>
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
void setWebSource(QString); //设置文本内容
private:
Ui::Dialog *ui;
};
#endif // DIALOG_H
dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"
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);
}
main.cpp
#include <QtGui/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();
}
上一篇: 数据库索引原理----B树 、 B+树