Russian Qt Forum

Qt => Qt Script, QtWebKit => Тема начата: alexus_ru от Сентябрь 26, 2008, 03:55



Название: Доступность объектов приложения для QtScript
Отправлено: 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
Хотя как я понимаю - он в принципе не видит даже этот объект

В общем, подскажите :) Надо очень


Название: Re: Доступность объектов приложения для QtScript
Отправлено: yoyo от Октябрь 01, 2008, 08:39
lineedit у тебя даже не в паблик.
Код:
class MyExample3 : public QMainWindow
{
  ...
public slots:
  inline void setLineEditText(QString &txt) { что-то-вроде_lineedit.text = txt; }
  ...
}

Теперь MainWindow.setLineEditText("test");


Название: Re: Доступность объектов приложения для QtScript
Отправлено: Nimbus от Март 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. Нужно именно передать объект (или указатель на объект) приложению из скрипта.


Название: Re: Доступность объектов приложения для QtScript
Отправлено: Akaiten от Март 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...");
   }
 


Название: Re: Доступность объектов приложения для QtScript
Отправлено: Nimbus от Март 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...");
   }
 
Оп. Работает. Благодарю, добрый человек ;)