Добрый день всем!
Делаю "обёртку" для класса QDialog, которая делает некоторые функции этого класса доступными в скриптах. Споткнулся на публичной функции QString windowTitle(). Скрипт в упор не хочет его видеть. Если слегка изменить название функции, то работает прекрасно.
class MyDialog : public QDialog {
Q_OBJECT
public:
explicit MyDialog(QWidget *parent = 0);
Q_INVOKABLE void setWindowTitle(QString title) { QDialog::setWindowTitle(title); } // работает
Q_INVOKABLE QString windowTitle() { return QDialog::windowTitle(); } // НЕ РАБОТАЕТ
Q_INVOKABLE QString myWindowTitle() { return QDialog::windowTitle(); } // с измененным названием работает
};
Ну, во первых, void setWindowTitle(const QString &title);. Иначе вы скрываете уже существующую функцию. И доступ до неё из скриптов должен быть по умолчанию, т.к. это слот.
Попробуйте так,
class MyDialog : public QDialog {
Q_OBJECT
Q_PROPERTY(QString windowTitle READ windowTitle WRITE setWindowTitle SCRIPTABLE true)
public:
explicit MyDialog(QWidget *parent = 0);
QString windowTitle() { return QDialog::windowTitle(); }
};
QScriptEngine *engine = new QScriptEngine(this);
QDialog *w= new QDialog(this);
QScriptValue scriptDialog = engine->newQObject(w);
engine->globalObject().setProperty("dialog", scriptDialog);
engine->evaluate("dialog.windowTitle = \"Title\"");
qDebug() << scriptDialog.property("windowTitle").toString(); // -> "Title"
scriptDialog.property("show").call();
Спасибо за ответ. Действительно, все оказалось просто - нужно было в скрипте обращаться к windowTitle() как к свойству, а не как к функции. Функцию setWindowsTitle() убрал в дочернем классе. Похоже, что вообще нет необходимости создавать обертку для класса QDialog. Сейчас попробовал - работает и без нее.
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)