持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第27天,点击查看活动详情 在做qt项目过程中,有的会使用到触控电脑,就会导致一个问题:没有键盘可以输入
,在这时就需要使用到软键盘(如果自身需要,可以自己写一个专用的软键盘),接下来的方法就是直接使用软键盘。
我们输入的输入框常用QLineedit,但是在QLineEdit类中没有直接的clicked信号,因此需要通过重写时间过滤器这个函数来实现我们的方法。`
.h内容
protected:
bool eventFilter(QObject *watched, QEvent *event);
需要在.h文件中继承事件过滤器eventFilter。
//事件绑定
ui->lineEdit->installEventFilter(this);
QLineEdit不能直接使用,需要设置installEventFilter,可以通过installEventFilter实现实时监控鼠标的动态(不是实时控制!)
bool Dlg::eventFilter(QObject * watched, QEvent * event)
{
bool nstate = false;
for (int i = 0; i < ui.tbWgt_Score->rowCount(); i++)
{
QLineEdit *edit = qobject_cast<QLineEdit*>(ui.tbWgt ->cellWidget(i, 4));//获取编辑框
if (watched == edit)
{
nstate = true;
break;
}
}
if (nstate && event->*type*() == QEvent::MouseButtonPress)
{
callKeyBoard();
}
return QWidget::eventFilter(watched, event);
}
在重写时间过滤器eventFilter函数的时候,必须要判断他当前鼠标的动作以及对应的控件,watched == edit 可以通过这句话判断当前是否是QLineEdit类,并且是不是设置过installEventFilter 的控件,。控件确定了以后还需要确定当前鼠标的状态,可以通过event->type() == QEvent::MouseButtonPress 这句来判断当前的鼠标是不是按压,也排除了移动悬浮等触发的指令。
void CExamTeacherScoreDlg::callKeyBoard()
{
*PVOID* OldValue;
BOOL bRet = *Wow64DisableWow64FsRedirection*(&OldValue);
QString csProcess = "C:\\Windows\\System32\\osk.exe";
QString params = "";
*ShellExecute*(NULL, L"open", (*LPCWSTR*)csProcess.utf16(), (*LPCWSTR*)params.utf16(), NULL, *SW_SHOWNORMAL*);
if (bRet)
{
*Wow64RevertWow64FsRedirection*(OldValue);
}
}
这个函数就是用于实现软键盘的调用,ShellExecute 函数主要用于打开外部程序,而这里的外部程序就是软键盘的程序。并且他可以对外部程序有一定的控制(就像我们按下单按键可以在我们的 QLineedit 中读取到)
#pragma comment(lib, "user32.lib") //调用软键盘使用
这句是最重要的,它必须存在,否则会出现软键盘调用不成功。