2011-10-23 12 views
1

WindowsでQtWebKitブリッジの問題が発生しましたが、私は オプションを使い果たしました。私は使用されている正確なコードにアクセスすることはできませんが、以下のようなものです。JavaScriptからQt/C++オブジェクトへの文字列の受け渡し

C++

class MyObject : QWidget { 
    Q_OBJECT 

public: 
    QString data() const; 
    void setData(QString); 
    Q_PROPERTY(QString data READ data WRITE setData) 
}; 
/* ... */ 
MyObject myObject; 
frame->addToJavaScriptWindowObject("myObject", &myObject); 

はJavaScript

function drop(e) { 
    var url = e.dataTransfer.getData('url'); 
    //alert(url); // Displays url correctly 
    myObject.data = url; // Assigns url to C++ object myObject 
} 

警告ボックスが正しく、例えば、文字列の値を表示します10.10.0.1。 setDataのパラメータは私に文字列 "1"を与えます。そのアドレスにメモリを表示すると、UTF-32(1文字あたり4バイト)形式のメモリ内の完全なURLが表示されますが、(toStdString、toAscii、utf16)文字列全体を取得/使用できないようです。

私は、デバッガが私にトリックをしていると思っていたので、実際にこのデータ(QStringも使用)を必要とするメソッドにデータを渡しました。

私はMyObjectに::のsetData Q_INVOKABLEを作ると私は同じ 動作を得る直接のsetDataを呼び出す場合でも:

myObject.setData(url); // Assigns url to C++ object myObject 

私はちょうどリテラルとしてデータを渡すと、すべてが

myObject.setData('10.10.0.1'); 
のように、正常に動作しませんが

または

myObject.data = '10.10.0.1'; 

私は理由を理解していないpassinリテラルは動作しますが、変数ではない場合、 'url'変数は文字列型でなければなりません。

答えて

0

私は、部分的にそこです。文字列の受け渡しは期待通りに機能します。ただし、C++オブジェクトはWebページに埋め込まれ、ActiveX(ActiveQt)オブジェクトをラップします。 これについては、QWebPageから継承するクラスを作成するページをいくつか見てきました。そこには、あなたのためにウィジェットを構築するようにQUiLoaderに依頼するcreatePluginsメソッドがあります(代わりにQt Metatypeシステムを使用します)。私のC++オブジェクトは登録されています。 WebViewで(setPageを使用して)このカスタムWebPageを使用すると、文字列が間違って渡されます。 setPageの呼び出しを無効にすると、文字列が正しく渡されます。

したがって、文字列の受け渡しが機能します(一部の条件で)。

私はこのために新しい問題を作成しました:Qt Webkit bridge ActiveQt string

0

QStringの代わりにQScriptStringを試してください。

(私は - あなたの大文字、それを試していないが、それが役立つ場合があります)

+0

動作していないようです。メソッドは呼び出されません。ああ、さらに調査しています。 – BCL

+0

これに変更を加えました。 Linuxではこの考え方はうまくいくようですが、LinuxはUTF-32、WindowsはUTF-16です。 未加工のUTF-32ストリームを取得してUTF-16に変換しようとしていますが、すでにQStringであるため、このアイディアが有効かどうかわかりません。 – BCL

関連する問題