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

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

Форум на CrossPlatform.RU _ Qt Script. Интеграция WebKit _ data() MVC из скрипта возможно ?

Автор: JohnZ 3.7.2017, 17:30

Со старта прошу не пинать за то что ( возможно !) не в том разделе задаю вопрос, т.к. вероятнее всего это из раздела MVC.

Задача следующая, - есть класс формы с указателем на её модельку ...

Раскрывающийся текст

class fpTForma : public QDialog
{
Q_OBJECT

public:

Q_INVOKABLE fpTForma(int id, MainWindow *parent = 0, Qt::WindowFlags f = 0);
~fpTForma();

public slots:

Q_INVOKABLE bool initForm(int fpCmd = 0);
Q_INVOKABLE MainWindow *getParent() { return mParent; }
Q_INVOKABLE int getCurRow() { return curIndex.isValid() ? curIndex.row() : -1; }
Q_INVOKABLE QVariant getCurValue(int col);
Q_INVOKABLE QVariant getCurValue(const QString & name);
Q_INVOKABLE bool match(int col, QVariant value);
Q_INVOKABLE bool match2(int col, int col1, QVariant value, QVariant value1);
Q_INVOKABLE void refresh() { model->select(); }
Q_INVOKABLE void setSort(int colnum, int order, bool sel = false);
Q_INVOKABLE int exec();

// .... etc

protected slots:

void closeEvent(QCloseEvent *event);
void keyPressEvent (QKeyEvent *event);
void setCurrentModelIndex(const QModelIndex &idx);

// .... etc

protected:

QScriptEngine *engine; // ссылка на интерпретатор скрипта.
MainWindow *mParent;
QTableView *viewChild; // QTableView на этой форме

fpTableModel *model; // Форма работает с Таблицей !!!

QModelIndex curIndex;
QSqlRecord curRecord;
QDataWidgetMapper *dataMapper;

// .... etc
};


Он фактически выполняет роль Контроллера в MVC. В скрипте эти объекты видны как frmXXX.
Задача состоит в том, что-бы из скрипта "прицепить" к его модели ф-цию data() для подмены колонок в View !?
Вроде-бы когда-то видел такое в и-нете, но не уверен. Возможно-ли такое сделать ? Подскажите PLZ ...

Автор: lanz 3.7.2017, 18:39

Плюсовые объекты из скрипта менять не получится кмк, я бы сделал
1. Прокси модель с полем - коллбэком, которое можно выставить из скрипта.
2. data в этой модели дергает коллбэк и если тот возвращает нормальное значение, то оно и возвращается
3. если коллбэк возвращает undef, то дергается data проксируемой модели.

Автор: JohnZ 4.7.2017, 11:36

Цитата(lanz @ 3.7.2017, 18:39) *
Плюсовые объекты из скрипта менять не получится кмк, я бы сделал
1. Прокси модель с полем - коллбэком, которое можно выставить из скрипта.

А сама fpTForma может быть псевдо-Прокси ?
Дело в том, что форм у меня 3 шт ( Query Table и RTable ) и соответственно 3 модели,
и к каждой из них "рисовать" проксю невыгодно, т.к. эта-же data() может "состоятся" всего
1-2 раза на весь проект, а данные _всегда_ будут летать через проксю на всех создаваемых объектах ... :(

ВотЪ если-бы можно было-бы получить указатель на скриптовую ф-цию, и если он не NULL, отдать его модельке
на этапе init или create !? ;)
Цитата
2. data в этой модели дергает коллбэк и если тот возвращает нормальное значение, то оно и возвращается
3. если коллбэк возвращает undef, то дергается data проксируемой модели.

Именно так только нужно немного изменить схему, если можно, - дергать data из скрипта, если она существует !?
Так можно как-ни-ить сделать ?

Автор: lanz 4.7.2017, 12:17

Цитата(JohnZ @ 4.7.2017, 11:36) *
А сама fpTForma может быть псевдо-Прокси ?

