Как сделать обычные публичные методы доступными в QtScript - PullRequest
2 голосов
/ 20 октября 2011

В моем приложении Qt все элементы управления диалогового окна доступны для сценариев, использующих QtScript.Для этого я использую метод newQObject QScriptEngine, например:

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

Например, теперь я могу сделать это в скрипте:

dialog.controls.okButton.setEnabled(false);

Это прекрасно работает, насколько вызванный метод( setEnabled ) опубликованного элемента управления ( okButton ) помечается как открытый слот в классе объектов.К сожалению, многие из методов, которые я хочу вызывать из скрипта, определены только в обычной public scope.

Один из способов решить эту проблему - получить новый класс из каждого пользовательского интерфейса Qt.элемент, который переопределяет эти методы в качестве открытых слотов.Но это подразумевает большие накладные расходы на кодирование и обслуживание, что нежелательно в этой ситуации.

Есть ли способ указать обработчику сценариев сделать обычные общедоступные функции доступными по умолчанию?

Ответы [ 2 ]

2 голосов
/ 21 октября 2011

Существует другой способ сделать общедоступные методы доступными для скрипта (помимо объявления их в качестве открытых слотов), согласно Qt doc: напишите ключевое слово Q_INVOKABLE перед объявлением метода:

 class Window : public QWidget
 {
     Q_OBJECT

 public:
     Window();
     void normalMethod();
     Q_INVOKABLE void invokableMethod();
 };
0 голосов
/ 20 октября 2011

Это должен быть слот, это сложное требование, чтобы ваши функции были доступны движку сценариев. Qt делает некоторые дополнительные мета-объекты для слотов, что позволяет получить к ним доступ.

Есть ли причина, по которой вы не можете просто сделать функции, которые вы также хотите вызывать, слотами?

...