qt - 通常のパブリックメソッドをQtScriptで利用できるようにする方法

qt qtscript

私のQtアプリケーションでは、ダイアログのすべてのコントロールにQtScriptを使用したスクリプトからアクセスできます。
これを行うには、次のようにQScriptEngineのnewQObjectメソッドを使用します。

QScriptValue btn = scriptEngine->newQObject(okBtn, QScriptEngine::QtOwnership);
controls.setProperty("okButton", btn, QScriptValue::ReadOnly);


例えば。スクリプトでこれを行うことができます:

dialog.controls.okButton.setEnabled(false);


これは、公開されたコントロール(okButton)の呼び出されたメソッド(setEnabled)がオブジェクトクラスでパブリックスロットとしてマークされている限り、正常に機能します。残念ながら、スクリプトから呼び出せるメソッドの多くは、通常のパブリックスコープでのみ定義されています。

これを解決する1つの方法は、パブリックスロットとしてこれらのメソッドをオーバーライドする各Qt UI要素から新しいクラスを派生させることです。しかし、これはコーディングとメンテナンスに大きなオーバーヘッドを意味するため、この状況では望ましくありません。

デフォルトで通常のパブリック関数を使用可能にするようにスクリプトエンジンに指示する方法はありますか?
答え
Qt docによれば、パブリックメソッドをスクリプトにアクセスできるようにする方法は他にもあります(パブリックスロットとして宣言する以外に)。メソッド宣言の前にQ_INVOKABLEキーワードを記述します。

 class Window : public QWidget
 {
     Q_OBJECT

 public:
     Window();
     void normalMethod();
     Q_INVOKABLE void invokableMethod();
 };
関連記事

qt - これら2つのOpenSSL生成方法の違い

multithreading - QGLWidgetのpaintGL()メソッドはどのQtスレッドから呼び出されましたか?

c++ - Qt:プロジェクトにネイティブOS固有のコードを追加する

qt - QTabBar要素のスタイリング::タブでスタイルが失われる

qt - WindowsでSymbian開発用にQt SDKをセットアップする方法

c++ - Qtで、モデルからリストビューのアイテムの背景色をリセットするにはどうすればよいですか?

qt - QToolbarフォースシュリンク

c++ - Qt:カスタムウィジェットの画像リソースを適切に保存する

qt - QWidgetでアルファ透明マスクを使用していますか?

linux - Qt子プロセスを閉じて、子プロセスにクリーンアップコードを実行させるにはどうすればよいですか?