【问题标题】:Detecting initial/entry click on QT QPlainTextEdit widget检测 QT QPlainTextEdit 小部件上的初始/输入点击
【发布时间】:2013-07-13 01:59:55
【问题描述】:

我想检测对QPlainTextEdit 小部件的点击。最终目标是启动一个虚拟键盘小部件。顺便说一句,QPlainTextEdit 小部件在 QT ui 文件中描述并由QUiLoader 加载。我尝试为QPlainTextEdit 小部件安装一个事件处理程序,以便捕获QEvent::FocusIn 事件。不幸的是,这个事件被反复触发,而不仅仅是一次。

注意:我使用的是 QT 4.8。

更新 我找到了tutorial/example,它显示了如何为文本输入小部件启动软件输入面板。不幸的是,输入面板在打开后立即关闭。基本上,QEvent::CloseSoftwareInputPanel 事件在QEvent::RequestSoftwareInputPanel 之后不久就会被触发。

【问题讨论】:

  • 你的方法是正确的。尝试为 FocusIn 和 FocusOut 添加调试输出。可能是小部件正在获得和失去焦点。您是否检查了eventFilter(object, event) 中的object 参数?可能是您遇到了来自其他过滤对象的焦点事件。
  • 你是对的。小部件正在获得和失去焦点(我想知道为什么)。顺便说一句,QEvent::MouseButtonPress 没有在 QPlainTextEdit 小部件上引发(我试过)。

标签: qt keyboard


【解决方案1】:

如果您只想检测鼠标按下事件,请在小部件的 viewport() 小部件上安装事件过滤器。有关详细信息,请参阅 QAbstractScrollArea 文档。

通常 FocusIn 事件不能重复发生。可能您为一个小部件多次调用installEventFilter

也许你仍然可以使用 FocusIn 事件并以某种方式忽略重复事件。

【讨论】:

  • 事件过滤器没有为同一个对象注册多次(我已经检查过)。我尝试为QPlainTextEditQAbstractScrollArea 安装一个事件过滤器,奇怪的是事件过滤器的对象参数不能转换为这两个类中的任何一个。
  • 您使用qobject_cast 投射吗?尝试使用它。
  • 一直在搜索文档。有QInputMethod 类可用于查询虚拟键盘。我仍在尝试弄清楚如何使用它。
【解决方案2】:

解决办法是触发QEvent::RequestSoftwareInputPanel事件(见also

void InputPanel::saveFocusWidget(QWidget *oldFocus , QWidget *newFocus )
{
    // check if newFocus is not null or top-level widget or previous widget
    // check if newFocus is QPlainTextEdit 
    QEvent event( QEvent::RequestSoftwareInputPanel );
    QApplication::sendEvent( newFocus , &event );
}

【讨论】:

    猜你喜欢
    • 2017-02-10
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-26
    • 1970-01-01
    • 2022-01-15
    • 2016-04-09
    相关资源
    最近更新 更多