wordpress商城建站教程創(chuàng)建網(wǎng)站要錢嗎
目錄
1、前言
2、界面設(shè)計
3、英文、數(shù)字的輸入
4、符號的輸入
5、中文的輸入
6、中文拼音庫的選擇
7、其他
8、結(jié)語
1、前言
????????使用QT C++在帶顯示器的Linux系統(tǒng)?開發(fā)板上(樹莓派等)編寫操作UI界面時,很多時候都需要一個軟鍵盤來輸入文字、符號等(在Windows系統(tǒng)只有少數(shù)時候需要用軟鍵盤)。這個時候使用QT自帶的軟鍵盤就可能會出現(xiàn)很多顯示問題,大小不適、顯示文本亂碼等等。
//QT自帶的軟鍵盤激活QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);//設(shè)置為默認鍵盤qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard"));
? ? ? ? 當然,這個時候還可以查看你使用的liunx系統(tǒng)是否自帶軟鍵盤,你可以啟動這個自帶的,但是很多情況下還是會出現(xiàn)上面的問題:顯示亂碼、大小不適。
? ? ? ? 最后,我們最佳方案就是自己動手編寫一個軟鍵盤,或者在網(wǎng)絡(luò)上找一個已經(jīng)實現(xiàn)的例程。但是我在網(wǎng)絡(luò)上沒有找到好用的軟鍵盤例程,都有很大得缺陷,所以還是決定自己編寫一個軟鍵盤,這樣也對于所對應(yīng)得項目或者開發(fā)板具有更好兼容性。
2、界面設(shè)計
? ? ? ? 這里建議先在能使用Qt?Creator的系統(tǒng)上做好鍵盤得UI界面,因為在這個官方得編輯編譯器中,有對應(yīng)得UI設(shè)計工具界面,這個界面能夠快速的做出你需要的界面的模樣,并自動生成.ui文件。界面樣式就按照手機輸入法做一個大概的樣子就行了,例如我的:
這里的選詞我使用的label,然后結(jié)合link標簽使用,點擊時就可以取出對應(yīng)的文字了,你也可以使用pushbutton來替代,只要最后能達到目的就行。
3、英文、數(shù)字的輸入
? ? ? ? 英文、數(shù)字以及符號的輸入很簡單,使用pushbutton,在對應(yīng)的按鈕上添加對應(yīng)的文本,點擊該按鈕時獲取該文本即可進行對應(yīng)的輸入操作,這里按鈕很多建議使用Qt中的按鈕組類(QButtonGroup)來管理按鈕,我使用了兩個按鈕組來管理對應(yīng)的輸入操作:
QButtonGroup *bigKey26; //26鍵QButtonGroup *numberKey; //數(shù)字鍵bigKey26 = new QButtonGroup(this);//26鍵按鈕組初始化connect(bigKey26,SIGNAL(buttonClicked(int)),this,SLOT(bigKey26Slot(int)));for (int var = 1; var <= 26; ++var) {QPushButton *pushButton = this->findChild<QPushButton *>("bigKeyboardBtn_" + QString::number(var));if(pushButton != nullptr){bigKey26->addButton(pushButton,var);}}numberKey = new QButtonGroup(this);//數(shù)字鍵按鈕組初始化connect(numberKey,SIGNAL(buttonClicked(int)),this,SLOT(numberKeySlot(int)));for (int var = 0; var <= 9; ++var) {QPushButton *pushButton = this->findChild<QPushButton *>("numberKekboard_" + QString::number(var));if(pushButton != nullptr){numberKey->addButton(pushButton,var);}}//26鍵功能函數(shù),這里有英文,也有中文
void KeyBoardWidget::bigKey26Slot(int id)
{QString curBtnText = this->findChild<QPushButton *>("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{"結(jié)果1", "結(jié)果2", "結(jié)果3", "結(jié)果4", "結(jié)果5", "結(jié)果6", "結(jié)果7", "結(jié)果8", "結(jié)果9", "結(jié)果10", "結(jié)果11", "結(jié)果12"};dictRetList = pinyinToHanzi(ui->label_9->text());this->showDictRetListToLabel(1);}
}//數(shù)字鍵的功能函數(shù)
void KeyBoardWidget::numberKeySlot(int id)
{QString curBtnText = this->findChild<QPushButton *>("numberKekboard_" + QString::number(id))->text();this->curFocusWidgetInsertText(curBtnText);//在當前焦點控件光標處添加文本
}
4、符號的輸入
????????符號按鍵的功能比較簡單,我使用的是多個信號連接一個槽的機制來管理,區(qū)分按鈕的方式是使用sender()來獲取當前發(fā)送信號的按鍵。這里需要注意的是特殊符號&需要使用&&來轉(zhuǎn)義顯示,否則對應(yīng)的按鈕上不會顯示,故在處理時需要判斷一下。
connect(ui->numberKekboardPoint, &QPushButton::clicked, this, &KeyBoardWidget::on_symbolBtn_clicked);for (int var = 1; var <= 40; ++var) {QPushButton *curSymbolBtn = this->findChild<QPushButton *>("symbolBtn_" + QString::number(var));if(curSymbolBtn != nullptr){connect(curSymbolBtn, &QPushButton::clicked, this, &KeyBoardWidget::on_symbolBtn_clicked);}}void KeyBoardWidget::on_symbolBtn_clicked()
{QPushButton *curSymbolBtn = qobject_cast<QPushButton *>(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{"結(jié)果1", "結(jié)果2", "結(jié)果3", "結(jié)果4", "結(jié)果5", "結(jié)果6", "結(jié)果7", "結(jié)果8", "結(jié)果9", "結(jié)果10", "結(jié)果11", "結(jié)果12"};dictRetList = pinyinToHanzi(ui->label_9->text());this->showDictRetListToLabel(1);}
這里我已經(jīng)將拼音庫的使用封裝為函數(shù)pinyinToHanzi(),傳入拼音即可返回對應(yīng)的漢字列表。獲取到漢字列表后,使用showDictRetListToLabel()函數(shù)來更新顯示,這個函數(shù)將列表以5為單位分頁,傳入的數(shù)字即顯示的頁碼。前面說過,我的結(jié)果顯示在label中的,所以使用link事件來獲取對應(yīng)的文字和事件,設(shè)置鏈接函數(shù)如下:
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系統(tǒng)上使用很方便,直接使用apt下載即可,后者需要下載源碼自行進行引用。注意的是libpinyin在Windows系統(tǒng)上使用起來很麻煩,建議使用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、其他
再補充幾個關(guān)鍵點:
//防止當前窗口獲取焦點,導(dǎo)致輸入控件丟失
this->setWindowFlags(this->windowFlags() | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint | Qt::Tool | Qt::WindowDoesNotAcceptFocus);
//獲取當前焦點在哪個控件
curFocusWidget = QApplication::focusWidget();
//判斷焦點控件是否是QLineEdit 類型
if (QLineEdit *lineEdit = qobject_cast<QLineEdit *>(curFocusWidget)) {curText = lineEdit->text();
}
//清除當前焦點,關(guān)閉鍵盤的時候會用到
if(curFocusWidget != nullptr){curFocusWidget->setFocusPolicy(Qt::ClickFocus);curFocusWidget->clearFocus();curFocusWidget = nullptr;
}
//多l(xiāng)abel鏈接一個link事件槽
connect(curlabel, &QLabel::linkActivated, this, &KeyBoardWidget::on_label_1_linkActivated);
//使用libpinyin獲取的結(jié)果格式const char *word
retList.append(QString(word));
//使用googlepinyin獲取的結(jié)果格式ime_pinyin::char16 buf[256]
retList.append(QString::fromUtf16(buf));
8、結(jié)語
? ? ? ? 關(guān)于其他的布局或功能實現(xiàn)、結(jié)果獲取后放入目標控件等等,就不過多贅述了,還有問題請留言,最后放一張我的效果圖片: