QT學習之路十六(QWebView實現簡易瀏覽器)
阿新 • • 發佈:2019-02-01
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();
}