crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Нет доступа к функции класса из скриптов
mva
  опции профиля:
сообщение 19.12.2010, 16:22
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 104
Регистрация: 15.3.2009
Из: Киров
Пользователь №: 615

Спасибо сказали: 3 раз(а)




Репутация:   0  


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

Делаю "обёртку" для класса 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
Сообщение #2


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Ну, во первых, 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
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 104
Регистрация: 15.3.2009
Из: Киров
Пользователь №: 615

Спасибо сказали: 3 раз(а)




Репутация:   0  


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

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.3.2024, 18:51