qt 输入框禁止window 10键盘弹出

  • QT 输入框
  • window禁用输入法

首先要说,window 10系统对于开发不是很友好,自以为很智能其实就是到处挖坑,好多功能比上不足比下有余。注定windowPhone的失败。

QT 输入框

这几天在用QT做项目,遇到键盘问题。项目是用在window 10 平板。手指点击输入框window自带的键盘就会弹出,而且会遮挡界面,window键盘找不到任何接口,不支持定制,透明度不能调,大小不能调。最可气的是点击输入框毕弹出,遮挡自己写的键盘,又不能关闭触屏弹出键盘。

经过多次多次测试,发现把当前窗口设置焦点,让输入框失去焦点,系统键盘就会退出,然后手动设置输入框为焦点。想想是不是很好呀,只是猜测,还要明天去公司验证。

或者在view层对点击事件进行拦截不让点击事件传入输入框内,然后手动设置输入框为焦点。

window禁用输入法

测试发现只要点击的位置位于输入框区间内,就算把所有事件都拦截(输入框已经无法绘制出来了),系统键盘照样弹出,真想骂人!!!看来拦截事件是行不通了。
只能上笨办法了,在输入框位置绘制一个遮罩,遮罩只能使用Qt::Tool类型窗口,而且不能有继承或者同父类。创建一个透明按钮绘制在输入框上面只会是一片黑。因为是置顶遮罩,存在界面切换需要隐藏遮罩,所以还定义了一个单例通知类,关于键盘可以看我的另外一篇博客。

