![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
JohnZ |
![]() ![]()
Сообщение
#1
|
Участник ![]() ![]() Группа: Участник Сообщений: 139 Регистрация: 19.7.2014 Пользователь №: 4190 Спасибо сказали: 10 раз(а) Репутация: ![]() ![]() ![]() |
Со старта прошу не пинать за то что ( возможно !) не в том разделе задаю вопрос, т.к. вероятнее всего это из раздела 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 ... Сообщение отредактировал JohnZ - 3.7.2017, 17:38 |
|
|
lanz |
![]()
Сообщение
#2
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
Плюсовые объекты из скрипта менять не получится кмк, я бы сделал
1. Прокси модель с полем - коллбэком, которое можно выставить из скрипта. 2. data в этой модели дергает коллбэк и если тот возвращает нормальное значение, то оно и возвращается 3. если коллбэк возвращает undef, то дергается data проксируемой модели. |
|
|
JohnZ |
![]()
Сообщение
#3
|
Участник ![]() ![]() Группа: Участник Сообщений: 139 Регистрация: 19.7.2014 Пользователь №: 4190 Спасибо сказали: 10 раз(а) Репутация: ![]() ![]() ![]() |
Плюсовые объекты из скрипта менять не получится кмк, я бы сделал 1. Прокси модель с полем - коллбэком, которое можно выставить из скрипта. А сама fpTForma может быть псевдо-Прокси ? Дело в том, что форм у меня 3 шт ( Query Table и RTable ) и соответственно 3 модели, и к каждой из них "рисовать" проксю невыгодно, т.к. эта-же data() может "состоятся" всего 1-2 раза на весь проект, а данные _всегда_ будут летать через проксю на всех создаваемых объектах ... ![]() ВотЪ если-бы можно было-бы получить указатель на скриптовую ф-цию, и если он не NULL, отдать его модельке на этапе init или create !? ![]() Цитата 2. data в этой модели дергает коллбэк и если тот возвращает нормальное значение, то оно и возвращается 3. если коллбэк возвращает undef, то дергается data проксируемой модели. Именно так только нужно немного изменить схему, если можно, - дергать data из скрипта, если она существует !? Так можно как-ни-ить сделать ? Сообщение отредактировал JohnZ - 4.7.2017, 11:42 |
|
|
lanz |
![]()
Сообщение
#4
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
А сама fpTForma может быть псевдо-Прокси ? Может, но это нарушение SRP, к тому же три раза придется писать один и тот же код ![]() и к каждой из них "рисовать" проксю невыгодно Не надо к каждой, на то она и прокси чтобы проксировать любую модель. Те, которые нужно, надо в нее оборачивать, те которые нет, нет. 1-2 раза на весь проект, а данные _всегда_ будут летать через проксю на всех создаваемых объектах ... Вовсе нет, во первых - можно не все модели оборачивать, во вторых можно(нужно!) пренебречь С++ оверхедом, а вызывать скрипт только для определенных колонок, ну и т.п. ВотЪ если-бы можно было-бы получить указатель на скриптовую ф-цию, и если он не NULL, отдать его модельке на этапе init или create !? Не вижу проблемы так сделать, ведь функционал известен. Тут компромисс между гибкостью и скоростью - для гибкости все формы должны поддерживать скрипт data, для скорости - не все ![]() Именно так только нужно немного изменить схему, если можно, - дергать data из скрипта, если она существует !? Можно в коллбэк передать указатель на нижележащую модель, но... meh, на этом этапе уже проще писать модель полностью скриптом ![]() |
|
|
JohnZ |
![]()
Сообщение
#5
|
Участник ![]() ![]() Группа: Участник Сообщений: 139 Регистрация: 19.7.2014 Пользователь №: 4190 Спасибо сказали: 10 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(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 |
![]()
Сообщение
#6
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
См. приложение.
Цитата Дык по-любому все объекты получатся проксируемыми, или я чего-то не догоняю ... ![]() Только те, у которых используется прокся ![]() Цитата ... и ХТО такой 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. Тогда скрипт будет вызываться только для одной колонки. Цитата и здесь, и если можно псевдо-кодом ? Вроде того:
Прикрепленные файлы
|
|
|
JohnZ |
![]()
Сообщение
#7
|
Участник ![]() ![]() Группа: Участник Сообщений: 139 Регистрация: 19.7.2014 Пользователь №: 4190 Спасибо сказали: 10 раз(а) Репутация: ![]() ![]() ![]() |
См. приложение. БлагоДарю !!! Цитата Вот если-бы они "росли" Prefer composition to inheritance Sorry, не понялЪ про composition ... ![]() ... или здесь подразумевается множеств-ное наследование ? Цитата Дык какая колонка чего должна показать и должна "разобраться" data() !? ... или я тебя не правильно понял :-( В ScripProxy можно завести другие проперти, которые позволят фильтровать уже в ScripProxy::data, не дергая скрипт, например если скрипт умеет обрабатывать только 1 колонку, то можно для остальных и не вызывать коллбэк. О том что "скрипт умеет обрабатывать только 1 колонку" нужно выставить _предопределённые_ признаки в пропертях и опрашивать их из С-шного кода в проксе ? Цитата Тот же пример что выше - if по номеру колонки можно сделать в скрипте, тогда скрипт будет вызываться для всех колонок. А можно сделать в ScriptProxy::data и сравнивать с вынесенным property. Тогда скрипт будет вызываться только для одной колонки. Так точно ! Именно этот случай, - в БД "лежат" 5 double, параметры для тех-самых ф-ций расчёта с динамич-м именем в переменной ![]() будет от нулей ![]() ![]() Цитата Вроде того: function data(row, col, model) { return model.data() } args << engine->newQObject(sourceModel()) А как СВОЮ модель "объяснить" скрипту ? Сколько я ни пытался, не получилось ![]() Он хочет видеть QOject, а у меня в модели его нет, а оборачивать всю(е) модель(и) в QOject гиморно ... ![]() |
|
|
lanz |
![]()
Сообщение
#8
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
... или здесь подразумевается множеств-ное наследование ? https://en.wikipedia.org/wiki/Composition_over_inheritance выставить _предопределённые_ признаки в пропертях и опрашивать их из С-шного кода в проксе ? Да, например так. А как СВОЮ модель "объяснить" скрипту ? Если своя модель наследует от какой-либо модели (QAbstractXxxModel) то она и так QObject. Если нет, то это хороший повод ее отнаследовать, т.к. можно будет использовать со стандартными вью/проксями и т.п. показать их надо одной строкой БЕЗ нулевых значений в сишной data проверять на 0? |
|
|
JohnZ |
![]()
Сообщение
#9
|
Участник ![]() ![]() Группа: Участник Сообщений: 139 Регистрация: 19.7.2014 Пользователь №: 4190 Спасибо сказали: 10 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(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. Но ведь ей опять-таки понадовится моделька ... ![]() Сообщение отредактировал JohnZ - 5.7.2017, 22:41 |
|
|
lanz |
![]()
Сообщение
#10
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
Если снять rem с Q_OBJECT, НЕ компилится, ошибок на 2 экрана. Надо с этим разобраться, кидай сюда хоть что за ошибки. Дык Тогда нет смысла в скриптовой data() ?! В том и смысл, чтобы формирование "уникальных" колонок отдать скрипту. Т.е. "спастись" от кучи с-шных моделей. Нужна гибкость и оч-чень желательно не потерять много в скорости ! А в чем проблема с кучей сишных моделей? ![]() На самом деле нет разницы где писать - и там и там код придется как то поддерживать и обновлять. Более того, как ты думаешь насколько часто будет менятся логика убирания лишних нулей? ![]() |
|
|
JohnZ |
![]()
Сообщение
#11
|
Участник ![]() ![]() Группа: Участник Сообщений: 139 Регистрация: 19.7.2014 Пользователь №: 4190 Спасибо сказали: 10 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(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() ?! В том и смысл, чтобы формирование "уникальных" колонок отдать скрипту. Т.е. "спастись" от кучи с-шных моделей. Нужна гибкость и оч-чень желательно не потерять много в скорости ! А в чем проблема с кучей сишных моделей? Дык что-бы иметь одну универсальную, на все случаи ... Цитата На самом деле нет разницы где писать - и там и там код придется как то поддерживать и обновлять. Дык скриптовую поддержку можно отдать "наружу" ![]() Цитата Более того, как ты думаешь насколько часто будет менятся логика убирания лишних нулей? Ни разу. В чём подвох ? ![]() Сообщение отредактировал JohnZ - 6.7.2017, 12:16
Эскизы прикрепленных изображений
|
|
|
lanz |
![]()
Сообщение
#12
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
Это уже при линковке. Чё с этим делать хз ... Это распространенная вещь, MOC не находит твой заголовочник. Проверь что fpmodels.h включен в HEADERS в .pro файле Попробуй перезапустить qmake (Build->Run qmake) Пересобери. Если не поможет, тащи сгенерированный Makefile, будем посмотреть ![]() Дык что-бы иметь одну универсальную, на все случаи ... Так не бывает ![]() А еще YAGNI ![]() Дык скриптовую поддержку можно отдать "наружу" ![]() Это если есть хорошее API между скриптом и сишной частью, иначе все равно придется лезть в сишный код/дергать тебя. Ни разу. В чём подвох ? ![]() Тогда смысл ее выносить в скрипт? ![]() |
|
|
JohnZ |
![]()
Сообщение
#13
|
Участник ![]() ![]() Группа: Участник Сообщений: 139 Регистрация: 19.7.2014 Пользователь №: 4190 Спасибо сказали: 10 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(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 ![]() В (разрабатываемых) ERP системах не-нужный функционал рано или поздно всё-равно понадобится, и если взять ближайшего предка моего проекта Ananas, (www.ananas.su) то у меня этого функционала значительно меньше, т.к.MVC (QT4 вместо QT3) который там был недоступен, плюс DataMapper etc ![]() Цитата Цитата(JohnZ @ 6.7.2017, 12:06) Дык скриптовую поддержку можно отдать "наружу" Как в ERP-системах. Это если есть хорошее API между скриптом и сишной частью, иначе все равно придется лезть в сишный код/дергать тебя. Дык это пока "в коротких штанишках" и нет доков. ![]() Будут доки (когда руки дойдут), проблема должна рассосаться ... Доки писать начал, но как ты понимаешь для програмера писать доки - лучще сразу застрелиться ![]() Хотя там особо-то и писать почти нечего, всего 2 объекта Forma и Report, у той-же 1С их около 80 ... Достигнуто за счёт того, что Forma "умеет" рекурсивно создавать своих потомков и саморегистрироваться в скриптовой системе... Цитата Цитата(JohnZ @ 6.7.2017, 12:06) Ни разу. В чём подвох ? Тогда смысл ее выносить в скрипт? В ВЫНОСЕ в скрипт ![]() ![]() ![]() Какую колонку (виртуальную) захочешь, такую и СМОЖЕШЬ сделать ! Сообщение отредактировал JohnZ - 6.7.2017, 14:53 |
|
|
lanz |
![]()
Сообщение
#14
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
JohnZ |
![]()
Сообщение
#15
|
Участник ![]() ![]() Группа: Участник Сообщений: 139 Регистрация: 19.7.2014 Пользователь №: 4190 Спасибо сказали: 10 раз(а) Репутация: ![]() ![]() ![]() |
Вот уже почти и добрались до решения проблемы
![]() Цитата(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); } У меня конечно-же есть решение, но может ты чё лучше подскажешь ? ![]() У меня решение через UserRole вызывать оригинальную QSqlQueryModel::data из fpQueryModel::data. Слишком "длинно" получится, потеря скорости ... ![]() Или из другой ф-ции вызывать, scriptData например, кторая всегда возвращает оригинал. Цитата Там где я прикладывал есть несколько вариантов. Посмотрел ес-сно. Спс. А в конструкторе обнулить указатель на callback_ надо ? |
|
|
lanz |
![]()
Сообщение
#16
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
И как в параметрах передать QModelIndex ? Ведь скрипт его не понимает... Все он понимает ![]()
потеря скорости ... ![]() А бенчмарки у тебя есть? Нет бенчмарков, нет проблемы ![]() А в конструкторе обнулить указатель на callback_ надо ? Не надо, оставь default initialization. http://doc.qt.io/qt-4.8/qscriptvalue.html#QScriptValue |
|
|
JohnZ |
![]()
Сообщение
#17
|
Участник ![]() ![]() Группа: Участник Сообщений: 139 Регистрация: 19.7.2014 Пользователь №: 4190 Спасибо сказали: 10 раз(а) Репутация: ![]() ![]() ![]() |
Погодь lanz, не убегай
![]() А какая у тебя QT-я ? У мну 4.8.2 и мой qmake не понял QT += widgets Пробовал заменить на core & gui - не помогло ... У тебя либо 5.XX ... либо 3.XX ![]() Цитата(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 |
![]()
Сообщение
#18
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
У тебя либо 5.XX ... либо 3.XX ![]() 5.5 но отказался с ним работать Ну смотря что ты хочешь, т.к. это не QObject, то он не маппится в JS, можно его либо как черный ящик передавать (как у меня), либо разваливать на нужные компоненты. sourceModel() - это моя модель или парента ? Ведь нужна-то парентовая !!! Все примеры относятся к проекту, который я выкладывал. Т.е. sourceModel это произвольная модель, которая лежит под этой проксей. Что такое парентовая модель я не очень понимаю. Надо что-бы "на глаз" ( как в анекдоте про волка ) работало быстро и юзер "не уставал" ждать ... С таким подходом ты можешь оптимизировать вовсе не то что тормозит, например сишный вызов почти ничего не стоит по сравнению с вызовом скрипта, поэтому ты тут зря экономишь. Профилируй, если тормозит и смотри где у тебя узкое место. |
|
|
JohnZ |
![]()
Сообщение
#19
|
Участник ![]() ![]() Группа: Участник Сообщений: 139 Регистрация: 19.7.2014 Пользователь №: 4190 Спасибо сказали: 10 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(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. Может я неправильно выразился, но подразумевалось именно это. ![]() Цитата Цитата(JohnZ @ 7.7.2017, 17:34) Надо что-бы "на глаз" ( как в анекдоте про волка ) работало быстро и юзер "не уставал" ждать ... С таким подходом ты можешь оптимизировать вовсе не то что тормозит, например сишный вызов почти ничего не стоит по сравнению с вызовом скрипта, поэтому ты тут зря экономишь. Профилируй, если тормозит и смотри где у тебя узкое место. Lanz, я тоже за то, чтобы было в С-щном коде, но имея в проекте всего одну универсальную модель, как можно по-другому подменить колонку ? Только через скрипт imho ... Вот эту задачу тут мы и решали. |
|
|
lanz |
![]()
Сообщение
#20
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
JohnZ |
![]()
Сообщение
#21
|
Участник ![]() ![]() Группа: Участник Сообщений: 139 Регистрация: 19.7.2014 Пользователь №: 4190 Спасибо сказали: 10 раз(а) Репутация: ![]() ![]() ![]() |
Lanz, а не подскажешь как можно передать в скриптовую ф-цию QVariant ?
На последнюю строчку ругань компиллера. Это что-бы отказаться от callback-а sdata(). По-идее все переменные в скрипте QVariant и должны-бы восприниматься как "родные" в качестве параметра, но к сожалению нет такого конструктора у QScriptValue ... ![]() Можно-ли как-ни-ить это обойти ? |
|
|
lanz |
![]()
Сообщение
#22
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
JohnZ |
![]()
Сообщение
#23
|
Участник ![]() ![]() Группа: Участник Сообщений: 139 Регистрация: 19.7.2014 Пользователь №: 4190 Спасибо сказали: 10 раз(а) Репутация: ![]() ![]() ![]() |
Помнишь фильм "Напарник" Л.Гайдая ?
- Руки ... мыли ? - Ах да да да ... ![]() Thx ! Сообщение отредактировал JohnZ - 14.7.2017, 12:52 |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 13.6.2025, 0:34 |