Может, но это нарушение SRP, к тому же три раза придется писать один и тот же код :)
Цитата(JohnZ @ 4.7.2017, 11:36) *
и к каждой из них "рисовать" проксю невыгодно

Не надо к каждой, на то она и прокси чтобы проксировать любую модель. Те, которые нужно, надо в нее оборачивать, те которые нет, нет.
Цитата(JohnZ @ 4.7.2017, 11:36) *
1-2 раза на весь проект, а данные _всегда_ будут летать через проксю на всех создаваемых объектах ...

Вовсе нет, во первых - можно не все модели оборачивать, во вторых можно(нужно!) пренебречь С++ оверхедом, а вызывать скрипт только для определенных колонок, ну и т.п.

Цитата(JohnZ @ 4.7.2017, 11:36) *
ВотЪ если-бы можно было-бы получить указатель на скриптовую ф-цию, и если он не NULL, отдать его модельке
на этапе init или create !?

Не вижу проблемы так сделать, ведь функционал известен. Тут компромисс между гибкостью и скоростью - для гибкости все формы должны поддерживать скрипт data, для скорости - не все :)
Цитата(JohnZ @ 4.7.2017, 11:36) *
Именно так только нужно немного изменить схему, если можно, - дергать data из скрипта, если она существует !?

Можно в коллбэк передать указатель на нижележащую модель, но... meh, на этом этапе уже проще писать модель полностью скриптом :)

Автор: JohnZ 4.7.2017, 13:35

Цитата(lanz @ 4.7.2017, 12:17) *
Цитата(JohnZ @ 4.7.2017, 11:36)
А сама fpTForma может быть псевдо-Прокси ?
Может, но это нарушение SRP, к тому же три раза придется писать один и тот же код
Цитата(JohnZ @ 4.7.2017, 11:36)
и к каждой из них "рисовать" проксю невыгодно
Не надо к каждой, на то она и прокси чтобы проксировать любую модель. Те, которые нужно, надо в нее оборачивать, те которые нет, нет.

Дык по-любому все объекты получатся проксируемыми, или я чего-то не догоняю ... :(
... и ХТО такой SRP ? Просвети plz, если можно ссыль ... ?
У меня действительно в моделях и формах некоторые куски кода дублированы, ввиду видимо неправильного изначального
проектирования. Делалось для проверки идеи по-быстрому, ну а далее уже сложилось так исторически :-)
Да и технически честно говоря я не предтавляю как эту схему можно было реализовать иначе, -
все SQL класы ( Query Table и RTable ) имеют общего предка и "растут" по-цепочке друг из друга. Писать вирт-й общий класс
и опять реализовывать то что в QT уже сделано (SQL-ные класы) по-крайней мере глупо. Вот если-бы они "росли" из одного
предка, тогда можно было-бы замутить виртуальный класс с общим кодом, а так xez :-( :-)
Сейчас эти объекты создаются через селектор в зависимости от условия прописанного в скрипте.
В основном это потомок QSQLTable ...

Цитата
Цитата(JohnZ @ 4.7.2017, 11:36)
1-2 раза на весь проект, а данные _всегда_ будут летать через проксю на всех создаваемых объектах ...
Вовсе нет, во первых - можно не все модели оборачивать, во вторых можно(нужно!) пренебречь С++ оверхедом, а вызывать скрипт только для определенных колонок, ну и т.п.

