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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Доступность объектов приложения для QtScript  (Прочитано 7202 раз)
alexus_ru
Гость
« : Сентябрь 26, 2008, 03:55 »

Всем доброго времени суток..скорее всего ночи)
Никак не могу справиться с доступом скриптами к объектам программы.
Возможно допускаю какую-то глупость, которую не вижу по причине работы с QT всего 3 дня.

Есть Майн
Код:
#include <QtGui/QApplication>
#include "myexample3.h"

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyExample3 w;
w.show();
a.connect(&a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()));
return a.exec();
}

Есть код формы
Код:
#include "myexample3.h"
#include "testdialog.h"
#include <QtScript\QtScript>
 #include <QFile>
 #include <stdio.h>

MyExample3::MyExample3(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
QFile scriptFile("Script.txt");
QFile ResFile("Res.txt");

ui.setupUi(this);
QString script;
if (scriptFile.exists())
{
scriptFile.open(QIODevice::ReadOnly);
script.append(scriptFile.readAll());
scriptFile.close();
}
engine = new QScriptEngine();

QScriptValue objectWnd = engine->newQObject(this);
engine->globalObject().setProperty("MainWindow", objectWnd);

QScriptValue result = engine->evaluate(script);

if (result.isError())
{
     if (!ResFile.open(QIODevice::WriteOnly | QIODevice::Text))
         return;
     QTextStream out(&ResFile);
     out << "Script error:" << result.toString();
ResFile.close();
}
else
{
if (!ResFile.open(QIODevice::WriteOnly | QIODevice::Text))
         return;
     QTextStream out(&ResFile);
     out << "Script no error, result is:" << result.toString();
ResFile.close();

}

}

MyExample3::~MyExample3()
{

}
Здесь подготавливаю все для скрипта.

И заголовок
Код:
#ifndef MYEXAMPLE3_H
#define MYEXAMPLE3_H

#include <QtGui/QMainWindow>
#include "ui_myexample3.h"
#include <QtScript\QtScript>

class MyExample3 : public QMainWindow
{
Q_OBJECT

public:
MyExample3(QWidget *parent = 0, Qt::WFlags flags = 0);
~MyExample3();

private:
Ui::MyExample3Class ui;
QScriptEngine * engine;

private slots:
void on_pushButton_2_clicked();
};

#endif // MYEXAMPLE3_H

в общем работает только такой скрипт
MainWindow.windowTitle = "Ля ля ля тополя";
Больше ни к чму пробиться никак не могу..есть например на форме
QLineEdit с именем lineedit
вот как к нему пробиться, хотя бы просто поменять текст
Например на такой скрипт
MainWindow.lineedit.text= "test";
Говорит Script error:TypeError: invalid assignment lvalue
Хотя как я понимаю - он в принципе не видит даже этот объект

В общем, подскажите Улыбающийся Надо очень
Записан
yoyo
Гость
« Ответ #1 : Октябрь 01, 2008, 08:39 »

lineedit у тебя даже не в паблик.
Код:
class MyExample3 : public QMainWindow
{
  ...
public slots:
  inline void setLineEditText(QString &txt) { что-то-вроде_lineedit.text = txt; }
  ...
}

Теперь MainWindow.setLineEditText("test");
Записан
Nimbus
Гость
« Ответ #2 : Март 17, 2010, 17:31 »

У меня несколько обратный вопрос Улыбающийся
Вот допустим, у меня передан в скрипт объект виджета, на котором уже проинициализирован UI.
Допустим, виджет задан в скрипте как Form. На этой форме лежит lineEdit, который доступен в скрипте по ссылке Form.lineEdit.
Так вот. Как передать приложению указатель на lineEdit через скрипт? То есть, (дальше развиваю мысль) в скрипт ещё передан объект myObject некоторого класса MyObject, наследованного от QObject, естественно. У этого класса есть слот setText,  имеющий следующее описание:
Код
C++ (Qt)
public slots:
   void setText(QLineEdit *lineEdit) {
       lineEdit->setText("Bla-bla-bla...");
   }
   //Или
   /*
   void setText(QLineEdit &lineEdit) {
       lineEdit.setText("Bla-bla-bla...");
   }
   */

 
То есть этот слот должен вызываться из скрипта следующим образом:
Код:
myObject.setText(Form.lineEdit);
Но вот, движку скрипта это не нравится Улыбающийся Ругается, что не может привести данный объект ни к одному, ни к другому "типу". То есть ни к QLineEdit*, ни к QLineEdit&.
Как разруливать данную ситуацию?

P. S. Нужно именно передать объект (или указатель на объект) приложению из скрипта.
« Последнее редактирование: Март 17, 2010, 17:46 от Nimbus » Записан
Akaiten
Гость
« Ответ #3 : Март 18, 2010, 10:19 »

Попробуй сделать как нибудь так:
Код
C++ (Qt)
public slots:
   void setText(const QScriptValue &object) {
       QLineEdit *lineEdit = qobject_cast<QLineEdit *>(object.toQObject());
       if (lineEdit) lineEdit->setText("Bla-bla-bla...");
   }
 
Записан
Nimbus
Гость
« Ответ #4 : Март 18, 2010, 11:15 »

Попробуй сделать как нибудь так:
Код
C++ (Qt)
public slots:
   void setText(const QScriptValue &object) {
       QLineEdit *lineEdit = qobject_cast<QLineEdit *>(object.toQObject());
       if (lineEdit) lineEdit->setText("Bla-bla-bla...");
   }
 
Оп. Работает. Благодарю, добрый человек Подмигивающий
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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