故障现象:
程序运行时,只要有焦点事件,输入法的软键盘就弹出(该软键盘的弹出控制见:PinyinImpl.cpp, 第159行。
下面是该软键盘弹出控制函数:
void QPinyinImpl::updateHandler(int type)
{
switch(type)
{
case QWSInputMethod::FocusOut:
m_showForm->hide();
m_qvkeybord->hide();
m_pinyin_frame->releaseKeyboard();
m_pinyin_frame->resetState();
m_pinyin_frame->m_engine.save_table();
isWork = false;
break;
case QWSInputMethod::FocusIn: //此处为PinyinImpl.cpp, 第159行
m_showForm->show();
if(qvKeybordShow) m_qvkeybord->show();
m_pinyin_frame->grabKeyboard();
isWork = true;
break;
default:
break;
}
}
当ui界面上的QLineEdit获得焦点事件时,软键盘弹出是正确的,能够在QLineEdit上实现输入法。
现在的问题是:当其他widget ,比如点击界面上的fontComboBox 或者sizecombobox,使焦点事件移到这两个输入框,准备选择字体或尺寸的时候,由于PinyinImpl.cpp, 第159行
控制的软键盘也同时弹出,导致上面的×Combobox缩回,无法进行选择。
针对这个情况,想了三种可能的解决思路,
1.在软件中pmjedit.h 的public 中添加bool popup 检测焦点事件,当fontComboBox 或者sizecombobox获得焦点事件时,popup=true;在PinyinImpl.cpp 中调用popup,修改
PinyinImpl.cpp, 第159行的软件如下,并在PinyinImpl.h中添加pmjedit.h头文件后,
void QPinyinImpl::updateHandler(int type)
{
switch(type)
{
case QWSInputMethod::FocusOut:
m_showForm->hide();
m_qvkeybord->hide();
m_pinyin_frame->releaseKeyboard();
m_pinyin_frame->resetState();
m_pinyin_frame->m_engine.save_table();
isWork = false;
break;
case QWSInputMethod::FocusIn: //此处为PinyinImpl.cpp, 第159行
if(!popup){ m_showForm->show();
if(qvKeybordShow) m_qvkeybord->show();
m_pinyin_frame->grabKeyboard();
isWork = true;}
break;
default:
break;
}
}
无法编译通过,提示PinyinImpl.cpp中的popup没有定义。我试过 friend class ,static,都不行,也尝试在 PinyinImpl 中对PmjEdit 这个类进行实例化:PmjEdit pmj; 然后调用pmj.popup.实例化可以通过编译,但是编译后的结果无法在开发板上运行。针对第一种思路问题如下:如何在一个类中调用另一个类得函数?具体到我这个函数,应该如何调用呢?
2.添加事件过滤器。
对fontComboBox 和sizecombobox安装事件过滤器,现在的问题是:有没有可能通过事件过滤器来设置QWSInputMethod::FocusIn,当fontComboBox 或者sizecombobox获得焦点事件时,sentEvent(),使得QWSInputMethod::FocusIn改变为QWSInputMethod::FocusOut , 达到不弹出键盘,实现对fontComboBox 或者sizecombobox的弹出窗口的点选。
3.是不是可以设置fontComboBox 或者sizecombobox的某种属性,使其强制在最前面,直到选择完毕?如果可以,应该如何做?
附件中的是简单的例子源程序。在不考虑上述问题的情况下,已经在vm6.5,fc10 qt-4.5-forarm编译通过并在开发板上正常运行。
谢谢各位。