解決syszuxpinyin重複點選lineEdit無法彈出輸入法介面和無法刪除原有內容問題
解決方法均來源於論壇,自己把它給整理一下
1,因為自己做的介面用到了lineedit,但是發現第一次點選lineedit獲得焦點就可以彈出輸入法介面,但是再重複點選的時候就不能彈出來了,必須重新獲得焦點,於是通過過載過載了QLineEdit的mousePressEvent
在mousePressEvent加上一個自定義的訊號 emit clicked()
過載程式碼如下:
mylineedit.h
#ifndef MYLINEEDIT_H
#define MYLINEEDIT_H
#include <QLineEdit>
#include <QMouseEvent>
class mylineedit : public QLineEdit
{
Q_OBJECT
public:
explicit mylineedit(QWidget *parent = 0);
protected:
virtual void mousePressEvent(QMouseEvent *event);
signals:
void clicked();
public slots:
};
#endif // MYLINEEDIT_H
mylineedit.cpp
#include "mylineedit.h"
mylineedit::mylineedit(QWidget *parent) :
QLineEdit(parent)
{
}
void mylineedit::mousePressEvent(QMouseEvent *event) {
if (event->button() == Qt::LeftButton) {
emit clicked();
}
QLineEdit::mousePressEvent(event);
}
然後再在creator中把lineedit提升為mylineedit,這樣就跟按鈕一樣了,只要點選編輯框就
clearFocus()
setFocus()
槽函式如下:
void query::le_device_mf_clicked()
{
ui->lineEdit_device_Mf->clearFocus();
ui->lineEdit_device_Mf->setFocus();
}
然後再用connect把訊號和槽函式連線起來就好了,這樣就解決了連續輸入不能彈出輸入法的問題。
2,另外發現輸入法不能刪除已經編輯的內容,也就是隻能往lineedit裡面新增內容不能刪除已經新增過的內容。這個比較鬱悶,後來找到解決方法,但是隻能適用於lineedit控制元件。
方法如下:
首先在syszuxim.h檔案中的class SyszuxIM類中宣告一個指標物件QLineEdit *le。
然後在syszuxim.cpp檔案中的建構函式中新增 le = new QLineEdit; //added by me,在 void SyszuxIM::updateHandler(int type)函式中的
case QWSInputMethod::FocusIn:後新增程式碼
{
QWidget *current_focus_widget=new QWidget; //added by me
current_focus_widget = QApplication::focusWidget(); //added by me
le= qobject_cast<QLineEdit*>(current_focus_widget); //added by me
syszuxpinyin->show();
syszuxpinyin->lineEdit_window->setText(le->text()); //added by me
break;
} 注意要加上大括號。
將 void SyszuxIM::confirmString(QString gemfield) 函式裡面的 sendCommitString(gemfield); 註釋掉,新增 le->setText(gemfield);
儲存後進行編譯,即可生效。
注意這種方法只對QLineEdit控制元件有效,如果是其他控制元件,當焦點置於其他控制元件時會導致程式發生錯誤退出。這裡我就比較悲劇了,因為我還有用到tableview顯示資料庫中的資料,於是這樣設定了後,一點tableview程式就死掉了。於是這種方法不能用,只能再新增一個按鈕clear負責把所填寫的內容給清零。