网站建设属于税收,建网站挣钱,建设部工程造价管理网站,开发区网站建设目录
1、前言
2、界面设计
3、英文、数字的输入
4、符号的输入
5、中文的输入
6、中文拼音库的选择
7、其他
8、结语 1、前言 使用QT C在带显示器的Linux系统 开发板上#xff08;树莓派等#xff09;编写操作UI界面时#xff0c;很多时候都需要一个软键盘来输入文字…目录
1、前言
2、界面设计
3、英文、数字的输入
4、符号的输入
5、中文的输入
6、中文拼音库的选择
7、其他
8、结语 1、前言 使用QT C在带显示器的Linux系统 开发板上树莓派等编写操作UI界面时很多时候都需要一个软键盘来输入文字、符号等在Windows系统只有少数时候需要用软键盘。这个时候使用QT自带的软键盘就可能会出现很多显示问题大小不适、显示文本乱码等等。 //QT自带的软键盘激活QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);//设置为默认键盘qputenv(QT_IM_MODULE, QByteArray(qtvirtualkeyboard)); 当然这个时候还可以查看你使用的liunx系统是否自带软键盘你可以启动这个自带的但是很多情况下还是会出现上面的问题显示乱码、大小不适。 最后我们最佳方案就是自己动手编写一个软键盘或者在网络上找一个已经实现的例程。但是我在网络上没有找到好用的软键盘例程都有很大得缺陷所以还是决定自己编写一个软键盘这样也对于所对应得项目或者开发板具有更好兼容性。
2、界面设计 这里建议先在能使用Qt Creator的系统上做好键盘得UI界面因为在这个官方得编辑编译器中有对应得UI设计工具界面这个界面能够快速的做出你需要的界面的模样并自动生成.ui文件。界面样式就按照手机输入法做一个大概的样子就行了例如我的 这里的选词我使用的label然后结合link标签使用点击时就可以取出对应的文字了你也可以使用pushbutton来替代只要最后能达到目的就行。
3、英文、数字的输入 英文、数字以及符号的输入很简单使用pushbutton在对应的按钮上添加对应的文本点击该按钮时获取该文本即可进行对应的输入操作这里按钮很多建议使用Qt中的按钮组类QButtonGroup来管理按钮我使用了两个按钮组来管理对应的输入操作 QButtonGroup *bigKey26; //26键QButtonGroup *numberKey; //数字键bigKey26 new QButtonGroup(this);//26键按钮组初始化connect(bigKey26,SIGNAL(buttonClicked(int)),this,SLOT(bigKey26Slot(int)));for (int var 1; var 26; var) {QPushButton *pushButton this-findChildQPushButton *(bigKeyboardBtn_ QString::number(var));if(pushButton ! nullptr){bigKey26-addButton(pushButton,var);}}numberKey new QButtonGroup(this);//数字键按钮组初始化connect(numberKey,SIGNAL(buttonClicked(int)),this,SLOT(numberKeySlot(int)));for (int var 0; var 9; var) {QPushButton *pushButton this-findChildQPushButton *(numberKekboard_ QString::number(var));if(pushButton ! nullptr){numberKey-addButton(pushButton,var);}}//26键功能函数这里有英文也有中文
void KeyBoardWidget::bigKey26Slot(int id)
{QString curBtnText this-findChildQPushButton *(bigKeyboardBtn_ QString::number(id))-text();if(bigKeyLanguagesFlag 0){/** ********** 英 ***********/if(bigKey26UpAndDownFlag 0){//小curBtnText curBtnText.toLower();}else if(bigKey26UpAndDownFlag 1){//大curBtnText curBtnText.toUpper();}
// this-addTextContentOfLabel(ui-label, ret1-label, curBtnText);this-curFocusWidgetInsertText(curBtnText); //在当前焦点控件光标处添加文本}else if(bigKeyLanguagesFlag 1){/** ********** 中 ***********/curBtnText curBtnText.toLower();ui-label_9-setText(ui-label_9-text() curBtnText);// dictRetList QStringList{结果1, 结果2, 结果3, 结果4, 结果5, 结果6, 结果7, 结果8, 结果9, 结果10, 结果11, 结果12};dictRetList pinyinToHanzi(ui-label_9-text());this-showDictRetListToLabel(1);}
}//数字键的功能函数
void KeyBoardWidget::numberKeySlot(int id)
{QString curBtnText this-findChildQPushButton *(numberKekboard_ QString::number(id))-text();this-curFocusWidgetInsertText(curBtnText);//在当前焦点控件光标处添加文本
}
4、符号的输入 符号按键的功能比较简单我使用的是多个信号连接一个槽的机制来管理区分按钮的方式是使用sender()来获取当前发送信号的按键。这里需要注意的是特殊符号需要使用来转义显示否则对应的按钮上不会显示故在处理时需要判断一下。
connect(ui-numberKekboardPoint, QPushButton::clicked, this, KeyBoardWidget::on_symbolBtn_clicked);for (int var 1; var 40; var) {QPushButton *curSymbolBtn this-findChildQPushButton *(symbolBtn_ QString::number(var));if(curSymbolBtn ! nullptr){connect(curSymbolBtn, QPushButton::clicked, this, KeyBoardWidget::on_symbolBtn_clicked);}}void KeyBoardWidget::on_symbolBtn_clicked()
{QPushButton *curSymbolBtn qobject_castQPushButton *(sender());if(curSymbolBtn ! nullptr){QString curSymbolStr curSymbolBtn-text();if(curSymbolStr.isEmpty()){return;}if(curSymbolStr ){curSymbolStr ;}this-curFocusWidgetInsertText(curSymbolStr);}
}
5、中文的输入 在软键盘的编写中这个是最费时间的也不是说多难难的是找到一个可使用的开源的中文拼音库很难找找了好几天才找到。找到拼音库后移植到自己的代码中进行拼音的输入这里我用了一个label来显示中文的拼音然后从这里获取如上在英文的输入中已有获取方式。 if(bigKeyLanguagesFlag 1){/** ********** 中 ***********/curBtnText curBtnText.toLower();ui-label_9-setText(ui-label_9-text() curBtnText);// dictRetList QStringList{结果1, 结果2, 结果3, 结果4, 结果5, 结果6, 结果7, 结果8, 结果9, 结果10, 结果11, 结果12};dictRetList pinyinToHanzi(ui-label_9-text());this-showDictRetListToLabel(1);}
这里我已经将拼音库的使用封装为函数pinyinToHanzi()传入拼音即可返回对应的汉字列表。获取到汉字列表后使用showDictRetListToLabel()函数来更新显示这个函数将列表以5为单位分页传入的数字即显示的页码。前面说过我的结果显示在label中的所以使用link事件来获取对应的文字和事件设置链接函数如下
void KeyBoardWidget::setTextContentOfLabel(QLabel *label, QString linkStr, QString text)
{label-setText(QString(a href %1 style\text-decoration: none;\ style\color: white;\%2/a).arg(linkStr).arg(text));
}
6、中文拼音库的选择 这里可以选择libpinyin或者googlepinyin前者在Linux系统上使用很方便直接使用apt下载即可后者需要下载源码自行进行引用。注意的是libpinyin在Windows系统上使用起来很麻烦建议使用googlepinyin。
libpinyin下载方式
Ubuntu/Debian:
sudo apt-get install libpinyin-dev
Fedora:
sudo dnf install libpinyin-devel源码下载https://github.com/libpinyin/libpinyin
googlepinyin下载
https://github.com/aron566/google_pinyinim
下载完成后他们在github中都有使用示例 照着用就可以不需要额外的什么但是要注意词库的路径要正确。
7、其他
再补充几个关键点
//防止当前窗口获取焦点导致输入控件丢失
this-setWindowFlags(this-windowFlags() | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint | Qt::Tool | Qt::WindowDoesNotAcceptFocus);
//获取当前焦点在哪个控件
curFocusWidget QApplication::focusWidget();
//判断焦点控件是否是QLineEdit 类型
if (QLineEdit *lineEdit qobject_castQLineEdit *(curFocusWidget)) {curText lineEdit-text();
}
//清除当前焦点关闭键盘的时候会用到
if(curFocusWidget ! nullptr){curFocusWidget-setFocusPolicy(Qt::ClickFocus);curFocusWidget-clearFocus();curFocusWidget nullptr;
}
//多label链接一个link事件槽
connect(curlabel, QLabel::linkActivated, this, KeyBoardWidget::on_label_1_linkActivated);
//使用libpinyin获取的结果格式const char *word
retList.append(QString(word));
//使用googlepinyin获取的结果格式ime_pinyin::char16 buf[256]
retList.append(QString::fromUtf16(buf));
8、结语 关于其他的布局或功能实现、结果获取后放入目标控件等等就不过多赘述了还有问题请留言最后放一张我的效果图片