標籤:qwebkit html頁嵌入qt對象
根據最近讀的QT進階編程,原來QT是可以在HTML中內嵌物件的,確實很厲害。於是自己動手寫了一個Demo,中途出現了一點點問題,js執行有問題,看來要提交javascript了,我感覺python也應該適當提高提高了。下面要重點提一下我犯的錯誤。
<HTML><HEAD><META NAME="GENERATOR" Content="Microsoft Visual Studio 8.0"><TITLE></TITLE></HEAD><BODY><!-- 添加介面元素 --><object type="application/x-qt-plugin" classid="QLabel" objectName="title" pos="0, 0" text="<strong><em><font size=32><center>計算矩陣</center></font></em></strong>">Qt's Plugin Load Failed</object><object type="application/x-qt-plugin" classid="MatrixWidget" objectName="leftOper" <strong>id="leftMatrix"</strong> pos="0, 200" size="300, 300">Qt's Plugin Load Failed</object><object type="application/x-qt-plugin" classid="QLabel" objectName="plusSymbol" pos="310, 510" text="<strong><em><font size=32><center>+</center></font></em></strong>">Qt's Plugin Load Failed</object><object type="application/x-qt-plugin" classid="MatrixWidget" objectName="rightOper" <strong>id="rightMatrix"</strong> pos="330, 520" size="300, 300">Qt's Plugin Load Failed</object><object type="application/x-qt-plugin" classid="QLabel" objectName="equalSymbol" pos="350, 530" text="<strong><em><font size=32><center>=</center></font></em></strong>">Qt's Plugin Load Failed</object><object type="application/x-qt-plugin" classid="MatrixWidget" objectName="result" <strong>id="resultMatrix"</strong> pos="330, 520" size="300, 300">Qt's Plugin Load Failed</object><object type="application/x-qt-plugin" classid="QPushButton"<strong> id="btnCalc"</strong> pos="350, 550" size="50, 25" text="計算"></object><!-- 指令碼執行部分 --><script> function calcResult() { //rowCount和columnCount是屬性,不是slots不能以調用的形式來書寫,不能帶() for (var i = 0; i < leftMatrix.rowCount; ++i) { for (var j = 0; j < leftMatrix.columnCount; ++j) { var value = Number(leftMatrix.getValueAt(i, j)) + Number(rightMatrix.getValueAt(i, j)); resultMatrix.setValueAt(i, j, value); } } }// var rowIndex = 0;// var columnIndex = 1;// var varvarlue = leftMatrix.getValueAt(rowIndex, columnIndex) + rightMatrix.getValueAt(rowIndex, columnIndex);// btnCalc.text = "開始計算"; leftMatrix.setValueAt(0, 1, "1"); leftMatrix.setValueAt(0, 0, 500); rightMatrix.setValueAt(0, 1, "5"); //resultMatrix.setValueAt(1, 1, Number(varvarlue)); calcResult();// leftMatrix.itemChanged.connect(calcResult);// rightMatrix.itemChanged.connect(calcResult); btnCalc.clicked.connect(calcResult);</script></BODY></HTML>
1.在html中增加對象的時候,要指明object的ID,ID是在javascript中使用的,特別想提醒的就是在嵌入QT對象的時候盡量保證你編寫的屬性名稱和QT屬性機制中的屬性
對應起來這樣在組裝對象的時候就變得非常簡單了,因為QT的屬性機制是支援動態設定的,可以直接根據屬性的名稱來設定屬性,所以這裡就可以排上用上了,這個機制
其實跟QT的Script機制是一樣一樣的。
2.指令碼中屬性的調用和QT公開槽函數的調用是不一樣的。屬性調用的時候不需要加(),我寫的指令碼一直執行不成功就是因為在rowCount和columnCount後面增加了()而導致的。
3.JS與QT訊號的串連,串連方式: JS中的id名稱.訊號名稱.connect(JS的函數)
4.對於object的解析,可以擴充QWebPage,並重寫
createPlugin( const QString &classid, const QUrl &url, const QStringList ¶mNames, const QStringList ¶mValues )介面。
可以看看我這部分代碼,如下:
#include "webpage.h"#include "matrixwidget.h"#include <QtUiTools/QUiLoader>WebPage::WebPage(QObject *parent): QWebPage(parent){}WebPage::~WebPage(){}//根據classid來選擇載入QObject * WebPage::createPlugin( const QString &classid, const QUrl &url, const QStringList ¶mNames, const QStringList ¶mValues ){QWidget *widget = NULL;QUiLoader uiLoader;if (uiLoader.availableWidgets().indexOf(classid) != -1){widget = uiLoader.createWidget(classid, view());}else if(classid == "MatrixWidget"){widget = new MatrixWidget(view());}if (widget){//getPropertyValue(paramNames, "height");//paramNames.indexOf("height");//保證paramName和QT屬性機制中的屬性保持一致即可自動化佈建資料for (int i=0; i<paramNames.size(); ++i){widget->setProperty(paramNames[i].toLocal8Bit(), QVariant(paramValues[i]));}}return widget;}QVariant WebPage::getPropertyValue( const QStringList ¶mNames, const QString& propertyName ){return QVariant();}
全部代碼可以在我的資源中下載:
http://download.csdn.net/download/davidsu33/8042983
在Web頁中嵌入QT對象