Дык какая колонка чего должна показать и должна "разобраться" data() !? ... или я тебя не правильно понял :-(
Цитата
Цитата(JohnZ @ 4.7.2017, 11:36)
ВотЪ если-бы можно было-бы получить указатель на скриптовую ф-цию, и если он не NULL, отдать его модельке
на этапе init или create !?
Не вижу проблемы так сделать, ведь функционал известен. Тут компромисс между гибкостью и скоростью - для гибкости все формы должны поддерживать скрипт data, для скорости - не все

LANZ - а можно по-подробнее сей момент "разжевать" ???
Цитата
Цитата(JohnZ @ 4.7.2017, 11:36)
Именно так только нужно немного изменить схему, если можно, - дергать data из скрипта, если она существует !?
Можно в коллбэк передать указатель на нижележащую модель, но... meh, на этом этапе уже проще писать модель полностью скриптом

... и здесь, и если можно псевдо-кодом ? Заранее БлагоДарен !!!

Автор: lanz 5.7.2017, 11:09

См. приложение.

Цитата
Дык по-любому все объекты получатся проксируемыми, или я чего-то не догоняю ... :(

Только те, у которых используется прокся :)
Цитата
... и ХТО такой SRP ? Просвети plz, если можно ссыль ... ?

Single Responsibility Principle из SOLID
https://en.wikipedia.org/wiki/SOLID_(object-oriented_design)
Цитата
Вот если-бы они "росли"

Prefer composition to inheritance :)
Цитата
Дык какая колонка чего должна показать и должна "разобраться" data() !? ... или я тебя не правильно понял :-(

В ScripProxy можно завести другие проперти, которые позволят фильтровать уже в ScripProxy::data, не дергая скрипт, например если скрипт умеет обрабатывать только 1 колонку, то можно для остальных и не вызывать коллбэк.
Цитата
LANZ - а можно по-подробнее сей момент "разжевать" ???

Тот же пример что выше - if по номеру колонки можно сделать в скрипте, тогда скрипт будет вызываться для всех колонок. А можно сделать в ScriptProxy::data и сравнивать с вынесенным property. Тогда скрипт будет вызываться только для одной колонки.
Цитата
и здесь, и если можно псевдо-кодом ?

Вроде того:
function data(row, col, model) { return model.data() }

args << engine->newQObject(sourceModel())


 proxies.tar.gz ( 1.19 килобайт ) : 293
 

Автор: JohnZ 5.7.2017, 15:07

Цитата(lanz @ 5.7.2017, 11:09) *
См. приложение.

БлагоДарю !!!
Цитата
Вот если-бы они "росли"

Prefer composition to inheritance

Sorry, не понялЪ про composition ... :(
... или здесь подразумевается множеств-ное наследование ?

Цитата
Дык какая колонка чего должна показать и должна "разобраться" data() !? ... или я тебя не правильно понял :-(

В ScripProxy можно завести другие проперти, которые позволят фильтровать уже в ScripProxy::data, не дергая
скрипт, например если скрипт умеет обрабатывать только 1 колонку, то можно для остальных и не вызывать коллбэк.

О том что "скрипт умеет обрабатывать только 1 колонку" нужно выставить _предопределённые_ признаки
в пропертях и опрашивать их из С-шного кода в проксе ?

Цитата
Тот же пример что выше - if по номеру колонки можно сделать в скрипте, тогда скрипт будет вызываться для
всех колонок. А можно сделать в ScriptProxy::data и сравнивать с вынесенным property. Тогда скрипт будет
вызываться только для одной колонки.

Так точно ! Именно этот случай, - в БД "лежат" 5 double, параметры для тех-самых ф-ций расчёта с динамич-м
именем в переменной :), и показать их надо одной строкой БЕЗ нулевых значений, иначе у бух-а в глазах рябить
будет от нулей :) Без data(...) в скрипте сия траблема не решается, или я его не вижу ... :(

Цитата
Вроде того:
function data(row, col, model) { return model.data() }
args << engine->newQObject(sourceModel())

А как СВОЮ модель "объяснить" скрипту ? Сколько я ни пытался, не получилось :(
Он хочет видеть QOject, а у меня в модели его нет, а оборачивать всю(е) модель(и) в QOject гиморно ... :(

Автор: lanz 5.7.2017, 17:18

Цитата(JohnZ @ 5.7.2017, 15:07) *
... или здесь подразумевается множеств-ное наследование ?

https://en.wikipedia.org/wiki/Composition_over_inheritance
Цитата(JohnZ @ 5.7.2017, 15:07) *
выставить _предопределённые_ признаки
в пропертях и опрашивать их из С-шного кода в проксе ?

Да, например так.
Цитата(JohnZ @ 5.7.2017, 15:07) *
А как СВОЮ модель "объяснить" скрипту ?

Если своя модель наследует от какой-либо модели (QAbstractXxxModel) то она и так QObject. Если нет, то это хороший повод ее отнаследовать, т.к. можно будет использовать со стандартными вью/проксями и т.п.


Цитата(JohnZ @ 5.7.2017, 15:07) *
показать их надо одной строкой БЕЗ нулевых значений

в сишной data проверять на 0?

Автор: JohnZ 5.7.2017, 22:15

Цитата(lanz @ 5.7.2017, 17:18) *
Цитата(JohnZ @ 5.7.2017, 15:07)
... или здесь подразумевается множеств-ное наследование ?
https://en.wikipedia.org/wiki/Composition_over_inheritance

Неа, не мой случай.
Или моя твоя не понялЪ или наоборот :)
Они-ж и так в одной цепи наследования, с добавлением / изм-ем функционала, и я ещё им свой навешиваю ...

Цитата
Цитата(JohnZ @ 5.7.2017, 15:07)
выставить _предопределённые_ признаки
в пропертях и опрашивать их из С-шного кода в проксе ?
Да, например так.

!!!

Цитата
Цитата(JohnZ @ 5.7.2017, 15:07)
А как СВОЮ модель "объяснить" скрипту ?
Если своя модель наследует от какой-либо модели (QAbstractXxxModel) то она и так QObject. Если нет, то это хороший повод ее отнаследовать, т.к. можно будет использовать со стандартными вью/проксями и т.п.


Раскрывающийся текст

class fpTableModel : public QSqlTableModel
{
// Q_OBJECT

public:
fpTableModel(fpTForma * parent = 0);
~fpTableModel();

Qt::ItemFlags flags(const QModelIndex &index) const;
// QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;

void refresh() { ;}
bool initModel();
void setTable (int TIdd);
void setFilter(const QString & filter);

void beginInsertRow(const QModelIndex &parent, int row);
void endInsertRow();

protected:

QSqlRecord mRecord; // in Model from Query
QSqlRecord tRecord; // in original Table

private:

fpTForma *fParent;

friend class fpTForma;
};

Если снять rem с Q_OBJECT, НЕ компилится, ошибок на 2 экрана.
Соответственно и скрипту необъяснимо :(
Я вроде-бы уже когда-то об этой проблеме спрашивал, так и не решилось, оставил AS IS ... :(

Цитата
Цитата(JohnZ @ 5.7.2017, 15:07)
показать их надо одной строкой БЕЗ нулевых значений
в сишной data проверять на 0?

Дык Тогда нет смысла в скриптовой data() ?!
В том и смысл, чтобы формирование "уникальных" колонок отдать скрипту.
Т.е. "спастись" от кучи с-шных моделей.
Нужна гибкость и оч-чень желательно не потерять много в скорости !
В сишной data проверить флажок-признак в пропертях, надо-ли вызывать скриптовую data.
Но ведь ей опять-таки понадовится моделька ... :( Или можно как-ни-ить обойтись ?

Автор: lanz 6.7.2017, 9:21

Цитата(JohnZ @ 5.7.2017, 22:15) *
Если снять rem с Q_OBJECT, НЕ компилится, ошибок на 2 экрана.

Надо с этим разобраться, кидай сюда хоть что за ошибки.
Цитата(JohnZ @ 5.7.2017, 22:15) *
Дык Тогда нет смысла в скриптовой data() ?!
В том и смысл, чтобы формирование "уникальных" колонок отдать скрипту.
Т.е. "спастись" от кучи с-шных моделей.
Нужна гибкость и оч-чень желательно не потерять много в скорости !

А в чем проблема с кучей сишных моделей? :)
На самом деле нет разницы где писать - и там и там код придется как то поддерживать и обновлять.
Более того, как ты думаешь насколько часто будет менятся логика убирания лишних нулей? :)

Автор: JohnZ 6.7.2017, 12:06

Цитата(lanz @ 6.7.2017, 9:21) *
Цитата(JohnZ @ 5.7.2017, 22:15)
Если снять rem с Q_OBJECT, НЕ компилится, ошибок на 2 экрана.
Надо с этим разобраться, кидай сюда хоть что за ошибки.


Раскрывающийся текст

tmp/obj/fpquerymodel.o: In function `fpQueryModel':
/home/pi/Work/finpro/fpquerymodel.cpp:15: undefined reference to `vtable for fpQueryModel'
tmp/obj/fpquerymodel.o: In function `~fpQueryModel':
/home/pi/Work/finpro/fpquerymodel.cpp:19: undefined reference to `vtable for fpQueryModel'
tmp/obj/fpquerymodel.o: In function `fpQueryModel::tr(char const*, char const*)':
/home/pi/Work/finpro/fpmodels.h:33: undefined reference to `fpQueryModel::staticMetaObject'
tmp/obj/fptablemodel.o: In function `fpTableModel':
/home/pi/Work/finpro/fptablemodel.cpp:15: undefined reference to `vtable for fpTableModel'
tmp/obj/fptablemodel.o: In function `~fpTableModel':
/home/pi/Work/finpro/fptablemodel.cpp:19: undefined reference to `vtable for fpTableModel'
tmp/obj/fprtablemodel.o: In function `fpRTableModel':
/home/pi/Work/finpro/fprtablemodel.cpp:17: undefined reference to `vtable for fpRTableModel'
tmp/obj/fprtablemodel.o: In function `~fpRTableModel':
/home/pi/Work/finpro/fprtablemodel.cpp:21: undefined reference to `vtable for fpRTableModel'
collect2: ld returned 1 exit status

----------------------------
См. "прицеп" ...


Раньше было поболее ...
Это уже при линковке. Чё с этим делать хз ...
А если заремить Q_OBJECT, линкуется без проблем.
Цитата
Цитата(JohnZ @ 5.7.2017, 22:15)
Дык Тогда нет смысла в скриптовой data() ?!
В том и смысл, чтобы формирование "уникальных" колонок отдать скрипту.
Т.е. "спастись" от кучи с-шных моделей.
Нужна гибкость и оч-чень желательно не потерять много в скорости !
А в чем проблема с кучей сишных моделей?

Дык что-бы иметь одну универсальную, на все случаи ...
Цитата
На самом деле нет разницы где писать - и там и там код придется как то поддерживать и обновлять.

Дык скриптовую поддержку можно отдать "наружу" :) Как в ERP-системах.
Цитата
Более того, как ты думаешь насколько часто будет менятся логика убирания лишних нулей?

Ни разу. В чём подвох ? :)


 

Автор: lanz 6.7.2017, 13:16

Цитата(JohnZ @ 6.7.2017, 12:06) *
Это уже при линковке. Чё с этим делать хз ...

Это распространенная вещь, MOC не находит твой заголовочник.

Проверь что fpmodels.h включен в HEADERS в .pro файле
Попробуй перезапустить qmake (Build->Run qmake)
Пересобери.

Если не поможет, тащи сгенерированный Makefile, будем посмотреть :)
Цитата(JohnZ @ 6.7.2017, 12:06) *
Дык что-бы иметь одну универсальную, на все случаи ...

Так не бывает :lol:
А еще YAGNI ;)

