检测QT QPlainTextEdit小部件上的初始/条目单击

检测QT QPlainTextEdit小部件上的初始/条目单击,qt,keyboard,Qt,Keyboard,我想检测到对QPlainTextEdit小部件的点击。最终目标是推出一个虚拟键盘小部件。顺便说一句,QPlainTextEdit小部件在QT用户界面文件中描述,并由QUiLoader加载。我已尝试为QPlainTextEdit小部件安装事件处理程序,以便捕获QEvent::FocusIn事件。不幸的是,此事件被反复触发,而不是一次 注意:我使用的是Qt4.8 更新 我发现了一个演示如何为文本输入小部件启动软件输入面板的示例。不幸的是,输入面板在打开后立即关闭。基本上,事件QEvent::Clos

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

注意:我使用的是Qt4.8

更新
我发现了一个演示如何为文本输入小部件启动软件输入面板的示例。不幸的是,输入面板在打开后立即关闭。基本上,事件
QEvent::CloseSoftwareInputPanel
QEvent::RequestSoftwareInputPanel

之后立即触发。如果您只想检测鼠标按下事件,请在小部件的
viewport()
小部件上安装事件过滤器。有关更多详细信息,请参阅
QAbstractScrollArea
docs

通常,事件中的焦点不能重复发生。您可能为一个小部件多次调用了
installEventFilter


可能您仍然可以在事件中使用FocusIn并以某种方式忽略重复事件。

解决方案是触发
QEvent::RequestSoftwareInputPanel
事件(请参阅)


你的方法是正确的。尝试为FocusIn和FocusOut添加调试输出。可能是小部件正在获得和失去焦点。您是否检查
eventFilter(对象,事件)
中的
object
参数?可能是您遇到了来自另一个筛选对象的焦点事件。您是对的。小部件正在获得和失去焦点(我想知道为什么)。顺便说一句,
QEvent::MouseButtonPress
未在
QPlainTextEdit
小部件上引发(我已尝试)。未多次为同一对象注册事件筛选器(我已检查)。我已尝试为
QPlainTextEdit
qabstractscrollare
安装事件筛选器,奇怪的是,事件筛选器的object参数无法强制转换为这两个类中的任何一个。是否使用
qobject\u cast
强制转换?试着用它。我一直在查文件。有
QInputMethod
类可用于查询虚拟键盘。我仍在想如何使用它。
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 );
}