gpt4 book ai didi

c++ - 从 C++ QStateMachine 控制 QML UI

转载 作者:行者123 更新时间:2023-11-28 01:25:11 25 4
gpt4 key购买 nike

我正在制作一个应用程序的原型(prototype),我想从应用程序的 C++ 端的 QStateMachine 控制 QML UI 转换。为了使事情更简单,我们可以说 QML UI 由多个页面组成,这些页面包含应触发从一个页面到另一个页面的转换的按钮。

// main.qml
Window {

// ..
StackLayout {
id: layout
anchors.fill: parent
currentIndex: uiController.currentPage // binding with the C++ side

Page0 {
id: page0
}
Page1 {
id: page1
}
Page2 {
id: page2
}
Page3 {
id: page3
}
}
// ..
}
}

现在每个 Page 都有一个 Button 以便用户可以转到另一个页面:

// example of Page0.qml 
Page {
id: root

// ..

Button {
text: "Page 1"
width: 100
height: 100
anchors.top: text.bottom
anchors.horizontalCenter: text.horizontalCenter
anchors.horizontalCenterOffset: 10
onClicked: {
console.log("Button clicked")
backend.msg = "Button clicked !"
uiController.buttonClicked = 1; // binding with the C++ side
}
}
// ..
}

在 C++ 方面,我有一个 Controller ,它在内部使用状态机来控制转换:

class UIController : public QObject
{
Q_OBJECT
Q_PROPERTY(int buttonClicked READ buttonClicked WRITE setButtonClicked NOTIFY buttonClickedChanged)
Q_PROPERTY(int currentPage READ currentPage WRITE setCurrentPage NOTIFY currentPageChanged)

public:
// ..

private:
QStateMachine m_machine;
int m_buttonClicked;
int m_currentPage;
};

现在重要的部分是 QStateMachine 的设置:

UIController::UIController()
: m_buttonClicked(0)
{
QState *page1 = new QState();
QState *page2 = new QState();
QState *page3 = new QState();
QState *page4 = new QState();
// ButtonTransition rely on a ButtonEvent
ButtonTransition *tr1 = new ButtonTransition(1);
ButtonTransition *tr2 = new ButtonTransition(2);
ButtonTransition *tr3 = new ButtonTransition(3);
ButtonTransition *tr4 = new ButtonTransition(4);

// the current page is a state property
page1->assignProperty(this, "currentPage", 0);
page2->assignProperty(this, "currentPage", 1);
page3->assignProperty(this, "currentPage", 2);
page4->assignProperty(this, "currentPage", 3);

tr1->setTargetState(page2);
tr2->setTargetState(page3);
tr3->setTargetState(page4);
tr4->setTargetState(page1);

page1->addTransition(tr1);
page2->addTransition(tr2);
page3->addTransition(tr3);
page4->addTransition(tr4);

m_machine.addState(page1);
m_machine.addState(page2);
m_machine.addState(page3);
m_machine.addState(page4);
m_machine.setInitialState(page1);

m_machine.start();
}

最后要发生过渡:

/* this setter function is called everytime the QML side change the
buttonClicked property of the UiController */
void UIController::setButtonClicked(int button)
{
if (m_buttonClicked != button) {
m_buttonClicked = button;
m_machine.postEvent(new ButtonEvent(button));
emit buttonClickedChanged();
}
}

它确实有效,但我想问是否有更好的方法来做到这一点:我认为这种方法有点“笨拙”。

特别是可以将状态机转换直接绑定(bind)到 QML 信号吗? (至于QSignalTransition)

谢谢。

最佳答案

Especially is it possible to bind the state machine transition directly to QML signals ?

是的。您可以连接 entered()来自任何子状态的信号,例如buttonClickedChanged()

关于c++ - 从 C++ QStateMachine 控制 QML UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54198089/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com