Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Script. Интеграция WebKit _ Нет доступа к функции класса из скриптов

Автор: mva 19.12.2010, 16:22

Добрый день всем!

Делаю "обёртку" для класса 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(); }              // с измененным названием работает
};


Что не так?


Автор: igor_bogomolov 19.12.2010, 18:37

Ну, во первых, 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 есть, всё нормально работает

Автор: mva 19.12.2010, 23:33

Спасибо за ответ. Действительно, все оказалось просто - нужно было в скрипте обращаться к windowTitle() как к свойству, а не как к функции. Функцию setWindowsTitle() убрал в дочернем классе. Похоже, что вообще нет необходимости создавать обертку для класса QDialog. Сейчас попробовал - работает и без нее.

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)