在Web頁中嵌入QT對象

來源:互聯網
上載者:User

標籤: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 &paramNames, const QStringList &paramValues )介面。

可以看看我這部分代碼,如下:


#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對象

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.