1. 程式人生 > >解決syszuxpinyin重複點選lineEdit無法彈出輸入法介面和無法刪除原有內容問題

解決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負責把所填寫的內容給清零。