Qt使用系统自带软键盘

202 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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")  //调用软键盘使用

这句是最重要的,它必须存在,否则会出现软键盘调用不成功。