Цитата(JohnZ @ 6.7.2017, 12:06) *
Дык скриптовую поддержку можно отдать "наружу" :) Как в ERP-системах.

Это если есть хорошее API между скриптом и сишной частью, иначе все равно придется лезть в сишный код/дергать тебя.

Цитата(JohnZ @ 6.7.2017, 12:06) *
Ни разу. В чём подвох ? :)

Тогда смысл ее выносить в скрипт? :)

Автор: JohnZ 6.7.2017, 14:25

Цитата(lanz @ 6.7.2017, 13:16) *
Цитата(JohnZ @ 6.7.2017, 12:06)
Это уже при линковке. Чё с этим делать хз ...
Это распространенная вещь, MOC не находит твой заголовочник.

Проверь что fpmodels.h включен в HEADERS в .pro файле
Попробуй перезапустить qmake (Build->Run qmake)
Пересобери.

Если не поможет, тащи сгенерированный Makefile, будем посмотреть

1000 раз пересобирал, не помогало. micro-SSD (Raspberry Pi 2) уже до дыр наверно затёр :)
Сейчас вместо QT-Creatora пересобрал в консоли - ПОЛУЧИЛОСЬ !!!
Затем и из Creatora ПОЛУЧИЛОСЬ !!!
БлагоДарю !!!
Дык теперь модель можно отдать в скрипт ?
Только пока надо придмать как, ведь в JS нет указателей ...
Модель "сидит" в форме, а форма в скрипте видна.

