Russian Qt Forum
Ноябрь 25, 2024, 03:43 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как добавить функцию-член класса в QScriptEngine  (Прочитано 2443 раз)
Sacha_D
Гость
« : Апрель 19, 2013, 15:40 »

Здравствуйте.
Мне нужно додавить функцию-член класса в QScriptEngine.
Как это сделать правильно?

.h файл
Код:
class MainWindow : public QMainWindow
{
    Q_OBJECT
private:
     QScriptEngine scriptEngine;
 
      void setupFirst();
public:
     QScriptValue appendDevice(QScriptContext *ctx, QScriptEngine *eng);
};

.cpp файл

Код:

void MainWindow::setupFirst() {
 
this->scriptEngine.globalObject().setProperty("appendDevice",
                                                  this->scriptEngine.newFunction(
                                                      boost::bind(&MainWindow::appendDevice, this, _1, _2),
                                                      3)
                                              ); // Как правильно?
}

QScriptValue MainWindow::appendDevice(QScriptContext *ctx, QScriptEngine *eng){

    QString functionDescription = tr("Формат функции ") + "bool appendDevice(QString name, int address, const QString portName," +
            "const int rate = 115200," +
            "const QString config = \"\");";
    if (ctx->argumentCount() < 3){
        return ctx->throwError(QScriptContext::SyntaxError, tr("Недостаточно аргументов. ") + functionDescription);
    }
    QString name;
    int address;
    QString portName;
    if (ctx->argumentCount() >= 3){
        if (ctx->argument(0).isString()) {
            name = ctx->argument(0).toString();
        }
        else {
            return ctx->throwError(QScriptContext::TypeError, tr("Аргумент [0] (Имя устройства) должен быть строкой. ") + functionDescription);
        }

        if (ctx->argument(1).isNumber()) {
            address = ctx->argument(1).toInt32();
        }
        else {
            throw ctx->throwError(QScriptContext::TypeError, tr("Аргумент [1] (Адрес устройства) должен быть числом. ") + functionDescription);
        }

        if (ctx->argument(2).isString()) {
            portName = ctx->argument(2).toString();
        }
        else {
            throw ctx->throwError(QScriptContext::TypeError, tr("Аргумент [2] (порт устройства) должен быть строкой. ") + functionDescription);
        }
    }
    int rate  = QExtSerialPortAux::rateToInt(QExtSerialPortAux::defaultRate);
    QString config;

    if (ctx->argumentCount() >= 4){
        if (ctx->argument(3).isNumber()) {
            rate = ctx->argument(3).toInt32();
        }
        else {
            throw ctx->throwError(QScriptContext::TypeError, tr("Аргумент [3] (Скорость порта устройства) должен быть числом. ") + functionDescription);
        }
    }
    if (ctx->argumentCount() >= 5){
        if (ctx->argument(4).isString()) {
            config = ctx->argument(4).toString();
        }
        else {
            throw ctx->throwError(QScriptContext::TypeError, tr("Аргумент [4] (Конфигурация устройства) должен быть строкой. ") + functionDescription);
        }
    }

    return appendDeviceFromScript(name, address, portName, rate, config);
}

Благодарю Вас за Ваши ответы.
Записан
dio
Гость
« Ответ #1 : Апрель 19, 2013, 16:16 »

Как вариант, передать в scriptEngine объект.
см. http://qt-project.org/doc/qt-4.8/qscriptengine.html#qobject-integration
Записан
Sacha_D
Гость
« Ответ #2 : Апрель 22, 2013, 09:17 »

Благодарю. Так и сделал.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.067 секунд. Запросов: 21.