QT:将任何C 对象暴露于JavaScript

Qt: Expose any C++ object to Javascript

本文关键字:暴露 JavaScript 对象 任何 QT      更新时间:2023-10-16

我想将C 对象从我自己的类公开到JavaScript。

一个例子可能会澄清,我到底要实现什么。在一个特定的项目中,我正在尝试编程一些简单的ShopApp。

所以我该如何使这样的事情成为可能(其中 mySqlObj是我的 sqlfunctions -object):

$(document).ready(function(){
    $("#someButtonId").click(function(){
        mySqlObj.refillBalance(1000); // adds 1000 units of money to user's account
        // or
        mySqlObj.listAllPorducts();
    });
});

那里我有一个名为sqlfunctions的课程。sqlfunctions.h看起来像

#ifndef SQLFUNCTIONS_H
#define SQLFUNCTIONS_H
#include <iostream>
#include <vector>
#include <algorithm>
#include <QSqlQuery>
#include <QSql>
#include <QSqlDatabase>
#include <QDebug>
#include <QMessageBox>
#include <QObject>
#include <QString>
#include "product.h"
class product;
using namespace std;
typedef vector<product>::iterator iter;
class sqlfunctions:public QObject{
    Q_OBJECT
    public:
        sqlfunctions();
    signals:
        void        purchaseDone(vector<product> cart);
        void        adminLoggedIn();
    public slots:
        // Warenmanagement
        product     isAlreadyInCart(product myProduct);
        void        listAllProducts();
        void        addToCart(product myProduct);
        void        showCart();
        void        clearCart();
        void        changeAmount(product myProduct, string mode);
        void        changeAmount(product myProduct, int diff, string mode);
        int         checkStock();
        double      checkBalance();
        void        purchase();
        // Usermanagement
        void        registerUser(QString username, QString password);
        void        login(QString username, QString password);
        void        empowerUser();
        void        disempowerUser();
        void        listAllUsers();
        void        refillBalance(int amount);
    private:
        // Accountmanagement
        vector<product>     cart;
        bool                isLogin;
        bool                isAdminLoggedIn;
        int                 uid;
        QSqlDatabase        db;
};
#endif // SQLFUNCTIONS_H

我的main.cpp当前看起来如下:

#include <QApplication>  
#include <QGraphicsWebView>
#include <QWebFrame>
#include <QtWebKit>
#include "html5applicationviewer.h"  
#include "sqlfunctions.h"
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    sqlfunctions obj;
    Html5ApplicationViewer viewer;
    viewer.setOrientation(Html5ApplicationViewer::ScreenOrientationAuto);
    viewer.showExpanded();
    viewer.loadFile(QLatin1String("src/index.html"));
    viewer.setFixedSize(1200, 900);
    QWebFrame *frame = viewer.webView()->page()->mainFrame();
    QString objJavascriptName = "mySqlObj";
    frame->addToJavaScriptWindowObject(objJavascriptName, &obj);
    return app.exec();
}

我已经考虑了文档和该线程(在这里更类似),但是So-thread似乎已经过时了,因为该示例并未在构建过程/目录中编译和奇怪的麻烦。

由于sqlfunctionsQObject继承,您可以将sqlfunctions*传递给期望QObject*的函数:

frame->addToJavaScriptWindowObject(objJavascriptName, &obj);