尝试使用 QMouseEvent
Posted
技术标签:
【中文标题】尝试使用 QMouseEvent【英文标题】:try to use QMouseEvent 【发布时间】:2016-06-01 16:50:22 【问题描述】:我遇到了 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
问题是我使用了 for
1 到 20(我必须在一场比赛中运行 20 次)。
我尝试使用随机 G1 和 COM 播放来启动该程序,但应用程序冻结,直到最后一次执行 for
并且我在现场仅打印卡的最后配置。
这就是原因,因为之前我说过我希望程序停止......
没有 QStateMachine 可以吗? 简单地告诉他:“暂停”,打印这个情况,等待鼠标继续?
【问题讨论】:
你提供的例子不是它应该的样子。见那里:codeprogress.com/cpp/libraries/qt/…,也许那里:youtube.com/watch?v=hO0u_pdTJKA 【参考方案1】:既然您自己创建了默认构造的鼠标事件,为什么您希望它包含任何可用数据?
要处理事件,您必须重写相关的事件处理程序虚方法。在您的情况下,您可能希望覆盖派生场景类中的 QGraphicsScene::mousePressEvent
。
如何让程序停止并等待鼠标输入?
您不希望程序停止。停止的程序实际上是冻结的,并且不接受用户输入,这将毫无用处。您的 while
循环会产生这种效果 - 它永远不会终止,因为它永远不会接受任何事件。
您要做的是更改 UI 的状态,以便它实现您的“停止”行为。你真正想要的是对鼠标点击做出反应,无论何时发生,只要你的 UI 处于应该接受鼠标点击的状态。因此,您应该设计一个状态机来表示程序的用户界面应该采用的状态和转换,然后将该状态机实现为显式QStateMachine
,或者隐式使用通常的“意大利面条”方法来单独处理各种状态事件处理程序,并将状态表示为 enum
。
为此,您大致需要遵循以下步骤:
决定交互中涉及哪些 UI 对象(QWidget
和 QGraphicsItem
实例)。涉及任何需要改变其行为的事情。
将您的 UI 行为划分为状态机,在最简单的级别划分为一组不相交的状态(非分层机器)。
决定您希望在每个状态下发生哪些行为变化。
实现一个状态变量来表示当前状态:或者作为QStateMachine
的配置,或者作为enum
。对于QStateMachine
,每个状态都是一个QState
实例。对于enum
,每个状态都是枚举的值。
在状态转换时实现行为更改。 QStateMachine
将允许一种更具声明性的方法,您可以说“在进入/离开此状态时,更改对象的以下属性”和“在该对象接收到此事件时,执行此操作”。基于enum
的实现要求您通过覆盖QObject
派生类中的事件处理程序来显式处理事件。
阅读Qt State Machine Framework,这是对 UML 状态图的一个很好的介绍,它将帮助您以更正式、更规范的方式思考 UI 的行为 - 即使您不使用该特定实现的 UML 状态图。
【讨论】:
以上是关于尝试使用 QMouseEvent的主要内容,如果未能解决你的问题,请参考以下文章
当我尝试使用 ansible ping 我的 VM 时,它会尝试 ping 服务器 ID 而不是 IP