- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在制作一个应用程序的原型(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/
我对带有 ParallelState 的 QStateMachine 很着迷。 我有一个包含第一个状态的主状态(顺序), 包含一组并行状态的第二个状态,以及另一个连续的状态。 第一个状态代表创建 N
我对如何测试 QStateMachine 有点困惑。我有一个组织良好的项目,一侧是源代码,另一侧是测试代码。 标题 class Foo { signals: void sigG
我创建了 4 个不同的 QState,我想在每个状态转换中隐藏一个对象。 这是代码: QStateMachine partita; QState *inizio_mano = new QState()
我已经创建了一个 QStateMachine,我必须获取导致状态转换的事件。难道没有任何机会进入我的插槽 EnterStateInit() 导致此调用的信号。这是我的示例代码: CreateState
在另一个问题中,您告诉我使用 QStateMachine。 我是 Qt 的新手,这是我第一次使用对象,所以我犯了很多逻辑错误,所以使用 QStateMachine 是个大问题...... 这是唯一的方
我的程序中有一个 QStateMachine 实例。我在它的构造函数中配置它的状态、转换和初始状态。当然,我在构造函数中启动它。 this->stateA = new StateA(this); th
为了根据转换设置对象属性,我需要两个可以立即进一步转换的中间状态: A initial state Ta Tb different transitions Aa Ab
我想用 QStateMachine 创建一个无限循环,其中我还需要动画。 QColor leastTransparent, mostTransparent = color(); leastTransp
我正在考虑使用 QStateMachine 在游戏的菜单屏幕之间进行转换。但是,我不确定如何在发生状态转换时启动一些代码(例如 show() a QWidget)。我可以使用普通的旧信号很容易地做到这
以下代码由于内存损坏而导致崩溃。我假设这是因为 delete pTestStateMachine 试图删除未在堆中分配的内存。对吗? 如果是这样,是否意味着 QStateMachine::addSta
我正在尝试弄清楚如何将我自己的自定义信号与 QStateMachine 结合使用。我从 here 中的一个简单示例开始。现在我正在尝试创建一个新信号 mysignal 并触发它的转换。但我不知道如何构
我有这个 Projekt,它使用 QStatemachine 来管理 UI,我想在其中添加自定义列表。 UI 应该只由关键事件操作。据我了解,我需要在 qml 端有一个 ListView。 ListV
我的问题如下:我需要创建包含 QStateMachine 实例的类。此类应该有插槽,您可以通过这些插槽“请求”状态机转换到另一个状态。如果转换成功,我的类(class)应该发出有关它的信号。我将如何实
我目前正在移植 small application从 PyGTK 到位于系统托盘中的 PySide,它会定期检查服务器的更新。 当我最初写这篇文章时,我使用了一个自定义状态模型来表示它的行为: ini
我正在构建一个主要采用顺序流程但也有一些替代路径的程序。我认为状态机可能是最简单的实现方式,因为 Qt 提供了这样一个类:QStateMachine (另见 API)。 不过,我的状态好像挺多的(20
我正在尝试在 Qt (C++) 中实现状态机。如何检查 QStateMachine 的当前状态?我在文档中找不到方法。 谢谢 最佳答案 你试过QStateMachine::configuration(
有一个状态机(称为外部)。这台机器有两个状态——第一个和最后一个。第一个状态是自定义实现的。在第一个状态中创建了另一个状态机(称为内部状态机),在本例中它什么也不做。 具有两个状态的外部状态机:
我正在制作一个应用程序的原型(prototype),我想从应用程序的 C++ 端的 QStateMachine 控制 QML UI 转换。为了使事情更简单,我们可以说 QML UI 由多个页面组成,这
所以我试图了解 Qt 的 QStateMachine 的一个问题,我希望有人能帮助解释为什么会这样。我对 QStateMachine 的基本理解非常感兴趣,而不仅仅是修复。 首先考虑具有状态 A、B
我是一名优秀的程序员,十分优秀!