Цитата
Цитата(JohnZ @ 6.7.2017, 12:06)
Дык что-бы иметь одну универсальную, на все случаи ...
Так не бывает
А еще YAGNI

:) Ещё как бывает - MS Access, 1C, Ananas, etc
В (разрабатываемых) ERP системах не-нужный функционал рано или поздно всё-равно понадобится,
и если взять ближайшего предка моего проекта Ananas, (www.ananas.su) то у меня этого функционала значительно
меньше, т.к.MVC (QT4 вместо QT3) который там был недоступен, плюс DataMapper etc :) IMHO

Цитата
Цитата(JohnZ @ 6.7.2017, 12:06)
Дык скриптовую поддержку можно отдать "наружу" Как в ERP-системах.
Это если есть хорошее API между скриптом и сишной частью, иначе все равно придется лезть в сишный код/дергать тебя.

Дык это пока "в коротких штанишках" и нет доков. :)
Будут доки (когда руки дойдут), проблема должна рассосаться ...
Доки писать начал, но как ты понимаешь для програмера писать доки - лучще сразу застрелиться :)
Хотя там особо-то и писать почти нечего, всего 2 объекта Forma и Report, у той-же 1С их около 80 ...
Достигнуто за счёт того, что Forma "умеет" рекурсивно создавать своих потомков и саморегистрироваться
в скриптовой системе...
Цитата
Цитата(JohnZ @ 6.7.2017, 12:06)
Ни разу. В чём подвох ?
Тогда смысл ее выносить в скрипт?

