Qt文档阅读笔记-官方Form Extractor Example实例解析
目錄
?
?
背景
解析官方例子
?
背景
最近迷上了WEB相關的代碼,上個月初步分析了HTTP協議,能用telnet構造HTTP封包直接和WEB服務器通信,昨天晚上看到了Qt5.5.1版本里面有一個例子Form Extractor Example,這個例子簡直刷新了我對Qt的認識!
原來在官方認為:
不僅僅可以用widges做界面,Qt后端數據處理;
QML做界面,Qt后端處理。
竟然還能用HTML做界面,Qt后端處理,在此把Form Extractor Example這個實例給分析一下!
?
解析官方例子
這里先放一個截圖:
首先來看看文件的存儲結構:
進formextractor.ui看看
發現這是一個QWidget界面,而在程序跑起來后,竟然有菜單欄!
這里,看看mainwindw.h,發現這個是QMainWindow,再看下mainwindow.cpp發現他構造了一個界面,然后把QWidget界面,放到了setCentralWidget里面!
這里就有了一個疑惑,為什么官方不直接把界面放到QMainwindw里面,而是先放到QWidget,再放進去呢?
這葫蘆里到底是賣的什么藥?????
因為這個例子,官方沒有給其他說明,所以,在此我就猜測下!
估計是為了方便管理把,主控界面放到主控界面的UI里面,程序大體框架,放到大體框架里面,估計就是這樣了把!
下面來看下:
formextractor.cpp代碼:
#include "formextractor.h"#include <QWebElement>FormExtractor::FormExtractor(QWidget *parent, Qt::WindowFlags flags): QWidget(parent, flags) {ui.setupUi(this);ui.webView->setUrl(QUrl("qrc:/form.html"));connect(ui.webView->page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()),this, SLOT(populateJavaScriptWindowObject()));resize(300, 300); }FormExtractor::~FormExtractor() { }void FormExtractor::submit() {QWebFrame *frame = ui.webView->page()->mainFrame();QWebElement firstName = frame->findFirstElement("#firstname");QWebElement lastName = frame->findFirstElement("#lastname");QWebElement maleGender = frame->findFirstElement("#genderMale");QWebElement femaleGender = frame->findFirstElement("#genderFemale");QWebElement updates = frame->findFirstElement("#updates");ui.firstNameEdit->setText(firstName.evaluateJavaScript("this.value").toString());ui.lastNameEdit->setText(lastName.evaluateJavaScript("this.value").toString());if (maleGender.evaluateJavaScript("this.checked").toBool())ui.genderEdit->setText(maleGender.evaluateJavaScript("this.value").toString());else if (femaleGender.evaluateJavaScript("this.checked").toBool())ui.genderEdit->setText(femaleGender.evaluateJavaScript("this.value").toString());if (updates.evaluateJavaScript("this.checked").toBool())ui.updatesEdit->setText("Yes");elseui.updatesEdit->setText("No"); }void FormExtractor::populateJavaScriptWindowObject() {ui.webView->page()->mainFrame()->addToJavaScriptWindowObject("formExtractor", this); }從這里我們可以知道:
當頁面聲明了JavaScript后,就會發出信號,嗲用populxxxxxxx這個函數!
這里有2個疑惑,一個是:
點擊了界面的Submit后,才會進入populxxxxxxx,并不是加載頁面后,就進入這個函數,這里估計可以知道,當點擊了Submit后,才有JavaScript的聲明,
下面來看下html代碼:
form.html
<html><body> <h1> The Green People Book Club </h1><p> Welcome to The Green People Book Club. Please register to obtain a membership with us. </p><form onsubmit="formExtractor.submit()"><table><tbody><tr><td>First name:</td><td><input type="text" id="firstname"></td></tr><tr><td>Last name:</td><td><input type="text" id="lastname"></td></tr><tr><td>Gender:</td><td><input type="radio" name="gender" id="genderMale" value="Male"> Male<input type="radio" name="gender" id="genderFemale" value="Female"> Female</td></tr><tr><td colspan="2"><input type="checkbox" id="updates" value="receive">Check here if you would like to receive regular updates from us:</td></tr></tbody></table><input type="submit" value="Submit"></form></body></html>這里也沒明顯的看到JavaScript代碼!表單里面也沒有說什么Post,Get方法啥的
我估計就是這個原因把:
最后看一下這個函數:
void FormExtractor::submit() {QWebFrame *frame = ui.webView->page()->mainFrame();QWebElement firstName = frame->findFirstElement("#firstname");QWebElement lastName = frame->findFirstElement("#lastname");QWebElement maleGender = frame->findFirstElement("#genderMale");QWebElement femaleGender = frame->findFirstElement("#genderFemale");QWebElement updates = frame->findFirstElement("#updates");ui.firstNameEdit->setText(firstName.evaluateJavaScript("this.value").toString());ui.lastNameEdit->setText(lastName.evaluateJavaScript("this.value").toString());if (maleGender.evaluateJavaScript("this.checked").toBool())ui.genderEdit->setText(maleGender.evaluateJavaScript("this.value").toString());else if (femaleGender.evaluateJavaScript("this.checked").toBool())ui.genderEdit->setText(femaleGender.evaluateJavaScript("this.value").toString());if (updates.evaluateJavaScript("this.checked").toBool())ui.updatesEdit->setText("Yes");elseui.updatesEdit->setText("No"); }從中,可以知道,通過QWebElement可以直接獲取html中填充的數據!
簡直是神器啊!
?
總結
以上是生活随笔為你收集整理的Qt文档阅读笔记-官方Form Extractor Example实例解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows辅助开发笔记-辅助开发逻辑
- 下一篇: Java笔记-获取当前时间及对当前时间进