Как сделать обычные публичные методы доступными в QtScript
В моем приложении Qt все элементы управления диалогового окна доступны для сценариев, использующих QtScript. Для этого я использую метод newQObject класса QScriptEngine, например:
QScriptValue btn = scriptEngine->newQObject(okBtn, QScriptEngine::QtOwnership);
controls.setProperty("okButton", btn, QScriptValue::ReadOnly);
Например, теперь я могу сделать это в сценарии:
dialog.controls.okButton.setEnabled(false);
Это прекрасно работает, если вызванный метод (setEnabled) опубликованного элемента управления (okButton) помечен как открытый слот в классе объектов. К сожалению, многие методы, которые я хочу вызывать из скрипта, определены только в обычной общедоступной области.
Одним из способов решения этой проблемы было бы получение нового класса из каждого элемента пользовательского интерфейса Qt, который переопределяет эти методы как открытые слоты. Но это подразумевает большие накладные расходы на кодирование и обслуживание, что нежелательно в этой ситуации.
Есть ли способ указать обработчику сценариев сделать обычные общедоступные функции доступными по умолчанию?
2 ответа
Есть другой способ сделать общедоступные методы доступными для скрипта (помимо объявления их в качестве открытых слотов), в соответствии с Qt doc: напишите Q_INVOKABLE
Ключевое слово перед объявлением метода:
class Window : public QWidget
{
Q_OBJECT
public:
Window();
void normalMethod();
Q_INVOKABLE void invokableMethod();
};
Это должен быть слот, это сложное требование, чтобы ваши функции были доступны скриптовому движку. Qt делает некоторые дополнительные мета-объекты для слотов, что позволяет получить к ним доступ.
Есть ли причина, по которой вы не можете просто сделать функции, которые вы хотите вызывать, слотами?