C++ 기반 클래스의 새 인스턴스를 생성하기 위해 QWebView에서 Javascript를 얻는 방법은 무엇입니까?

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

문제

QWebFrame에 C++ 개체를 성공적으로 추가했습니다. addToJavaScriptWindowObjectJavaScript에서 해당 객체의 슬롯을 호출 할 수 있습니다.

하지만 제가 정말로 원하는 것은 해당 슬롯 중 하나가 새로운 객체를 반환하도록 하는 것입니다.예를 들어 QObject 파생 클래스 인스턴스를 반환하는 다음과 같은 슬롯이 있습니다.

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

다음과 같이 자바스크립트에서 이 슬롯을 성공적으로 호출할 수 있습니다.

   var foo=myapp.helloWorld();

그러나 Foo는 비어있는 것처럼 보이며 슬롯을 호출하거나 JavaScript의 속성에 액세스 할 수 없습니다.

이것을 달성하는 방법에 대한 아이디어가 있습니까?

도움이 되었습니까?

해결책

내가 고려한 다소 추악한 해킹 중 하나는 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 버전은 스크립팅 지원을 통합하여 WebKit의 JavaScriptCore를 기반으로합니다.

다른 팁

Qobject *에 객체 포인터를 할당하여 반환 할 수 있습니다.

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

그것은 Linux의 QT Webkit 포트에서 저를 위해 일하고 있습니다.

Qtscript에는 프로토 타입의 개념이있어 스크립트 값에 대한 C ++ 프로토 타입을 만들 수 있습니다. 우리는 JavaScriptCore를 사용하여 QTScript를 브리지 할 수있는 것을 조사하고 있습니다. ~해야 한다 WebKit의 JavaScript 환경에서 프로토 타입을 사용할 수 있습니다. http://doc.trolltech.com/4.5/qtscript.html#making-ous-of-prototype-inheritance

MyObject*가 아닌 QObject*로 새 개체를 반환해 보십시오.QtScript로 작업하는 경우 다음을 호출할 수 있습니다. qScriptRegisterMetaType MyObject*를 QScriptValues(또는 QVariants)로 변환하기 위한 일부 코드를 정의하지만 QtWebKit에서 사용되는 JavaScript 엔진에 해당하는 코드는 없는 것 같습니다.

짜증나게도 이는 내부 객체 모델을 WebKit에 노출시키는 데 객체 포인터를 QObject*로 변환하는 별도의 프록시 함수 세트가 있거나 동일한 작업을 수행하기 위해 일종의 어댑터 클래스를 사용하는 것이 포함된다는 것을 의미합니다.

이 답변은 바울의 대답을 기반으로하지만 약간 단순화되었습니다. QT 5.3에 대한 테스트 및 작업. 객체를 인스턴스화 한 다음 반환하는 공장이 필요합니다. QObject 이 개체에 대한 포인터. 객체의 클래스는 상속해야합니다 QObject JavaScript에서 올바르게 작동하도록 :

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

이를 통해 JavaScript에서 다음을 수행 할 수 있습니다.

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

이 시점에서 당신은 가지고 있습니다 obj1 만큼 잘 myobject 글로벌 JavaScript 네임 스페이스에서 (그들은 단지 포인터 일 뿐이므로 다음 두 작업을 모두 수행합니다.

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

이 시점에서 사용할 수 있습니다 connect JavaScript에서 C ++ 신호를 JavaScript 슬롯에 연결합니다. 이 기술에 대한 자세한 내용은 여기를 참조하십시오. http://doc.qt.io/qt-5/qtwebkit-bridge.html

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top