QWebView实现浏览器的框架

基于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

猜你喜欢

转载自blog.csdn.net/hpu11/article/details/79621522
今日推荐