尝试使用 QMouseEvent

try to use QMouseEvent

我对 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"

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

我是 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。 我已经创建了一个场景并在上面打印了所有对象 "card" 所以现在我想告诉程序:

-> 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

问题是我使用 for 1 到 20(我必须 运行 在一场比赛中使用 20 次)。 我尝试使用随机 G1 和 COM 播放来启动程序,但应用程序冻结,直到最后一次执行 for 并且我只在现场打印卡片的最后配置。 这是因为之前我说过我要程序停止...

可以不用 QStateMachine 吗? 简单的告诉他:"pause",打印这个情况,等鼠标继续?

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

要处理事件,您必须覆盖相关的事件处理程序虚拟方法。在您的情况下,您可能希望在派生场景 class.

中覆盖 QGraphicsScene::mousePressEvent

How can I tell the program to stop and wait for the mouse input ?

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

您要做的是更改 UI 的状态,以便它实现您的 "stopped" 行为。您真正想要的是 对鼠标点击作出反应 ,只要它发生,当且仅当您的 UI 处于应该接受鼠标点击的状态。因此,您应该设计一个状态机来表示您的程序的用户界面应该采用的状态和转换,然后将该状态机实现为显式 QStateMachine,或隐式使用通常的 "spaghetti" 处理方法事件处理程序中的各种状态,并将状态表示为 enum.

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

  1. 决定哪些UI对象(QWidgetQGraphicsItem实例)参与交互。涉及任何需要改变其行为的东西。

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

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

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

  5. 对状态转换实施行为更改。 QStateMachine 将允许更具声明性的方法,您可以在其中说 "on entering/leaving this state, change the following properties of objects" 和 "on receiving this event by that object, do that"。基于 enum 的实现要求您通过覆盖 QObject 派生的 classes.

  6. 中的事件处理程序来显式处理事件

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