解决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负责把所填写的内容给清零。

你可能感兴趣的:(解决syszuxpinyin重复点击lineEdit无法弹出输入法界面和无法删除原有内容问题)