QML не реагирует на изменения члена-класса C++

105
01 апреля 2022, 13:20

Есть приложение с областью, которая реагирует на клик мышки:

MouseArea {
        anchors.fill: parent
        onClicked: {
            root.model.move(index)
            }
        }

Функция move делает, что положено, но внутри нее самой вызывается другая функция, реализованная следующим образом:

void GameBoard::changeStepCount()
{
    int temp = m_stepCount.toInt();
    temp++;
    m_stepCount.setNum(temp);
    emit stepCountChanged();
}

Объявления в классе следующие:

Q_PROPERTY(QString stepCount READ getStepCount NOTIFY stepCountChanged)
QString getStepCount() const;
void changeStepCount();
signals:
    void stepCountChanged();

А вот код QML:

GameBoardModel  {
    id: _gm
    onStepCountChanged: {
        Qt.quit();
    }
}
Result {
    id: _info
    width: root.width
    height: 20
    color: root.color
    displayStepCount: "Step " + _gm.stepCount
}

Код C++ работает, значение m_stepCount изменяется, если проверять через qDebug() внутри функции changeStepCount(), однако не меняется stepCount в интерфейсе программы.

Пробовал и onStepCountChanged: { _info.displayStepCount = _gm.stepCount }

, но результата никакого.

displayStepCount - это property string displayStepCount: "0" из файла Result.qml

Не могу понять, почему QML не реагирует.

Answer 1

Оказалось, что проблема была в инстациировании двух разных GameBoardModel в основном файле main.qml и файле GameBoard.qml, где этот объект использовался в качестве модели:

GridView {
    id: root
    model: GameBoardModel {
    }

Проблема решилась в удалении из GameBoard.qml объекта GameBoardModel и передачи этой модели через основной файл main.qml. То есть main.qml стал выглядеть так:

Было:

GameBoardModel {
    id: _gm
}
Result {
    id: _info
    width: root.width
    height: 20
    color: root.color
    displayStepCount: "Step " + _gm.stepCount
}
GameBoard {
    anchors.top: _info.bottom
    width: parent.width
    height: parent.height - _info.height
}

Стало:

GameBoardModel {
        id: _gm
    }
    Result {
        id: _info
        width: root.width
        height: 20
        color: root.color
        displayStepCount: "Step " + _gm.stepCount
    }
    GameBoard {
        model: _gm
        anchors.top: _info.bottom
        width: parent.width
        height: parent.height - _info.height
    }
READ ALSO
Почему ошибка index out of range?

Почему ошибка index out of range?

Числовая последовательность называется пилообразной если каждый ее член (кроме первого и последнего) либо больше обоих своих соседей, либо...

96
Установка пустого атрибута ACCESS_EXTERNAL_DTD вызывает исключение "не поддерживается: http://javax.xml.XMLConstants/property/accessExternalDTD"

Установка пустого атрибута ACCESS_EXTERNAL_DTD вызывает исключение "не поддерживается: http://javax.xml.XMLConstants/property/accessExternalDTD"

Установка пустого атрибута ACCESS_EXTERNAL_DTD вызывает исключение "не поддерживается: http://javaxxml

71
Замена иконки бургера на стрелочку

Замена иконки бургера на стрелочку

Получилось синхронизировать состояние бокового меню с кнопкой бургера через ActionBarDrawerToggleТ

102
Обнуление массива за константное время

Обнуление массива за константное время

На интервью задали такую задачу: дан массив длиной n, необходимо реализовать методы добавления элемента и обнуление(значения всех элементов...

83