В ВЫНОСЕ в скрипт :) :) :)
Какую колонку (виртуальную) захочешь, такую и СМОЖЕШЬ сделать !

Автор: lanz 6.7.2017, 17:20

Цитата(JohnZ @ 6.7.2017, 14:25) *
Дык теперь модель можно отдать в скрипт ?
Только пока надо придмать как, ведь в JS нет указателей ...

newQObject(model_ptr)
а потом использовать как любое другое QScriptValue


Там где я прикладывал есть несколько вариантов.

Автор: JohnZ 7.7.2017, 11:27

Вот уже почти и добрались до решения проблемы :)

Цитата(lanz @ 6.7.2017, 17:20) *
Цитата(JohnZ @ 6.7.2017, 14:25)
Дык теперь модель можно отдать в скрипт ?
Только пока надо придмать как, ведь в JS нет указателей ...
newQObject(model_ptr)
а потом использовать как любое другое QScriptValue

Как оказалось, нужен доступ из скрипта не к всей модели, а достаточно (и необходимо !)
иметь доступ к data парента, т.е. к QSqlQueryModel::data(index, role), что-бы вытащить
оригинальные значения из модели и сформировать нужную колонку.
И как в параметрах передать QModelIndex ? Ведь скрипт его не понимает...
Или отдавать row и col раздельно ? (как вариант)

