問題タブ [qtscript]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
1646 参照

c++ - QScriptEngine::newFunction でメンバー関数を使用する

0 投票する
2 に答える
1192 参照

c++ - QtScript で c++ std 複素数を使用する方法

複素数の引数で定義されたスロットを QtScript から呼び出すことができるように、QtScript で複素数を使用する方法を見つけようとしています。また、スクリプトからユーザーが複素数の基本的な代数 (+、-、​​exp、...) にアクセスできる必要があります。

例として、私が呼び出したいのは次のとおりです。

何か案は?どうも!

0 投票する
1 に答える
544 参照

javascript - QtScriptでオーバーロードされた演算子でカスタムc++クラスを使用することは可能ですか?

+、-、*などのオーバーロードされた演算子を使用してC ++クラスを作成し、「a + b」などのjs式が評価されるようにQtScriptEngineに何らかの方法で宣言できるかどうかを知っている人はいますか?彼らはC++側にいるのでしょうか?

0 投票する
2 に答える
12279 参照

c++ - QtScript と比較して、Qt での Lua はどのくらい簡単ですか?

Qt を使用して C++ 開発を始めたばかりです。ただし、Lua を使用してアプリケーションのスクリプトを作成することにも興味があります。アプリケーションのワークフロー/UI/グルーを作成するための開発速度 (容易さ) を示すさまざまな記事があるためです。ただし、そのままでは Qt はそれをサポートしておらず、代わりに QtScript が含まれています。

私の質問は、基本的に Qt で Lua を使用して商用アプリを開発しようとするか、SDK で利用可能な QtScript を使用する必要があるかということです。主に開発速度と安定性の問題だと思います。

0 投票する
1 に答える
517 参照

overriding - qtscriptで演算子をオーバーライドする

qtscriptを使って数式エディタを作りたいです。スクリプトでの配列計算をサポートします。たとえば、array1 + array2 = array3。({1,2,3} + {3,4,5} = {4,6,8}); たぶん、operator +をオーバーライドする必要があり、QByteArrayの例を参照し、operator +をオーバーライドしますが、Scriptで実行すると、呼び出すことができません。

これが実現できなかった場合、おそらく1つの方法は、すべての演算子をカスタム関数に置き換えることです。

0 投票する
2 に答える
476 参照

c++ - QScript の問題

このコードを機能させようとしているのは一日中です。QScriptヘルプ ページに示されているのと同じコードである必要がありますが、残念ながらまったく機能しません。

JavaScriptで次のコードを評価しようとすると

私は取得する必要があります:

代わりに、私が実際に取得するのは、toString 関数 (おそらく Object.toString 関数を呼び出している) からの白い文字列と、「Interpreter Error: line 2: TypeError: Result of expression 'p.myPrint' [undefined] is not a function. 」myPrint からのエラー メッセージ。ドキュメンテーションのページを文字通りたどろうとしても、2 つの関数を Person プロトタイプに正しく接続できなかったと思います。ありがとう!

0 投票する
2 に答える
2624 参照

c++ - QtScript にエクスポートされた関数でスローされた C++ 例外の処理

ユーザーがその機能にアクセスするための代替手段として、アプリケーションで Qt スクリプト エンジンを使用しています。そのため、いくつかの C++ クラスを Qt ScriptEngine にエクスポートします。これは、アプリケーションへのインターフェイスとして機能します。問題は、これらの C++ クラスが例外をスローする可能性があることです。

独自のスレッドで実行されている「ScriptInterface」クラスがあり、スクリプトを処理するためのリクエストをリッスンしています。そのため、ユーザーのスクリプトを評価するときは、例外を処理するために try/catch ブロックを前後に配置し、アプリケーションのコンソールにエラーを出力します。

これは Windows では完全に機能しますが、Linux では機能しません。プログラムは次のメッセージで終了します。

例外がイベント ハンドラーにバブルアップしたためだと思いました (スクリプト エンジンはシグナルを使用して、エクスポートされたクラスの関数を呼び出すため)、そこで例外を処理するために QApplication::notify を再実装しました。つかまった。