#pragma once#include <QLineEdit>
#include <QDebug>
#include <QTimer>
#include <QPoint>
#include <QMouseEvent>
#include "KeyBoard.h"#ifdef WIN32
#include <windows.h>
#endif
//代理类,接收/发送信号
class SignalSwitech : public QObject
{Q_OBJECTsignals:void signalClearFocus();void signalUpdate();void signalHideMaskEffect(bool isHide);public:static SignalSwitech* Instance();void clearFocus() { emit signalClearFocus(); }void setIMM(bool b) { mUseIMM = b; }bool useIMM() { return mUseIMM; }void update() { emit signalUpdate(); };void hideMaskEffect(bool isHide) { emit signalHideMaskEffect(isHide); }private:SignalSwitech() {};virtual ~SignalSwitech() {};private:static SignalSwitech *mInstance;bool mUseIMM = false; //是否使用过IMM来控制键盘弹出/隐藏
};
//遮罩
class MaskEffect : public QWidget
{Q_OBJECTpublic:MaskEffect(QWidget *masked); // 必须无父窗口,所以传给基类为nullptrvirtual ~MaskEffect();public:public slots:void updateView();void hideMaskEffect(bool isHide);protected:bool eventFilter(QObject* target, QEvent* ev) override;virtual void showEvent(QShowEvent *event) override;private:QWidget *mMaskedWidget = nullptr; //被遮罩控件QRect mScreenRect;QTimer *mTimer = nullptr;
};//输入框
class FXLineEdit : public QLineEdit
{Q_OBJECTpublic:FXLineEdit(QWidget *parent = nullptr);virtual ~FXLineEdit();public:/*强制系统键盘为英文输入法*/void setEnglishInputMethod(bool isEn = false);/*是否开启遮罩*/void setMaskEffect(bool isEffect = true);/*自定义键盘输入法*/void setIMMode(int IMMode = 0);/*显示输入框即显示键盘*/void setStartShowKB(int showKB);/*禁用系统输入法*/void disableSysIME();protected:bool eventFilter(QObject* target, QEvent* event) override;void showEvent(QShowEvent *event) override;public:
signals:void signalClose();/*通知系统键盘弹出*/void signalSysKBShow(const bool& isShow = false);private:
#ifdef WIN32HKL hCurKL = NULL;
#endifKeyBoard *mKeyboard = nullptr;int mIMMode = -1;//键盘类型具体可见键盘类KeyBoard.hbool mStartShowKB = false;//首次进入输入框处于焦点状态即显示键盘bool mIsEnglishIM = false;//是否开启英文输入法bool mIsEffect = false; //是否开启遮罩MaskEffect *mMaskEffect = nullptr;
};
#include <QApplication>
#include <QProcess>
#include <QFileInfo>
#include <QDesktopWidget>
#include <QMainWindow>
#include <QDesktopServices>
#include "FXLineEdit.h"#ifdef WIN32
#include <imm.h>
#pragma comment(lib, "imm32.lib ")
#endifSignalSwitech* SignalSwitech::mInstance = nullptr;SignalSwitech* SignalSwitech::Instance()
{if (mInstance == nullptr){mInstance = new SignalSwitech();}return mInstance;
}///- MaskEffect -///MaskEffect::MaskEffect(QWidget *masked) : QWidget(nullptr) // 无父窗口,所以传给基类为nullptr
{this->setWindowTitle("MaskEffect");QDesktopWidget* desktopWidget = QApplication::desktop();mScreenRect = desktopWidget->screenGeometry();Q_ASSERT(masked != nullptr);mMaskedWidget = masked;this->setAttribute(Qt::WA_DeleteOnClose);//初始化窗口属性this->setWindowOpacity(0.1);  //达到比较好的淡出效果,需要将窗口设置完全透明,否则会有卡顿的效果this->setWindowFlags(Qt::Window | Qt::WindowTitleHint | Qt::FramelessWindowHint | Qt::Tool | Qt::WindowDoesNotAcceptFocus | Qt::WindowStaysOnTopHint);this->setStyleSheet("background: white;");this->setFocusPolicy(Qt::FocusPolicy::NoFocus);this->installEventFilter(this);connect(SignalSwitech::Instance(), &SignalSwitech::signalUpdate, this, &MaskEffect::updateView);connect(SignalSwitech::Instance(), &SignalSwitech::signalHideMaskEffect, this, &MaskEffect::hideMaskEffect);
}void MaskEffect::hideMaskEffect(bool isHide)
{if (isHide){this->hide();SignalSwitech::Instance()->clearFocus();//清除输入框焦点}else{this->show();updateView();}
}MaskEffect:: ~MaskEffect()
{disconnect(SignalSwitech::Instance(), &SignalSwitech::signalUpdate, this, &MaskEffect::updateView);disconnect(SignalSwitech::Instance(), &SignalSwitech::signalHideMaskEffect, this, &MaskEffect::hideMaskEffect);this->removeEventFilter(this);
}bool MaskEffect::eventFilter(QObject* target, QEvent* ev)
{switch (ev->type()){case QEvent::Paint:case QEvent::Timer:case QEvent::ToolTip:break;default://qDebug() << "eventFilter" << ev->type();break;}switch (ev->type()){//case QEvent::HoverMove://case QEvent::MouseMove://case QEvent::InputMethodQuery://case QEvent::FocusIn://case QEvent::Enter: //初始化会发送这些事件导致键盘弹出//case QEvent::TouchBegin://case QEvent::MouseButtonPress:case QEvent::MouseButtonRelease:{QPoint p = this->mapFromGlobal(QCursor::pos());//鼠标位置QMouseEvent me(QMouseEvent::MouseButtonRelease, p, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);QCoreApplication::sendEvent(mMaskedWidget, &me);mMaskedWidget->setEnabled(true);mMaskedWidget->setFocus();}break;default:break;}return QWidget::eventFilter(target, ev);
}void MaskEffect::showEvent(QShowEvent *event)
{if (mMaskedWidget == nullptr){return;}QRegion region = mMaskedWidget->visibleRegion();QRect rect = region.boundingRect();QPoint p = mMaskedWidget->mapToGlobal(rect.topLeft());qDebug() << p;qDebug() << rect;this->move(p);this->setFixedSize(rect.size());
}void MaskEffect::updateView()
{if (mMaskedWidget == nullptr){return;}QRegion region = mMaskedWidget->visibleRegion();QRect rect = region.boundingRect();QPoint p = mMaskedWidget->mapToGlobal(rect.topLeft());qDebug() << p;qDebug() << rect;this->move(p);this->setFixedSize(rect.size());
}- FXLineEdit -//FXLineEdit::FXLineEdit(QWidget *parent) : QLineEdit(parent)
{this->setObjectName("FXLineEdit");this->installEventFilter(this);this->setStyleSheet("background-color:rgb(255,255,255);");//this->setAttribute(Qt::WA_InputMethodEnabled, false);
}FXLineEdit::~FXLineEdit()
{if (mMaskEffect != nullptr){delete mMaskEffect;mMaskEffect = nullptr;}this->clearFocus();this->removeEventFilter(this);#ifdef WIN32HWND hWnd = ::FindWindow(L"IPTip_Main_Window", NULL);if (hWnd){::PostMessage(hWnd, WM_SYSCOMMAND, SC_CLOSE, 0); //关闭键盘}
#endifif (nullptr != mKeyboard){delete mKeyboard;mKeyboard = nullptr;}
}void FXLineEdit::disableSysIME()
{#ifdef WIN320SignalSwitech::Instance()->setIMM(true);// 屏蔽系统键盘HWND hWnd = (HWND)this->winId();HIMC _IMC = ImmGetContext(hWnd);if (hWnd && IsWindow(hWnd)){ImmAssociateContext(hWnd, NULL);ImmSetOpenStatus(_IMC, FALSE);if (!ImmReleaseContext(hWnd, _IMC)){qDebug() << "ImmReleaseContext call failed!";}}
#endif // WIN32
}void FXLineEdit::setMaskEffect(bool isEffect)
{mIsEffect = isEffect;connect(SignalSwitech::Instance(), &SignalSwitech::signalClearFocus, this, [=](){this->clearFocus();this->setDisabled(true);if (mKeyboard != nullptr){mKeyboard->hide();mKeyboard->close();delete mKeyboard;mKeyboard = nullptr;}});
}void FXLineEdit::setEnglishInputMethod(bool isEn)
{mIsEnglishIM = isEn;
}void FXLineEdit::setIMMode(int IMMode)
{mIMMode = IMMode;mKeyboard = new KeyBoard(nullptr, IMMode);mKeyboard->BindingEdit(this);
}void FXLineEdit::setStartShowKB(int showKB)
{mStartShowKB = showKB;
}void FXLineEdit::showEvent(QShowEvent *event)
{if (mIsEffect){if (mMaskEffect == nullptr){mMaskEffect = new MaskEffect(this);mMaskEffect->show();}}if (this->hasFocus() && mStartShowKB){mKeyboard->show();}
}bool FXLineEdit::eventFilter(QObject* target, QEvent* ev)
{switch (ev->type()){case QEvent::Paint:case QEvent::Timer:case QEvent::ToolTip:break;default:SignalSwitech::Instance()->update();qDebug() << "FXLineEdit::eventFilter " << ev->type();break;}switch (ev->type()){//case QEvent::TouchBegin://case QEvent::MouseButtonPress:case QEvent::MouseButtonRelease:{if (mIsEffect){//根据鼠标位置设置光标位置QMouseEvent* me = static_cast<QMouseEvent*>(ev);this->setCursorPosition(this->cursorPositionAt(me->pos()));}if (mIMMode > -1){#ifdef WIN32HWND hWnd = ::FindWindow(L"IPTip_Main_Window", NULL);if (hWnd){::PostMessage(hWnd, WM_SYSCOMMAND, SC_CLOSE, 0); //关闭键盘}
#endifif (nullptr == mKeyboard){mKeyboard = new KeyBoard(nullptr, mIMMode);mKeyboard->BindingEdit(this);}mKeyboard->show();}else if (mIsEnglishIM || this->echoMode() == QLineEdit::Password || this->echoMode() == QLineEdit::PasswordEchoOnEdit)//强制系统键盘为英文输入法{#ifdef WIN32if (SignalSwitech::Instance()->useIMM()){QString programFilesPath(qgetenv("PROGRAMFILES").replace("\\", "/"));QString tabTipPath = QString("%1/Common Files/microsoft shared/ink/TabTip.exe").arg(programFilesPath);if (QFileInfo(tabTipPath).exists()) {QDesktopServices::openUrl(QUrl("file:///" + tabTipPath));}}hCurKL = GetKeyboardLayout(0);LoadKeyboardLayout((LPCWSTR)QString("0x0409").utf16(), KLF_ACTIVATE);
#endifemit signalSysKBShow(true);}}break;default:break;}switch (ev->type()){case QEvent::Hide:case QEvent::FocusOut:case QEvent::FocusAboutToChange: // 使用此控件界面主动清除输入焦点{if (mIMMode > -1){this->setEnabled(false);if (nullptr != mKeyboard){mKeyboard->hide();mKeyboard->close();delete mKeyboard;mKeyboard = nullptr;}}
#ifdef WIN32if (SignalSwitech::Instance()->useIMM()){HWND hWnd = ::FindWindow(L"IPTip_Main_Window", NULL);if (hWnd){::PostMessage(hWnd, WM_SYSCOMMAND, SC_CLOSE, 0); //关闭键盘}}else if (hCurKL != NULL){ActivateKeyboardLayout(hCurKL, 0); //还原输入法}
#endif}break;case QEvent::Leave:case QEvent::HoverLeave: //不能用此事件作为输入框失去焦点,因为点击键盘也会发出此消息break;case QEvent::FocusIn:break;default:break;}return QWidget::eventFilter(target, ev);     // 最后将事件交给上层对话框
}

使用

 FXLineEdit *lineEdit = new FXLineEdit(this);lineEdit->setFixedSize(100,60);lineEdit->setFont(DimensionAdapter::Instance()->getFont(FONT_LIST_CONTENT));lineEdit->setAutoFillBackground(true);lineEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);lineEdit->setStyleSheet("background:white;border-width:2px;border-color:black;");lineEdit->disableSysIME();lineEdit->setMaskEffect(true);

window 10 可以通过禁用输入法来实现禁止键盘弹出测试发现部分系统下可以

#ifdef WIN32// 通过禁止所有输入法达到屏蔽系统键盘HIMC _IMC;HWND hWnd = (HWND)this->winId();_IMC = ImmGetContext(hWnd);if (hWnd && IsWindow(hWnd)) {ImmAssociateContext(hWnd, NULL);ImmReleaseContext(hWnd, _IMC);}
//启用
ImmAssociateContext(hWnd, _IMC);
#endif // WIN32

QT 输入框禁止window10触摸屏弹出键盘相关推荐

  1. 移动端输入框弹出键盘控制

    在移动端,我们公司通过输入框主要收集用户的姓名和电话,以下是对输入框获取焦点时,控制弹出键盘的样式来增强用户体验. 输入姓名 我们的用户都是中国人,输入用户名为中文,所以弹出键盘是输入中文状态即可,这 ...

  2. 移动端点击输入框,弹出键盘,底部被顶起问题(vue)

    这个问题相信做移动端开发的童鞋会有深刻体会,以前用jq开发时就很头疼这个问题,每次底部footer部分需要用position:fixed,如果页面内容不是很长,没有超出屏幕范围,那就还好,没有问题:一 ...

  3. Unity实现在Android或IOS端点击【InputField】输入框弹出键盘上的内容默认处于选中状态

    Unity实现在Android或IOS端点击[InputField]输入框弹出键盘上的内容默认处于选中状态 最终效果如: 上代码 using UnityEngine.EventSystems;/// ...

  4. Android学习问题:关于AlertDialog中自定义布局带有的EditText无法弹出键盘

    最近在用到AlertDialog的时候,自定义了其布局文件,其中带有EditText,但是发现在手机上使用的时候,点击EditText却没有弹出键盘,在网上搜索了下,看到有好几种解决方法,试过其中一些 ...

  5. 弹出键盘,UIView 上移

    声明 欢迎转载,但是请尊重作者劳动成果,转载请保留此框内声明,谢谢. 文章出处:http://blog.csdn.net/iukey //------------------------------- ...

  6. Flutter 弹出键盘报错解决

    Flutter 弹出键盘报错解决 错误原因 报错页面: 错误原因: 当一个页面的内容不能全部展示出来时,就会出现这种错误.其实这里如果没有键盘弹出,内容长度超过屏幕可显示范围,同样会报错. 解决方法 ...

  7. 苹果手机屏幕尺寸和弹出键盘高度总结

    最近做一个苹果手机界面,遇到输入框被弹出键盘挡住的问题,安卓手机不会出现这种情况,于是就总结了一下苹果手机的屏幕尺寸和弹出键盘的大小. iPhoneX 屏幕大小:5.8寸 屏幕尺寸:375 x 812 ...

  8. jquery监听pda 按键_js 点击input焦点不弹出键盘 PDA扫描枪

    直接贴代码 1.利用input readonly属性 当input有readonly属性的时候,即使获取焦点,也不会吊起小键盘 扫码枪输入的间隔大概在15-60毫秒,然后手动输入的100-200毫秒之 ...

  9. js 点击input焦点不弹出键盘 PDA扫描枪直接贴代码

    1.利用input readonly属性 当input有readonly属性的时候,即使获取焦点,也不会吊起小键盘 扫码枪输入的间隔大概在15-60毫秒,然后手动输入的100-200毫秒之间 onfo ...

  10. 判断手机是否弹出键盘,改变了手机页面高度,对应inputStatus的状态改变相关控件的大小和位置

    inputResizeBodyHeight() {// 判断手机是否弹出键盘,改变了手机页面高度,对应inputStatus的状态改变相关控件的大小和位置var oldHeight =document ...

最新文章

  1. 事务复制提示初始快照不可用_谈谈数据库的事务ACID
  2. [总结] 平衡树总结
  3. unityscrollview生成大量_superscrollviewforUGUI的一些使用心得
  4. (5)FPGA面试技能提升篇(SDK开发环境)
  5. 60级怀旧服最新服务器人口排名,魔兽世界怀旧服10月最新人口普查详情 各大服务器阵营详细比例...
  6. 剑指offer之对称的二叉树
  7. cad2020打印样式放在哪个文件夹_2019年中级考试准考证打印时间!错过将无法参加考试...
  8. 微服务网关选型,请收下我的膝盖!
  9. 未来计算机源消能耗,磁微处理器挑战计算机最低能耗极限
  10. android获取屏幕像素密度DPI,与density
  11. 泉城济南——三妮儿暴走一日游
  12. 酷开系统壁纸模式,百变画作颠覆想象
  13. Numpy学习之——numpy.mean中axis参数用法
  14. 用vba创建图表分析上市公司财报
  15. 嵌入式linux实验截图,嵌入式linux实验二.pdf
  16. Django框架学习收藏
  17. [tensorflow] 关于 seed
  18. 鸿蒙和ios流畅对比,鸿蒙OS对比iOS,华为再次“超越”,流畅度大幅领先苹果!...
  19. qt官网下载指导(新手易犯错误)
  20. html课堂笔记,Day1-课堂笔记-HTML

热门文章

  1. [前端案例]百行代码实现炫酷时钟
  2. 混沌数学之Chua's circuit(蔡氏电路)
  3. 免费简单的为域名申请SSL证书
  4. Android使用VAD检测是否说话
  5. (C++)实现简单分数相加
  6. 回环检测之DBoW2
  7. Power BI 中的货币换算
  8. (function(){})() 理解
  9. Vue + qiankun框架 样式混乱问题的解决办法
  10. 增量式编码器和绝对式编码器