1. 程式人生 > >Qt入門之syszuxpinyin輸入法應該的小知識

Qt入門之syszuxpinyin輸入法應該的小知識

移植好的syszuxpinyin輸入法能正常的檢測到控制元件焦點並自動彈出軟鍵盤

當使用預設的QLineEdit控制元件時就有了一些小小的問題:

問題一:QLineEditt在預設情況下會自動出現焦點,從而導致一進入介面就彈出軟鍵盤

但是我們需要點選一下控制元件它才彈出軟鍵盤

解決方法:設定QLineEdit的屬性為setFocusPolicy(Qt::StrongFocus) 或者是 setFocusPolicy(Qt::ClickFocus);

這是幫助文件裡的一段說明:

The policy is Qt::TabFocus if the widget accepts keyboard focus by tabbing,

Qt::ClickFocus if the widget accepts focus by clicking,

  Qt::StrongFocus if it accepts both, and Qt::NoFocus (the default) if it does not accept focus at all

問題二:在預設情況下能輸入完了以後沒有點其他控制元件而再次輸入,簡單點就是說點第一次的時候可以彈出,第二次的時候不能

原因是控制元件無法重新獲得焦點,只有當它失去焦點的時候才能重新獲得焦點,所以你必須先點其他控制元件讓它失去焦點,然後再點它

重新獲得焦點.在板子上試驗過就知道

解決方法:子類化QLineEdit

.h檔案

#ifndef     _QLINEEDITIM_H
#define     _QLINEEDITIM_H

#include <QLineEdit>
#include <QMouseEvent>

class QLineEditIM : public QLineEdit
{
    Q_OBJECT

    public:
            explicit QLineEditIM(QWidget *parent = 0);

    protected:
            virtual void mousePressEvent(QMouseEvent *event);

    signals:
            void clicked();

    public slots:
            void showInputMethod();

};

#endif //_QLINEEDITIM_H
.cpp檔案
#include "syszuxim.h"
#include "syszuxpinyin.h"
#include "qlineeditIM.h"

QLineEditIM::QLineEditIM(QWidget *parent):
    QLineEdit(parent)

{

    QWSInputMethod *im = new SyszuxIM;
    QWSServer::setCurrentInputMethod(im);

    connect(this, SIGNAL(clicked()), this, SLOT(showInputMethod()));
}

void QLineEditIM::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton)
    {
        emit clicked();
    }

    QLineEdit::mousePressEvent(event);
}


/*
* name : void showInputMethod()
* Type : QEvent
* Func : show inputthmod
* in   : Null
* out  : Null
*/

void QLineEditIM::showInputMethod()
{
    clearFocus();
    setFocus();

}