كيفية الحصول على جافا سكريبت في QWebView إلى خلق حالات جديدة من C++ على أساس الطبقات ؟

StackOverflow https://stackoverflow.com/questions/943554

سؤال

لقد بنجاح وأضاف C++ كائن إلى QWebFrame مع addToJavaScriptWindowObject, ويمكن أن نطلق فتحة على هذا الكائن من جافا سكريبت.

ولكن ما كنت حقا تريد القيام به هو الحصول على واحدة من تلك فتحات عودة وجوه جديدة.على سبيل المثال لدي فتحة مثل هذا ، والتي ترجع QObject فئة مشتقة سبيل المثال:

   MyObject* MyApp::helloWorld()
   {
          //MyObject is dervied from QObject
          return new MyObject();
   }

أنا يمكن أن تتصل هذه الفتحة من جافا سكريبت بنجاح مثل هذا

   var foo=myapp.helloWorld();

ولكن فو يبدو فارغا, لا أستطيع استدعاء أي فتحات أو الوصول إلى أي خصائص على ذلك من جافا سكريبت.

أي أفكار عن كيف يمكن تحقيق ذلك ؟

هل كانت مفيدة؟

المحلول

أحد الاختراق القبيح بدلا من ذلك، لقد فكرت في استخدام addtojavascriptwindowobject لإسقاط الكائن الذي أريد العودة إليه في كائن النافذة مع اسم عشوائي، ثم احصل على فتحة اسم مثيل الكائن بدلا من ذلك:

QString MyApp::helloWorld()
{
     //general a unique name for the js variable
     QString name=getRandomVariableName();

     //here's the object we want to expose to js
     MyObject* pReturn=new MyObject();

     //we make attach our object to the js window object    
     getWebFrame()->addToJavaScriptWindowObject(name, pReturn,
         QScriptEngine::ScriptOwnership);  

     //tell js the name we used
     return name;
}

يمكن كتابة JS للتحقق مما إذا كانت قيمة الإرجاع هي سلسلة، وإذا كان ذلك، فاستطع الكائن من النافذة:

var foo=myapp.helloWorld();
if (typeof foo == "string")
{
    foo=window[foo];
}

القبيح قليلا، ولكن سوف تحصل لي حتى تأتي طريقة أفضل. تسير إصدارات QT المستقبلية إلى توحيد دعم البرمجة النصية بحيث يعتمد كل شيء على JavaScriptCore في WebKit، لذلك نأمل أن يتحسن هذا بعد ذلك!

نصائح أخرى

يمكنك تعيين مؤشر الكائنات الخاصة بك إلى QOOBJECT * وإرجاع ذلك.

    QObject * obj = new MyObject();
    return obj;

هذا يعمل من أجلي على ميناء QT WebKit على Linux.

لدى QTScript فكرة النماذج الأولية - والتي تتيح لك إنشاء نموذج أولي C ++ لقيمة البرنامج النصي. نحن نحقق في Wether يمكننا جسر QTScript مع JavascriptCore - أي ينبغي يؤدي إلى إمكانية استخدام النماذج الأولية من بيئة JavaScript في WebKit أيضا؛ http://doc.trolltech.com/4.5/qtscript.html#ming-use-protineype-based-ineritance.

في محاولة العودة الجديدة الخاصة بك وجوه QObject* بدلا من MyObject*.إذا كنت تعمل فقط مع QtScript, ثم يمكنك الاتصال qScriptRegisterMetaType لتحديد بعض التعليمات البرمجية في التعامل مع تحويل MyObject*s في QScriptValues (أو QVariants) ، ولكن هناك لا يبدو أن يكون معادلا ل محرك جافا سكريبت تستخدم في QtWebKit.

مزعج ، وهذا يعني أن تعريض الداخلية كائن نموذج بكت سيشمل أيضا وجود مجموعة منفصلة من الوكيل وظائف تحويل كائن مؤشرات QObject*s أو باستخدام محول دروس من نوع أن تفعل الشيء نفسه.

تعتمد هذه الإجابة على إجابة بولس، ولكن مبسطة بعض الشيء. اختبار وتعمل من أجل QT 5.3. تحتاج إلى مصنع يناسب كائن، ثم إرجاع QObject مؤشر لهذا الكائن. يجب أن يرث فئة الكائن QObject بحيث يعمل بشكل صحيح في جافا سكريبت:

QObject * MyApp::createInstance(QString objname) {
    MyClass * obj = new MyClass(this);
    m_mainWindow->webView->page()->mainFrame()->addToJavaScriptWindowObject(objname, obj, QWebFrame::ScriptOwnership);
    return obj;
}

مع هذا، يمكنك القيام بما يلي من جافا سكريبت:

var myobject = MyApp.createInstance("obj1");

في هذه المرحلة، لديك obj1 إلى جانب myobject في مساحة اسم JavaScript Global JavaScript (فهي مؤشرات فقط، لذلك قم بعمل كل من الأعمال التالية:

myobject.testmethod();
obj1.testmethod();

في هذه المرحلة، يمكنك استخدام connect في JavaScript لتوصيل إشارات C ++ إلى فتحات JavaScript. مزيد من المعلومات حول هذه التقنية هنا: http://doc.qt.io/qt-5/qtwebkit-bridge.html.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top