Как скриптовая data могла-бы вызвать QSqlQueryModel::data(index, role) ?
В данном случае data в скрипте примерно такая
Раскрывающийся текст


function data2101(index)
{
var d[5], i, n;;

// Заполняем массив оригинальными данными
for(i = 0;i < 5;i++)
d[i] = QSqlQueryModel::data((index + i), role); // Это псевдо-код !!! (index + i) это колонка

var param = "";

for (i = 4;i >= 0;i--) // ищем с конца первый ненулевой
{
if (d[i] != 0.0)
{
n = i + 1;
for (i = 0;i < n;i++) // формируем колонку
{
param += d[i].toString();
param += " ";
}

break;
}
}

return(param);
}

У меня конечно-же есть решение, но может ты чё лучше подскажешь ? :unsure:
У меня решение через UserRole вызывать оригинальную QSqlQueryModel::data
из fpQueryModel::data. Слишком "длинно" получится, потеря скорости ... :mellow:
Или из другой ф-ции вызывать, scriptData например, кторая всегда возвращает оригинал.

Цитата
Там где я прикладывал есть несколько вариантов.

Посмотрел ес-сно. Спс.
А в конструкторе обнулить указатель на callback_ надо ?

Автор: lanz 7.7.2017, 13:49

Цитата(JohnZ @ 7.7.2017, 11:27) *
И как в параметрах передать QModelIndex ? Ведь скрипт его не понимает...

Все он понимает :)
engine.evaluate("function data(model, index) { return model.data(index); }");

args << engine->newQObject(sourceModel()) << engine->newVariant(index);

Цитата(JohnZ @ 7.7.2017, 11:27) *
потеря скорости ... :mellow:

А бенчмарки у тебя есть? Нет бенчмарков, нет проблемы :lol:
Цитата(JohnZ @ 7.7.2017, 11:27) *
А в конструкторе обнулить указатель на callback_ надо ?

Не надо, оставь default initialization.
http://doc.qt.io/qt-4.8/qscriptvalue.html#QScriptValue

Автор: JohnZ 7.7.2017, 17:34

Погодь lanz, не убегай :)
А какая у тебя QT-я ? У мну 4.8.2 и мой qmake не понял QT += widgets
Пробовал заменить на core & gui - не помогло ...
У тебя либо 5.XX ... либо 3.XX :)

Цитата(lanz @ 7.7.2017, 13:49) *
Цитата(JohnZ @ 7.7.2017, 11:27)
И как в параметрах передать QModelIndex ? Ведь скрипт его не понимает...
Все он понимает
engine.evaluate("function data(model, index) { return model.data(index); }");

Я ранее такое пробовал - не прокатило, вернее в скриптовом отладчике показало
что это объект класа QModelIndex, но отказался с ним работать :(
Попробую по твоему - расскажу ...

Цитата
args << engine->newQObject(sourceModel()) << engine->newVariant(index);

sourceModel() - это моя модель или парента ? Ведь нужна-то парентовая !!!

Цитата
Цитата(JohnZ @ 7.7.2017, 11:27)
потеря скорости ...
А бенчмарки у тебя есть? Нет бенчмарков, нет проблемы

Надо что-бы "на глаз" ( как в анекдоте про волка ) работало быстро и юзер "не уставал" ждать ...
Спокойный юзер - Это самая лучшая бенчмарка :)

Автор: lanz 7.7.2017, 18:36

Цитата(JohnZ @ 7.7.2017, 17:34) *
У тебя либо 5.XX ... либо 3.XX :)

5.5
Цитата(JohnZ @ 7.7.2017, 17:34) *
но отказался с ним работать

Ну смотря что ты хочешь, т.к. это не QObject, то он не маппится в JS, можно его либо как черный ящик передавать (как у меня), либо разваливать на нужные компоненты.
Цитата(JohnZ @ 7.7.2017, 17:34) *
sourceModel() - это моя модель или парента ? Ведь нужна-то парентовая !!!

