каскады и сигналы/слоты

Я бегаю по этому поводу кругами. Просто не могу понять сигналы и слоты.

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

Пример:

У меня есть две метки в Qml с текстом: _app.method, который возвращает значение.

У меня есть кнопка, которая onClicked запускает метод Q_INVOKABLE. Этот метод выдает сигнал, когда он выполнен, например, извлекает геокоординаты и обновляет значения, на которые опирается приведенный выше текст: назначения.

Что я хочу, так это ЧТО-ТО, чтобы обновить текст: назначения после изменения этих значений.

Мне просто нужно, чтобы эти сигналы/слоты были ясно объяснены. Единственные примеры в документации, похоже, предполагают ТОЛЬКО QML или C++, но не их сочетание. В примере кода есть примеры, но они не объясняются конкретно в документации.

Если бы у вас было простое описание, я уверен, что смог бы адаптироваться к нему. Например, 1: определите это в QML, 2: определите это в файле hpp, 3: определите это в файле cpp.

Я пытался использовать QObject setPropery("text","value"), но мое приложение вылетает при попытке сделать это.

Скажи мне, если я ошибаюсь...

1) в QML:

Button { 
    id: aButton 
    text: _app.value 
    onClicked: {
        _app.valueChanged.connect(aButton.onValueChanged); 
        _app.value = _app.value + 1;
    } 
    function onValueChanged (val) {
        aButton.text = "New value: " + val;
    }
}

2) в ГЭС:

    Q_PROPERTY(int value READ value WRITE setValue NOTIFY valueChanged)
public:
    int value();
    void setValue(int i);
signals:
    void valueChanged(int);
private:
    int m_iValue;

3) в КПП:

int class::value()
{
    return m_iValue;
}

void class::setValue(int i)
{
// name is same as HPP WRITE Q_PROPERTY statement
    m_iValue = i;
    emit valueChanged(m_iValue);
}

Итак, что происходит, так это то, что в QML метод onClick СОЕДИНЯЕТ сигнал с функцией QML; это означает, что теперь мы прослушиваем изменение значения, и когда это произойдет, эта функция будет вызвана. ЗАТЕМ мы меняем значение... так как Q_PROPERTY устанавливает значение записи в функцию с именем setValue, setValue вызывается с новым значением; внутренне m_iValue изменяется, и происходит выброс, который сообщает всем, кто слушает valueChanged, что есть новое значение.

Эй, мой QML слушает это! (через скрипт _app.valueChanged.connect). Итак, объект QML (Кнопка), который слушал это, вызывает функцию onValueChanged с новым значением (из-за эммита valueChanged(m_iValue).

Пожалуйста, скажи мне, я понял это??!?!


person James Perih    schedule 17.02.2013    source источник


Ответы (1)


Если вы используете макрос Q_PROPERTY, нет необходимости явно связывать сигнал onValueChanged с функцией для изменения текста кнопки. А также вам не нужно испускать сигнал valueChanged с m_iValue. Внесите указанные ниже изменения в соответствующие файлы.

QML:

Button {
    horizontalAlignment: HorizontalAlignment.Center
    verticalAlignment: VerticalAlignment.Center
    id: aButton
    text: _app.value
    onClicked: {
        _app.value = _app.value + 1
    }
}

ГЭС:

signals:
    void valueChanged();

Цена за конверсию:

передать значениеChanged();

person Nishant Shah    schedule 18.02.2013
comment
Вау... это каким-то образом работает благодаря магии СИГНАЛ/СЛОТ. Есть ли в игре какие-то специальные ключевые слова, которые заставляют это работать? - person James Perih; 18.02.2013