私の質問は、根本的に間違ったことをしているのでしょうか? また、別の方法として、C++ クラス内から明示的にスクリプト例外をスローすることは可能ですか?

前もって感謝します

編集: catch(...) ステートメントを含むように説明を修正しました。

更新(解決策):受け入れられた回答で概説されているものと同様の戦略に従って、この問題を「修正」しました。Linuxで例外がキャッチされない理由のソースには行っていませんが(現在、私の疑いは、Linuxでm_engine->evaluateが別のスレッドを生成することです)、意図した例外スローの方法を使い始めましたQtスクリプトで、それはQScriptContext::throwError().

私の関数が次のようになる場合: (ランダムな例)

これが次のようになりました: (戻り値の型に特に注意してください)

では、これらのスクリプト エラーはどこで処理すればよいのでしょうか。を呼び出した後、QScriptEngine::evaluate()でキャッチされていない例外があるかどうかを確認しQScriptEngine::hasUncaughtException()、 でエラー オブジェクトを取得するとuncaughtException()、エラーが発生したスクリプトのメッセージ、トレース、および行番号が表示されます。

これが誰かを助けることを願っています!

0 投票する
1 に答える
695 参照

c++ - QtScriptからC++へのカスタムオブジェクトの受け渡し中にエラーが発生しました

プロトタイプを介してQtScriptで利用できるカスタムクラスを作成しました。また、QtScriptで生成されたカスタムクラスを印刷するために使用する必要がある別のグローバルクラスも利用できます。

これは私のカスタムクラスです(非常に単純です;)):

これは私が使用しているプロトタイプです:

セッター/ゲッターは、qscriptvalue_cast(QScriptable :: thisObject());を介して対応するメッセージオブジェクトを変更/出力するだけです。

これで、私のスクリプトは次のようになります。

したがって、スクリプトは正常にコンパイルされ、print()コマンドは正常に動作し、5を出力します。しかし、問題は私のGlobalObjectのsendMessage関数です。

このコードは常に「[メッセージ]00」を出力します。

MessageAnalysisは、QtScriptの「GlobalObject」として登録されています。また、メッセージとメッセージ*をメタタイプとして登録し、コンストラクター、プロトタイプ、その他すべてを登録しました。これはうまくいくようです。

QtScriptで値が変更されたのに、C ++関数からアクセスできない理由を誰かが知っていますか?または私が間違っていることは何ですか?

0 投票する
2 に答える
622 参照

javascript - JavaScript でのコンストラクターの連鎖

JavaScript である種のクラス階層を実装しようとしています。プロトタイプ チェーンは理解できたと思いますが、コンストラクター チェーンを整理する必要があります。David Flanagan's Definitive Guideに従って、私は書きました

whereBaseClass()は C++ で記述された私のネイティブ関数です (私はQtScriptを使用しています)。私の問題はBaseClass()、コンストラクターとしてではなく、関数として呼び出されることです。

BaseClass()常にコンストラクターとして動作するようにコーディングできますが、呼び出されます。しかし、いつの日かユーザーの 1 人が忘れnew て書き込んでしまうのではないかと心配しています。

このような状況ではBaseClass()、グローバル オブジェクトを初期化するよりも賢明なことをしたいと思います。例えば:

しかし、コンストラクターの連鎖は失敗します!

コンストラクターをチェーンして、BaseClass() 実際にコンストラクターとして呼び出す方法はありますか? それとも、決して忘れないようにユーザーを教育する必要がありnewますか? 現在、上記のテストを次のように置き換えたいと思っています。

しかし、これを処理するためのよりクリーンな方法があるのだろうか。

ありがとう!

0 投票する
1 に答える
1620 参照

c++ - QtScriptから渡された可変数の引数を受け入れるC++メソッドを設計します

私はQtScriptを学び、いくつかの簡単な例を書きました。引数を単純型に制限すると、マッピングは簡単になります。

QtScriptからC++クラスに可変数の引数を渡すことができるようにしたいと思います。

C ++実装でメソッドを宣言する方法は?