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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Использование Сustom Widgets в JS  (Прочитано 3203 раз)
vladmailbox
Гость
« : Март 02, 2010, 14:51 »

Ситуация такая. Есть Сustom Widget

class DbTableView : public QTableView
{
    Q_OBJECT
public:
    DbTableView( QWidget *parent = 0 );

    Q_INVOKABLE void setHeader( QString text  );
}

Создается форма и на нее выкладывается этот виджет, путем ручного редактирования xml.

Далее есть скрипт,  типа:

function City(ui)
{
    this.ui = ui;
   
    with (ui) {
        ...
        dbg.setHeader( "Код|Наименование..." );
        dbg.Display( true );
     }

};

В коде, сперва грузится форма:

    QFile uiFile(FormName );
    uiFile.open(QIODevice::ReadOnly);
    ui = loader.load(&uiFile, this);
    uiFile.close();

Затем запускается скрипт:

    ...
    QFile scriptFile(ScriptName);
    scriptFile.open(QIODevice::ReadOnly);
    engine.evaluate(scriptFile.readAll(), scriptFile.fileName());
    scriptFile.close();
    ...
    QScriptValue ctor = engine.evaluate(ClassName);
    QScriptValue scriptUi = engine.newQObject(ui, QScriptEngine::AutoOwnership);
    QScriptValue calc = ctor.construct(QScriptValueList() << scriptUi);

При этом все стандартные виджеты видны из скрипта и работают.
Но методы DbTableView не видны.

Видимо его надо где-то еще регистрировать, или как-то иначе оформить. Подскажите кто знает.

Записан
alexman
Гость
« Ответ #1 : Март 02, 2010, 17:58 »

А почему бы при создании формы в Qt Designer не сделать promoteTo данному виджету? Тогда не нужно будет руками редактировать!
Записан
vladmailbox
Гость
« Ответ #2 : Март 02, 2010, 18:04 »

А что это значит? Как это сделать?
Записан
alexman
Гость
« Ответ #3 : Март 02, 2010, 18:15 »

На форму кидаешь виджет и делаешь promoteTo по правой кнопке мыши на этом виджете... посмотри Qt Assistant!
Записан
vladmailbox
Гость
« Ответ #4 : Март 02, 2010, 18:38 »

Да, спасибо, я с этим разобрался. Но не помогло.
Записан
asvil
Гость
« Ответ #5 : Март 04, 2010, 09:01 »

Код:
Q_SCRIPT_DECLARE_QMETAOBJECT(FancyLineEdit, QWidget*);

template <typename T>
QScriptValue qobjectToScriptValue(QScriptEngine *engine, const T& value)
{
return engine->newQObject(value);
}

template <typename T>
void qobjectFromScriptValue(const QScriptValue& object, T& value)
{
value = static_cast<T>(object.toQObject());
}

template<typename T>
int qScriptRegisterMetaTypeEx(
QScriptEngine *eng,
const QScriptValue &prototype = QScriptValue())
{
return qScriptRegisterMetaType(eng, qobjectToScriptValue<T>, qobjectFromScriptValue<T>, prototype);
}

template<typename T>
QScriptValue qScriptCreateConstructor(QScriptEngine *engine
, const QScriptValue::PropertyFlags& flags = QScriptValue::KeepExistingFlags)
{
QScriptValue ctor = qScriptValueFromQMetaObject<T>(engine);

// for (int i = T::staticMetaObject.enumeratorOffset(); i < T::staticMetaObject.enumeratorCount(); ++i) {
// QMetaEnum metaEnum = T::staticMetaObject.enumerator(i);
// for (int g = 0; g < metaEnum.keyCount(); ++g)
// ctor.setProperty(metaEnum.key(g), metaEnum.value(g));
// }
engine->globalObject().setProperty(T::staticMetaObject.className(), ctor, flags);
return ctor;
}

Затем где-либо в коде инициализирующем приложение:

Код:
qScriptRegisterMetaTypeEx<FancyLineEdit*>(engine);
qScriptCreateConstructor<FancyLineEdit>(engine);

Вместо FancyLineEdit, свой виджет. Вышесказанное подходит только для qobject.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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