Arkadaşım ve ben C++ ve Javascript arasında iletişim kurmaya çalışıyoruz. C++/Qt (sürüm 5.6) uygulamasında gömülü olan WebGL ile belirli bir konumda bazı küreler oluşturmak istiyoruz.C++ ve Javascript arasındaki iletişim WebGL
Bunu yapmak için, WebGL için tüm JS koduna sahip bir HTML dosyasını okuyan bir QWebView
kullanıyoruz. Bu iyi çalışıyor, uygulamamızın içinde harika bir üst düzey 3D renderer var. Sorun, konumun C++ tarafından bilinmesi ve JavaScript ile paylaşılması gerektiğidir.
Daha doğrusu, C++ görüntülemek için gereken kürelerin sayısını ve konumunu bilir ve bunu Javascript tarafına söylemelidir. Bunu yapmanın en iyi yolu nedir?
Not: Qt Canvas3D'yi kullanmaya çalıştık ancak klasik WebGL'ye kıyasla çok yavaştı.
DÜZENLEME 1-
deneyin ilk sonra ne yazdığını yapmak ve aynı zamanda (bu one gibi) bazı örnekler okumaya çalıştım ama o iş yapmak mümkün değil.
Tüm başlatmalarımı gerçekleştirdiğim ve verilerimi koyduğum bir QWebEngineView alt sınıfı oluşturdum.
.h:
#ifndef WEBGLVIEW_H
#define WEBGLVIEW_H
#include <QObject>
#include <QtWebEngineWidgets>
#include <QtWebChannel/QtWebChannel>
class WebGLView : public QWebEngineView
{
Q_OBJECT
Q_INVOKABLE int getNumber();
Q_PROPERTY(int num READ getNumber)
public:
WebGLView(QWidget *parent = 0);
private :
QWebChannel* m_channel;
};
#endif // WEBGLVIEW_H
.Cpp: JS başında
#include "WebGLView.h"
#include <QCoreApplication>
#include <QUrl>
#include <QDebug>
WebGLView::WebGLView(QWidget *parent) :
QWebEngineView(parent)
{
// Set up the communications channel
//C++ to Java test
m_channel = new QWebChannel(this);
this->page()->setWebChannel(m_channel);
m_channel->registerObject(QString("test"),this);
QString path = QCoreApplication::applicationDirPath() + "/test6.html";
this->setUrl(QUrl::fromLocalFile(path));
}
int WebGLView::getNumber()
{
qDebug() << "getNumber";
return 10;
}
:
if (typeof widget !== 'undefined') {
var nspherefromc = JSobject.getNumber;
} else {var nspherefromc = 50;}
: Ben değerini erişmek istediğiniz
<script type="text/javascript" src="qrc:///qtwebchannel/qwebchannel.js"></script>
...
var JSobject;
if (typeof qt != 'undefined') {new QWebChannel(qt.webChannelTransport, function(channel) {
JSobject = channel.objects.test;
});
bunu çalıştırdığınızda:
- getNumber kez denir ve bunun QWebChannel çağrısıyla sonra gelir görünüyor
- Ben uyarı var: Nesne 'WebGLView' arasında Property 'num'' hiçbir sinyal bildirmek etti ve sabit değil, HTML'deki değer güncellemeleri bozulacak!
- nspherefromc, görüntülenecek kürelerin sayısıdır. 50 görüntülenir, 10 değil.
Herhangi bir fikrin var mı?
DÜZENLEME 2 - İkinci
Hala o iş yapamaz deneyin.
var more = 0;
if (typeof qt != 'undefined') {
new QWebChannel(qt.webChannelTransport, function(channel) {
JSobject = channel.objects.test;
more = 1000;
}
);
}
Hala var:
if (typeof JSobject !== 'undefined') {
nspherefromc = JSobject.num;
}
else {nspherefromc = 50;}
...
var spheresNum = nspherefromc + more;//Number of Spheres
çalıştırmaya, sadece 50 var deyimi girilirse Ben bir işlev olarak adlandırılan veya olup olmadığını görmek için daha adında yeni bir değişken eklemek çalıştı küreleri. QWebChannel'deki işlev çağrılmaz. Sanırım kendim demeyi mi? Ve ne zaman ? Aynı zamanda daha fazla hata ayıklama işlemini denedim (typeof qt! = 'Undefined') sttement ve 1050 kürem var.
DÜZENLEME 3 - işlev dışında artık JSObject ulaşamadığı anlamına gelir HTML Debugger'daki
function init() {
var JSobject;
var nspherefromc = 0;
if (typeof qt !== 'undefined') {
new QWebChannel(qt.webChannelTransport, function(channel) {
JSobject = channel.objects.test;
console.log(JSobject); //-> returns the object, I can access the functions and everything
nspherefromc = JSobject.num;
console.log("in the function " + nspherefromc); //prints 5000, what i sent from C++
more = 1000;
}
);
console.log(JSobject); // prints undefined
}
console.log(JSobject); // prints undefined
if (typeof JSobject !== 'undefined') {
console.log("Yeaaaah"); //Not reached
nspherefromc = JSobject.num;
nspherefromc + 1;
}
...
console.log("when loading " + nspherefromc + " (more is = to " + more); // nsphere = 0 , more = 0
var spheresNum = nspherefromc + more;
ile. Neden biliyor musun ?
DÜZENLEME - Sonunda OpenGL, C++ verileri alındığında zaten başlatılır. Bu nedenle, görüntülenen kürelerin sayısı C++'nın sorduğu değil.
Qt sürümü nedir? – IAmInPLS
Qt 5.6. Sorunuz için teşekkürler, açıklamayı ekledim. – ElevenJune
Yanıtımı düzenledikten sonra düzenledim. – IAmInPLS