我有这个Projekt使用QStatemachine来管理UI,我想添加一个自定义的List。 UI应该仅由关键事件操纵。据我所知,我需要在qml方面使用ListView。
ListView的委托仅对鼠标输入或直接键输入作出反应。但是我在C ++中使用QStatemachine来操作它,因为它正在处理UI的所有关键事件。 当我按下右箭头键时我想要发生的是将列表移到左侧 (currentItem总是位于屏幕中间。)
所以我的ListView在片刻看起来像这样。
Php7
c ++ Statemachine是一个QStatemachine,它将信号发送到qml。
如何将信号绑定到Listview的委托?
答案 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
时对这些信号作出反应
总结这项技术:
QStateMachine
控制应用程序状态答案 1 :(得分:1)
第一步 - 将状态机公开为上下文属性,以便qml:
可见Connections {
target: SM
onSomeSignal: doSomeStuff()
}
第二步 - 使用{{1}}元素建立连接:
{{1}}