0

我对 QMouseEvent 有疑问:

void Gioco::gioco_G1()
{
QMouseEvent *mouse = new QMouseEvent;
bool stato = false;

do
{
    if (mouse->KeyPress() == Qt::MouseButton::LeftButton) {
        qDebug()<<"entra nell'if";
        if (img_mano1G1 -> isUnderMouse()) {giocata_G1 = manoG1[0]; stato = true;}
        else if (img_mano2G1 -> isUnderMouse()) {giocata_G1 = manoG1[1]; stato = true;}
        else if (img_mano3G1 -> isUnderMouse()) {giocata_G1 = manoG1[2]; stato = true;}
    }

} while (stato == false);   //repeat until I enter an if
}

我创建了一个场景,并在场景中插入了一些 QGraphicsPixmapItem。现在我想在单击指定的 QGraphicsPixmapItem 时输入“if”。

例如,当我单击 img_manoG1 时,我想输入第一个“if”

如何告诉程序停止并等待鼠标输入?

TI 是 Qt 的新手,这是我第一次使用这些对象,所以我犯了很多逻辑错误,所以使用 QStateMachine 这是一个大问题......

这是唯一的方法吗?我试着解释我的程序:

我想创建一个纸牌游戏,在以前的版本中,我使用了一个带有以下命令序列的旧图形库:

-> print cards on the scene 
-> wait for a mouse input (with a do-while)
-> if(isMouseClick(WM_LBUTTONDOWN)) 
-> if(mouse position is on the first card) 
-> select that card. So i wish to do the same thing with QGraphics. 

这样我告诉程序:

-> print cards 
-> wait for a mouse event 
-> print the card that I've selected with that event. 

现在我想改变程序图形,我已经介绍了 QGraphics。我创建了一个场景并在其上打印所有对象“卡片”,所以现在我想告诉程序:

-> print the object and wait the mouse input
-> if a card is to selected with the left clik
-> print that card in scene, wait 1/2 second and go ahead with the program

问题是我使用for1 到 20(我必须在一场比赛中跑 20 次)。我尝试使用随机的 G1 和 COM 播放来启动程序,但应用程序冻结到最后一次执行,for并且我在场景上仅打印卡的最后配置。这就是原因,因为之前我说过我希望程序停止......

没有 QStateMachine 可以吗?简单地告诉他:“暂停”,打印这种情况,等待鼠标继续?

4

1 回答 1

1

既然您自己创建了默认构造的鼠标事件,为什么您希望它包含任何可用数据?

要处理事件,您必须重写相关的事件处理程序虚方法。在您的情况下,您可能希望覆盖QGraphicsScene::mousePressEvent派生场景类中的 。

如何告诉程序停止并等待鼠标输入?

您不希望程序停止。停止的程序实际上是冻结的,并且不接受用户输入,这将毫无用处。您的while循环会产生这种效果 - 它永远不会终止,因为它从不接受任何事件。

您要做的是更改 UI 的状态,以便它实现您的“停止”行为。您真正想要的是对鼠标单击做出反应,无论何时发生,只要您的 UI 处于应该接受鼠标单击的状态。因此,您应该设计一个状态机来表示程序的用户界面应采用的状态和转换,然后将该状态机实现为显式QStateMachine或隐式地使用通常的“意大利面条”方法在事件处理程序中单独处理各种状态,并将状态表示为enum.

为此,您大致需要执行以下步骤:

  1. 决定交互中涉及哪些 UI 对象(QWidget和实例)。QGraphicsItem任何需要改变其行为的事情都涉及到。

  2. 将 UI 的行为划分为状态机,在最简单的级别划分为一组不相交的状态(非分层机器)。

  3. 决定你希望在每个状态下发生哪些行为变化。

  4. 实现一个状态变量来表示当前状态:要么作为 a 的配置QStateMachine,要么作为enum. 对于QStateMachine,每个状态都是一个QState实例。对于 a enum,每个状态都是枚举的值。

  5. 实现状态转换的行为变化。QStateMachine将允许一种更具声明性的方法,您可以说“在进入/离开此状态时,更改对象的以下属性”和“在该对象接收到此事件时,执行此操作”。基于- 的实现要求您通过覆盖 -派生类enum中的事件处理程序来显式处理事件。QObject

阅读Qt State Machine Framework,它是对 UML Statecharts 的一个很好的介绍,它将帮助您以更正式、更规范的方式思考 UI 的行为——即使您不使用特定的实现UML 状态图。

于 2016-06-01T20:53:28.443 回答