重写QGraphicsTextItem偶现不能接收keyPressEvent

9 篇文章 1 订阅

问题描述

重写了QGraphicsTextItem,鼠标双击时进入编辑状态,发现有时接收不到键盘响应事件,重新双击一下又可以了,这就诡异!
要是一次都收不到还能理解,这收不到重新双击一下又可以了我就不理解


原因分析:

网上说的设置QGraphicsItem::ItemIsFocusable肯定都有啊,不然一次都编辑不了;
另外,网上有人说必须实现boundingRect()和shape(),如果为空就接收不到键盘事件,这个QGraphicsTextItem自己实现了,我打印出来都有啊,真的不理解;

后来我无意中打印了一下focus的状态,发现不能接收时focus为false,能接收时为true?双击事件时设置一下focus就行了。
我真不理解,下图这状态focus为false,难道是第一下点击设置了焦点,第二下点击又把焦点取消了?

在这里插入图片描述


解决方案:

源码如下:

void TextItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
{
    // 设置可编辑状态
    if (textInteractionFlags() == Qt::NoTextInteraction)
    {
        this->setTextInteractionFlags(Qt::TextEditorInteraction);
        
        // 增加焦点,防止有时双击时没有焦点,不能接收键盘事件keyPressEvent
        this->setFocus();
    }

    return QGraphicsTextItem::mouseDoubleClickEvent(event);
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 可能是以下原因导致qt keypressevent不触发: 1. 没有正确重写keyPressEvent函数,或者函数名拼写错误。 2. 没有设置QWidget的焦点,导致无法接收键盘事件。 3. 键盘事件被其他控件(如QLineEdit)捕获了,导致无法传递到父控件。 4. 操作系统或其他程序占用了键盘事件,导致无法传递到应用程序。 解决方法: 1. 确认是否正确重写keyPressEvent函数,并检查函数名是否正确。 2. 设置QWidget的焦点,使其能够接收键盘事件。 3. 确认其他控件是否捕获了键盘事件,如果是,可以通过设置控件属性或使用事件过滤器来解决。 4. 关闭其他程序或操作系统中占用键盘事件的程序,或者使用其他键盘事件。 ### 回答2: 在Qt中,键盘事件是通过继承QWidget或QMainWindow类来捕获和处理的。如果QtkeyPressEvent()函数无法触发,可能是因为没有正确地实现或重写它。 首先要确定的是,是否正确的继承了QWidget或QMainWindow类,以及在你的代码中是否实现和重写keyPressEvent()函数。通常,如果你没有重写该函数,那么什么也不会发生。这就是为什么这个函数没有触发的原因之一。 另一个常见的原因是,QWidget或QMainWindow没有获得焦点(focus)。在这种情况下,你需要设置它们的焦点,这可以通过调用QWidget的setFocusPolicy()函数来完成(例如 setFocusPolicy(Qt::StrongFocus);)。如果Widet没有获得焦点,那么键盘事件就不会被传递给widget,导致keyPressEvent()函数不会被触发。 此外,还有可能是你的键盘事件被其他组件或Widget所吞噬了。这意味着另一个组件已经在使用keyPressEvent()事件了,而你的widget无法获得该事件。在这种情况下,可能需要将该事件重新发送给你的widget,以便你可以正确处理键盘按键事件。你可以通过调用QApplication::sendEvent()函数事件重新发送。 综上所述,Qt中的keyPressEvent()事件没有触发的可能原因有很多,但最常见的包括没有正确地实现和重写该事件函数、QWidget或QMainWindow没有获得焦点,以及该事件被其他组件或Widget所吞噬。如果你的问题无法通过简单的调试解决,你可能需要深入研究Qt的事件处理机制。 ### 回答3: QtkeyPressEvent(键盘按键事件)是一个特别重要的事件,它可以用来执行所有基于键盘交互的任务。但是,如果发现keyPressEvent不起作用,可能会经历一些不必要的困难。下面是一些可能导致Qt keyPressEvent不触发的原因和解决方法。 1. 未安装事件处理器 事件处理器是一个对象,它可以用来处理触发的事件。如果键盘按键事件未被Qt视为特别事件,则可能无法触发。要解决这个问题,您需要在主窗口中安装事件处理程序,以便事件得到正确的处理。可以使用以下代码安装事件处理器: ```cpp this->installEventFilter(handler); ``` 其中,handler是一个QObject的指针,表示事件处理器的对象。 2. 键盘焦点问题 如果窗口没有键盘焦点,则键盘按键事件将无法触发。可以使用以下代码为窗口设置键盘焦点: ```cpp this->setFocusPolicy(Qt::StrongFocus); this->setFocus(); ``` 3. 虚拟键盘问题 在某些情况下,虚拟键盘可能会干扰keyPressEvent的触发。这可以通过将虚拟键盘的输入连接到原始键盘事件来解决: ```cpp this->setAttribute(Qt::WA_InputMethodEnabled, true); ``` 4. 事件过滤器问题 事件过滤器可能会在某些情况下阻止keyPressEvent的触发,例如,如果事件过滤器已经处理了一个键盘按键事件,该事件就不会传递给keyPressEvent函数。要解决这个问题,可以查看事件过滤器,并确保它们正确处理键盘事件。 总的来说,以上是一些可能导致Qt keyPressEvent不触发的原因和解决方法。如有问题请及时处理,以确保代码的正常运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Li_Zhi_Yao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值