如何使用QStatemachine来影响ListView?

时间:2016-12-17 15:35:15

标签: c++ qt listview qml qstatemachine

我有这个Projekt使用QStatemachine来管理UI,我想添加一个自定义的List。 UI应该仅由关键事件操纵。据我所知,我需要在qml方面使用ListView。

ListView的委托仅对鼠标输入或直接键输入作出反应。但是我在C ++中使用QStatemachine来操作它,因为它正在处理UI的所有关键事件。 当我按下右箭头键时我想要发生的是将列表移到左侧 (currentItem总是位于屏幕中间。)

this is the inital State of the lisfview

enter image description here

所以我的ListView在片刻看起来像这样。

Php7

c ++ Statemachine是一个QStatemachine,它将信号发送到qml。

如何将信号绑定到Listview的委托?

2 个答案:

答案 0 :(得分:2)

最简单的方法是让状态机设置" currentIndex"

一种常见的模式是拥有一个在QML和QStateMachine

之间桥接的接口对象
class StateInterface : public QObject
{
    Q_OBJECT
    Q_PROPERTY(int currentIndex MEMBER m_currentIndex NOTIFY currentIndexChanged)

public:
    explicit StateInterface(QObject *parent = 0);

signals:
    void currentIndexChanged() const;

private:
    int m_currentIndex;
};

该对象的一个​​实例通过" context属性"暴露给QML。 mechansism

StateInterface stateInterface;
qmlEngine->rootContext()->setContextProperty("_stateInterface", &stateInterface);

根据需要在QML中使用

ListView {
    currentIndex: _stateInterface.currentIndex
}

QStateMachine使用相同的stateInterface对象作为州财产分配的目标

QState *beginState = new QState(stateMachine);
beginState->assignProperty(&stateInterface, "currentIndex", 0);
// and so on.

StateInterface对象还可以提供QML用于影响状态更改的槽。 E.g。

public slots:
    void triggerReset() { emit trigger reset(); }

signals:
    void reset();

例如,QStateMachine可以在信号转换为beginState时对这些信号作出反应

总结这项技术:

  1. QStateMachine控制应用程序状态
  2. QML感兴趣的所有状态数据都通过一个或多个接口对象公开
  3. QML方面以一种漂亮的,声明性的方式使用状态数据就像它处理状态处理一样

答案 1 :(得分:1)

第一步 - 将状态机公开为上下文属性,以便qml:

可见
Connections {
  target: SM
  onSomeSignal: doSomeStuff()
}

第二步 - 使用{{1}}元素建立连接:

{{1}}