基于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
扫描二维码关注公众号,回复:
1139343 查看本文章
#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