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

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 2 [3]
31  Qt / Qt Script, QtWebKit / Qt Script. Сделать что-то вроде индексируемой переменной. : Октябрь 08, 2013, 23:45
Всем привет.

Хочу, чтобы из скрипта были доступны свойства моего объекта вот так:
Код
Javascript
module.frequency(1) = 15;
var a = module.frequency(2);
 

В строке module.frequency(1) = 15; должно быть не присвоение 15 переменной, ссылку на которую вернет module.frequency(1),
а фактически вызов функции frequency c 2-мя параметрами: 1 - индекс, 2 - значение.
(В функции frequency я пишу число 15 по Modbus в регистр с индексом 1).

Почти то, что нужно описывается в документации http://qt-project.org/doc/qt-5.0/qtscript/qtscript-index.html#property-getters-and-setters

Цитировать
Property Getters and Setters
A script object property can be defined in terms of a getter/setter function, similar to how a Qt C++ property has read and write functions associated with it. This makes it possible for a script to use expressions like object.x instead of object.getX(); the getter/setter function for x will implicitly be invoked whenever the property is accessed. To scripts, the property looks and behaves just like a regular object property.
A single Qt Script function can act as both getter and setter for a property. When it is called as a getter, the argument count is 0. When it is called as a setter, the argument count is 1; the argument is the new value of the property. In the following example, we define a native combined getter/setter that transforms the value slightly:
QScriptValue getSet(QScriptContext *ctx, QScriptEngine *eng)
{
    QScriptValue obj = ctx->thisObject();
    QScriptValue data = obj.data();
    if (!data.isValid()) {
        data = eng->newObject();
        obj.setData(data);
    }
    QScriptValue result;
    if (ctx->argumentCount() == 1) {
        QString str = ctx->argument(0).toString();
        str.replace("Roberta", "Ken");
        result = str;
        data.setProperty("x", result);
    } else {
        result = data.property("x");
    }
    return result;
}

Недостаток 1: эти функции не могут быть методами класса. Соответственно this недоступен.
Недостаток 2: эти функции нужно прокидывать в глобальный объект явно, а хочется, чтобы они были доступны через объект
Код
C++ (Qt)
QScriptEngine eng;
QScriptValue obj = eng.newObject();
obj.setProperty("x", eng.newFunction(getSet), QScriptValue::PropertyGetter|QScriptValue::PropertySetter);
 

Подскажите, что делать? Можно, конечно, попить валерьянки, успокоиться Смеющийся и оставить по 2-му варианту, но вдруг можно сделать красиво?

Что делал.
Вариант 1.
Есть объект со свойствами (так по-русски properties?):
Код
C++ (Qt)
class Module : public QObject
{
   Q_OBJECT
   Q_PROPERTY(quint32 frequency1     READ frequency1     WRITE setFrequency1)
   Q_PROPERTY(quint32 frequency2     READ frequency2     WRITE setFrequency2)
   ...
   Q_PROPERTY(quint32 frequency99   READ frequency99    WRITE setFrequency99)
 
private:
   ...
}
 

Код
Javascript
module.frequency1 = 15;
var a = module.frequency2;
 

Недостатки: некрасиво, много писанины, много возможностей ошибиться.

Вариант 2.
Вместо свойств делаю вызываемые методы:
Код
C++ (Qt)
class Module : public QObject
{
   Q_OBJECT
 
public:    
   Q_INVOKABLE quint32 frequency(quint8 index);
   Q_INVOKABLE void setFrequency(quint8 index, quint32 value);
}
 

Код
Javascript
module.setFrequency(1, 15);
var a = module.frequency(2);
 

Пока у меня реализован 2-й вариант.
32  Qt / Вопросы новичков / Re: Преобразовать quint32 во float сохраняя двоичное представление : Октябрь 05, 2013, 11:25
Всем спасибо!
reinterpret_cast (как для меня оказывается  Улыбающийся ) как раз и предназначен для сохранения bit pattern.
А то, что sizeof(float) может быть != sizeof(unsigned int), как обычно, пусть заботятся следующие поколения поддерживающим мою программу.
33  Qt / Вопросы новичков / Преобразовать quint32 во float сохраняя двоичное представление : Октябрь 04, 2013, 23:45
Здравствуйте.
Как средствами Qt преобразовать unsigned int во float c сохранением двоичного представления данных? Т.е из unsigned int со значением 1078984704 сделать float значением 3.25.
Это можно сделать с помощью union, но вдруг есть нативный Qt способ?

Может лыжи не едут, но у меня не получилось ни с помощью QVariant, ни с помощью QDataStream (что очень странно).
34  Qt / Вопросы новичков / Re: QTabWidget, похожие по функциям табы : Июнь 27, 2012, 13:49
Как правильно сделать сделать этот набор похожих табов?
написать класс-наследник QWidget
И что с ним делать?
Наследовать от него сколько нужно классов с разным поведением?

Пришла идея в голову, но как это реализовать не знаю:
1. Создать базовый класс с формой на рис.1. На форме внизу StackedWidget.
2. Создать специализированные классы с формами на рис2 и 3. Эти формы вставлять в StackedWidget базового класса.

Проблема в том, что мне из специализированных классов нужно получать доступ к TreeWidget базового класса, чтобы в спец классе иметь доступ к элементу QTreeWidget, который выбрал пользователь. Как это сделать правильно не знаю.

И надо получить указатель на StackedWidget базового класса, чтобы в него вставить формы спец классов.
35  Qt / Вопросы новичков / QTabWidget, похожие по функциям табы : Июнь 26, 2012, 20:48
Добрый день!

Сделал интерфейс QTabWidget  c несколькими похожими по поведению и виду табами. Картинки прилагаю.

В каждом табе QTreeWidget, который можно редактировать. При нажатии кнопки Редактировать появляется несколько radioButton, lineEdit, checkBox (в каждом табе немного по-разному) на которые отображается строка из TreeWidget.
В каждом табе свой валидатор ввода.

Каждый TreeWidget в каждом табе заполняется из одного документа XML. Только отображают они элементы XML  с разными тегами.

Как правильно сделать сделать этот набор похожих табов?
Страниц: 1 2 [3]

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