2

私の 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 要素から新しいクラスを派生させ、これらのメソッドをパブリック スロットとしてオーバーライドすることです。しかし、これはコーディングとメンテナンスの大きなオーバーヘッドを意味し、この状況では望ましくありません。

スクリプト エンジンに、既定で通常のパブリック関数を利用可能にするように指示する方法はありますか?

4

2 に答える 2

2

Qt doc によると、(パブリック スロットとして宣言する以外に) スクリプトからパブリック メソッドにアクセスできるようにする別の方法があります。Q_INVOKABLEメソッド宣言の前にキーワードを記述します。

 class Window : public QWidget
 {
     Q_OBJECT

 public:
     Window();
     void normalMethod();
     Q_INVOKABLE void invokableMethod();
 };
于 2011-10-20T20:06:44.403 に答える
0

これはスロットでなければなりません。これは、関数をスクリプト エンジンに公開するための難しい要件です。Qt は、スロットにアクセスできるようにするために、スロットに追加のメタオブジェクト処理を行います。

スロットを呼び出したい関数だけを作成できない理由はありますか?

于 2011-10-20T16:47:28.417 に答える