Все примеры относятся к проекту, который я выкладывал. Т.е. sourceModel это произвольная модель, которая лежит под этой проксей. Что такое парентовая модель я не очень понимаю.
Цитата(JohnZ @ 7.7.2017, 17:34) *
Надо что-бы "на глаз" ( как в анекдоте про волка ) работало быстро и юзер "не уставал" ждать ...

С таким подходом ты можешь оптимизировать вовсе не то что тормозит, например сишный вызов почти ничего не стоит по сравнению с вызовом скрипта, поэтому ты тут зря экономишь. Профилируй, если тормозит и смотри где у тебя узкое место.

Автор: JohnZ 9.7.2017, 19:56

Цитата(lanz @ 7.7.2017, 18:36) *
Цитата(JohnZ @ 7.7.2017, 17:34)
но отказался с ним работать
Ну смотря что ты хочешь, т.к. это не QObject, то он не маппится в JS, можно его либо как черный ящик передавать (как у меня), либо разваливать на нужные компоненты.

А так можно ?
Раскрывающийся текст

QVariant fpTableModel::sdata(int row, int col) const
{
QModelIndex index = createIndex(row, col);
return QSqlTableModel::data(index, Qt::DisplayRole);
}

Это та ф-ция из которой скрипт будет напрямую из парента брать данные ...

Цитата
Цитата(JohnZ @ 7.7.2017, 17:34)
sourceModel() - это моя модель или парента ? Ведь нужна-то парентовая !!!
Все примеры относятся к проекту, который я выкладывал. Т.е. sourceModel это произвольная модель, которая лежит под этой проксей. Что такое парентовая модель я не очень понимаю.

В моём случае (выше) для fpTableModel парент это QT-шная QSqlTableModel.
Может я неправильно выразился, но подразумевалось именно это. :unsure:

Цитата
Цитата(JohnZ @ 7.7.2017, 17:34)
Надо что-бы "на глаз" ( как в анекдоте про волка ) работало быстро и юзер "не уставал" ждать ...
С таким подходом ты можешь оптимизировать вовсе не то что тормозит, например сишный вызов почти ничего не стоит по сравнению с вызовом скрипта, поэтому ты тут зря экономишь. Профилируй, если тормозит и смотри где у тебя узкое место.

Lanz, я тоже за то, чтобы было в С-щном коде, но имея в проекте всего одну универсальную модель, как можно по-другому
подменить колонку ? Только через скрипт imho ... Вот эту задачу тут мы и решали.

Автор: lanz 9.7.2017, 23:56

Цитата(JohnZ @ 9.7.2017, 19:56) *
А так можно ?

Работает? Можно :)
Цитата(JohnZ @ 9.7.2017, 19:56) *
о имея в проекте всего одну универсальную модель, как можно по-другому
подменить колонку ?

Иметь много разных проксей для каждого нужного случая :) И надевать нужную(ые) для каждого конкретного случая.

Автор: JohnZ 14.7.2017, 12:24

Lanz, а не подскажешь как можно передать в скриптовую ф-цию QVariant ?

        QScriptValueList args;
        args << QScriptValue(index.row()) << QScriptValue(index.column())
                << QScriptValue(QSqlQueryModel::data(index, Qt::DisplayRole));

На последнюю строчку ругань компиллера. Это что-бы отказаться от callback-а sdata().
По-идее все переменные в скрипте QVariant и должны-бы восприниматься как "родные" в качестве параметра,
но к сожалению нет такого конструктора у QScriptValue ... :blink:
Можно-ли как-ни-ить это обойти ?

Автор: lanz 14.7.2017, 12:41

Было ИТТ, ну! :lol:

engine->newVariant(index);

http://doc.qt.io/qt-4.8/qscriptengine.html#newVariant

Автор: JohnZ 14.7.2017, 12:50

Помнишь фильм "Напарник" Л.Гайдая ?

- Руки ... мыли ?
- Ах да да да ... :)

Thx !

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